From a902979f7c6a39fbdd8e9fc1b2ce00553b655eeb Mon Sep 17 00:00:00 2001 From: Bo Xu Date: Fri, 9 Jan 2015 17:27:21 -0800 Subject: Organize barcode codes into modules. Previously all the files in barcode are lumped together. The naming of some files are inconsistent, leading to difficult understanding of the structure. Now files are grouped based on different barcode type like in zxing. This also matches what it looks like in other xfa folders. The file names in each folder could be further modified to be consistent. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/842043002 --- xfa/src/fxbarcode/BC_BarCode.cpp | 873 ++++++++++++++++++++ xfa/src/fxbarcode/BC_Binarizer.cpp | 38 + xfa/src/fxbarcode/BC_Binarizer.h | 24 + xfa/src/fxbarcode/BC_BinaryBitmap.cpp | 76 ++ xfa/src/fxbarcode/BC_BinaryBitmap.h | 29 + .../fxbarcode/BC_BufferedImageLuminanceSource.cpp | 204 +++++ .../fxbarcode/BC_BufferedImageLuminanceSource.h | 33 + xfa/src/fxbarcode/BC_DecoderResult.h | 32 + xfa/src/fxbarcode/BC_Dimension.cpp | 55 ++ xfa/src/fxbarcode/BC_Dimension.h | 24 + xfa/src/fxbarcode/BC_Library.cpp | 123 +++ xfa/src/fxbarcode/BC_LuminanceSource.cpp | 38 + xfa/src/fxbarcode/BC_LuminanceSource.h | 34 + xfa/src/fxbarcode/BC_Reader.cpp | 14 + xfa/src/fxbarcode/BC_Reader.h | 19 + xfa/src/fxbarcode/BC_ResultPoint.cpp | 35 + xfa/src/fxbarcode/BC_ResultPoint.h | 24 + xfa/src/fxbarcode/BC_TwoDimWriter.cpp | 137 ++++ xfa/src/fxbarcode/BC_TwoDimWriter.h | 44 ++ xfa/src/fxbarcode/BC_UtilCodingConvert.cpp | 49 ++ xfa/src/fxbarcode/BC_UtilCodingConvert.h | 22 + xfa/src/fxbarcode/BC_UtilRSS.cpp | 164 ++++ xfa/src/fxbarcode/BC_UtilRSS.h | 23 + xfa/src/fxbarcode/BC_Utils.cpp | 46 ++ xfa/src/fxbarcode/BC_Writer.cpp | 70 ++ xfa/src/fxbarcode/BC_Writer.h | 35 + xfa/src/fxbarcode/barcode.h | 8 + xfa/src/fxbarcode/common/BC_CommonBitArray.cpp | 124 +++ xfa/src/fxbarcode/common/BC_CommonBitArray.h | 32 + xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp | 161 ++++ xfa/src/fxbarcode/common/BC_CommonBitMatrix.h | 38 + xfa/src/fxbarcode/common/BC_CommonBitSource.cpp | 76 ++ xfa/src/fxbarcode/common/BC_CommonBitSource.h | 23 + xfa/src/fxbarcode/common/BC_CommonByteArray.cpp | 114 +++ xfa/src/fxbarcode/common/BC_CommonByteArray.h | 30 + xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp | 76 ++ xfa/src/fxbarcode/common/BC_CommonByteMatrix.h | 29 + .../fxbarcode/common/BC_CommonCharacterSetECI.cpp | 50 ++ .../fxbarcode/common/BC_CommonCharacterSetECI.h | 25 + .../fxbarcode/common/BC_CommonDecoderResult.cpp | 79 ++ xfa/src/fxbarcode/common/BC_CommonDecoderResult.h | 33 + xfa/src/fxbarcode/common/BC_CommonECI.cpp | 46 ++ xfa/src/fxbarcode/common/BC_CommonECI.h | 21 + .../common/BC_CommonPerspectiveTransform.cpp | 125 +++ .../common/BC_CommonPerspectiveTransform.h | 39 + .../common/BC_GlobalHistogramBinarizer.cpp | 169 ++++ .../fxbarcode/common/BC_GlobalHistogramBinarizer.h | 28 + .../fxbarcode/common/BC_WhiteRectangleDetector.cpp | 244 ++++++ .../fxbarcode/common/BC_WhiteRectangleDetector.h | 38 + .../common/reedsolomon/BC_ReedSolomon.cpp | 100 +++ .../fxbarcode/common/reedsolomon/BC_ReedSolomon.h | 25 + .../common/reedsolomon/BC_ReedSolomonDecoder.cpp | 224 ++++++ .../common/reedsolomon/BC_ReedSolomonDecoder.h | 24 + .../common/reedsolomon/BC_ReedSolomonGF256.cpp | 140 ++++ .../common/reedsolomon/BC_ReedSolomonGF256.h | 35 + .../common/reedsolomon/BC_ReedSolomonGF256Poly.cpp | 257 ++++++ .../common/reedsolomon/BC_ReedSolomonGF256Poly.h | 33 + xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp | 99 +++ xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h | 22 + xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp | 95 +++ xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h | 21 + xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp | 198 +++++ xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h | 24 + .../datamatrix/BC_DataMatrixBitMatrixParser.cpp | 366 +++++++++ .../datamatrix/BC_DataMatrixBitMatrixParser.h | 33 + .../datamatrix/BC_DataMatrixDataBlock.cpp | 99 +++ .../fxbarcode/datamatrix/BC_DataMatrixDataBlock.h | 26 + .../BC_DataMatrixDecodedBitStreamParser.cpp | 472 +++++++++++ .../BC_DataMatrixDecodedBitStreamParser.h | 43 + .../fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp | 110 +++ .../fxbarcode/datamatrix/BC_DataMatrixDecoder.h | 24 + .../fxbarcode/datamatrix/BC_DataMatrixDetector.cpp | 368 +++++++++ .../fxbarcode/datamatrix/BC_DataMatrixDetector.h | 78 ++ .../fxbarcode/datamatrix/BC_DataMatrixReader.cpp | 67 ++ xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h | 25 + .../datamatrix/BC_DataMatrixSymbolInfo144.cpp | 43 + .../datamatrix/BC_DataMatrixSymbolInfo144.h | 19 + .../fxbarcode/datamatrix/BC_DataMatrixVersion.cpp | 147 ++++ .../fxbarcode/datamatrix/BC_DataMatrixVersion.h | 101 +++ .../fxbarcode/datamatrix/BC_DataMatrixWriter.cpp | 138 ++++ xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h | 30 + .../fxbarcode/datamatrix/BC_DefaultPlacement.cpp | 174 ++++ xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h | 35 + xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp | 153 ++++ xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h | 23 + xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp | 14 + xfa/src/fxbarcode/datamatrix/BC_Encoder.h | 19 + xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp | 127 +++ xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h | 48 ++ .../fxbarcode/datamatrix/BC_ErrorCorrection.cpp | 194 +++++ xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h | 29 + .../fxbarcode/datamatrix/BC_HighLevelEncoder.cpp | 368 +++++++++ xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h | 60 ++ xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp | 242 ++++++ xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h | 53 ++ .../fxbarcode/datamatrix/BC_SymbolShapeHint.cpp | 30 + xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h | 21 + xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp | 102 +++ xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h | 18 + xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp | 104 +++ xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h | 21 + xfa/src/fxbarcode/oned/BC_OneDReader.cpp | 179 +++++ xfa/src/fxbarcode/oned/BC_OneDReader.h | 34 + xfa/src/fxbarcode/oned/BC_OneDimReader.cpp | 235 ++++++ xfa/src/fxbarcode/oned/BC_OneDimReader.h | 39 + xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp | 415 ++++++++++ xfa/src/fxbarcode/oned/BC_OneDimWriter.h | 70 ++ xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp | 206 +++++ xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h | 30 + xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp | 222 ++++++ xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h | 38 + xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp | 430 ++++++++++ xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h | 40 + xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp | 230 ++++++ xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h | 37 + xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp | 293 +++++++ xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h | 32 + xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp | 351 +++++++++ xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h | 37 + xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp | 94 +++ xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h | 24 + xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp | 294 +++++++ xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h | 31 + xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp | 81 ++ xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h | 20 + xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp | 261 ++++++ xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h | 32 + xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp | 93 +++ xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h | 30 + xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp | 285 +++++++ xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h | 31 + xfa/src/fxbarcode/pdf417/BC_PDF417.cpp | 692 ++++++++++++++++ xfa/src/fxbarcode/pdf417/BC_PDF417.h | 45 ++ .../fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp | 98 +++ xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h | 35 + .../fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp | 55 ++ .../fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h | 27 + xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp | 60 ++ xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h | 25 + xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp | 68 ++ xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h | 22 + xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp | 194 +++++ xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h | 43 + xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp | 80 ++ xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h | 34 + .../fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp | 118 +++ .../fxbarcode/pdf417/BC_PDF417CodewordDecoder.h | 27 + xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp | 450 +++++++++++ xfa/src/fxbarcode/pdf417/BC_PDF417Common.h | 31 + xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp | 30 + xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h | 22 + .../pdf417/BC_PDF417DecodedBitStreamParser.cpp | 485 ++++++++++++ .../pdf417/BC_PDF417DecodedBitStreamParser.h | 48 ++ .../fxbarcode/pdf417/BC_PDF417DetectionResult.cpp | 283 +++++++ .../fxbarcode/pdf417/BC_PDF417DetectionResult.h | 48 ++ .../pdf417/BC_PDF417DetectionResultColumn.cpp | 107 +++ .../pdf417/BC_PDF417DetectionResultColumn.h | 31 + .../BC_PDF417DetectionResultRowIndicatorColumn.cpp | 241 ++++++ .../BC_PDF417DetectionResultRowIndicatorColumn.h | 28 + xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp | 311 ++++++++ xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h | 43 + .../fxbarcode/pdf417/BC_PDF417DetectorResult.cpp | 53 ++ xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h | 22 + xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp | 51 ++ xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h | 25 + .../pdf417/BC_PDF417ECErrorCorrection.cpp | 369 +++++++++ .../fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h | 26 + xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp | 126 +++ xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h | 37 + .../fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp | 316 ++++++++ xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h | 34 + .../fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp | 193 +++++ .../fxbarcode/pdf417/BC_PDF417ErrorCorrection.h | 21 + .../fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp | 420 ++++++++++ .../fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h | 54 ++ .../pdf417/BC_PDF417HighLevelEncoder_unittest.cpp | 221 ++++++ xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp | 119 +++ xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h | 26 + .../fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp | 62 ++ xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h | 29 + .../fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp | 596 ++++++++++++++ .../fxbarcode/pdf417/BC_PDF417ScanningDecoder.h | 61 ++ xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp | 126 +++ xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h | 26 + xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp | 48 ++ xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h | 24 + xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp | 52 ++ xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h | 24 + .../qrcode/BC_QRAlignmentPatternFinder.cpp | 187 +++++ .../fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h | 32 + xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp | 185 +++++ xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h | 31 + xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp | 111 +++ xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h | 35 + xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp | 103 +++ xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h | 28 + xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp | 168 ++++ xfa/src/fxbarcode/qrcode/BC_QRCoder.h | 55 ++ xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp | 141 ++++ xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h | 32 + xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp | 49 ++ xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h | 23 + xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp | 128 +++ xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h | 29 + xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp | 40 + xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h | 21 + xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp | 65 ++ xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h | 25 + xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp | 876 +++++++++++++++++++++ xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h | 60 ++ .../qrcode/BC_QRCoderErrorCorrectionLevel.cpp | 97 +++ .../qrcode/BC_QRCoderErrorCorrectionLevel.h | 32 + .../qrcode/BC_QRCoderFormatInformation.cpp | 119 +++ .../fxbarcode/qrcode/BC_QRCoderFormatInformation.h | 29 + xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp | 208 +++++ xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h | 24 + xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp | 490 ++++++++++++ xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h | 50 ++ xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp | 178 +++++ xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h | 40 + xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp | 777 ++++++++++++++++++ xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h | 42 + xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp | 104 +++ xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h | 27 + xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp | 149 ++++ xfa/src/fxbarcode/qrcode/BC_QRDataMask.h | 25 + .../qrcode/BC_QRDecodedBitStreamParser.cpp | 254 ++++++ .../fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h | 35 + xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp | 264 +++++++ xfa/src/fxbarcode/qrcode/BC_QRDetector.h | 41 + xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp | 51 ++ xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h | 23 + xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp | 71 ++ xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h | 29 + .../fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp | 451 +++++++++++ .../fxbarcode/qrcode/BC_QRFinderPatternFinder.h | 45 ++ xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp | 128 +++ xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h | 33 + xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp | 99 --- xfa/src/fxbarcode/src/BC_BarCode.cpp | 872 -------------------- xfa/src/fxbarcode/src/BC_Base256Encoder.cpp | 95 --- xfa/src/fxbarcode/src/BC_Binarizer.cpp | 38 - xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp | 76 -- .../src/BC_BufferedImageLuminanceSource.cpp | 204 ----- xfa/src/fxbarcode/src/BC_C40Encoder.cpp | 198 ----- xfa/src/fxbarcode/src/BC_CommonBitArray.cpp | 124 --- xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp | 161 ---- xfa/src/fxbarcode/src/BC_CommonBitSource.cpp | 76 -- xfa/src/fxbarcode/src/BC_CommonByteArray.cpp | 114 --- xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp | 76 -- xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp | 50 -- xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp | 79 -- xfa/src/fxbarcode/src/BC_CommonECI.cpp | 46 -- .../src/BC_CommonPerspectiveTransform.cpp | 125 --- .../fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp | 366 --------- xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp | 99 --- .../src/BC_DataMatrixDecodedBitStreamParser.cpp | 472 ----------- xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp | 110 --- xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp | 368 --------- xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp | 67 -- .../fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp | 43 - xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp | 147 ---- xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp | 138 ---- xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp | 174 ---- xfa/src/fxbarcode/src/BC_Dimension.cpp | 55 -- xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp | 153 ---- xfa/src/fxbarcode/src/BC_Encoder.cpp | 14 - xfa/src/fxbarcode/src/BC_EncoderContext.cpp | 127 --- xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp | 194 ----- xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp | 48 -- .../fxbarcode/src/BC_GlobalHistogramBinarizer.cpp | 169 ---- xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp | 368 --------- xfa/src/fxbarcode/src/BC_Library.cpp | 122 --- xfa/src/fxbarcode/src/BC_LuminanceSource.cpp | 38 - xfa/src/fxbarcode/src/BC_OneDReader.cpp | 179 ----- xfa/src/fxbarcode/src/BC_OneDimReader.cpp | 235 ------ xfa/src/fxbarcode/src/BC_OneDimWriter.cpp | 415 ---------- xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp | 206 ----- xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp | 222 ------ xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp | 430 ---------- xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp | 230 ------ xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp | 293 ------- xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp | 351 --------- xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp | 94 --- xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp | 294 ------- xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp | 81 -- xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp | 261 ------ xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp | 93 --- xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp | 285 ------- xfa/src/fxbarcode/src/BC_PDF417.cpp | 692 ---------------- xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp | 98 --- xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp | 55 -- xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp | 60 -- xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp | 68 -- xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp | 194 ----- xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp | 80 -- xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp | 118 --- xfa/src/fxbarcode/src/BC_PDF417Common.cpp | 450 ----------- xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp | 30 - .../src/BC_PDF417DecodedBitStreamParser.cpp | 485 ------------ xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp | 283 ------- .../src/BC_PDF417DetectionResultColumn.cpp | 107 --- .../BC_PDF417DetectionResultRowIndicatorColumn.cpp | 241 ------ xfa/src/fxbarcode/src/BC_PDF417Detector.cpp | 311 -------- xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp | 53 -- xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp | 51 -- .../fxbarcode/src/BC_PDF417ECErrorCorrection.cpp | 369 --------- xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp | 126 --- xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp | 316 -------- xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp | 193 ----- .../fxbarcode/src/BC_PDF417HighLevelEncoder.cpp | 420 ---------- .../src/BC_PDF417HighLevelEncoder_unittest.cpp | 221 ------ xfa/src/fxbarcode/src/BC_PDF417Reader.cpp | 119 --- xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp | 62 -- xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp | 596 -------------- xfa/src/fxbarcode/src/BC_PDF417Writer.cpp | 126 --- xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp | 52 -- .../fxbarcode/src/BC_QRAlignmentPatternFinder.cpp | 187 ----- xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp | 185 ----- xfa/src/fxbarcode/src/BC_QRCodeReader.cpp | 111 --- xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp | 103 --- xfa/src/fxbarcode/src/BC_QRCoder.cpp | 168 ---- xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp | 141 ---- xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp | 49 -- xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp | 128 --- xfa/src/fxbarcode/src/BC_QRCoderECB.cpp | 40 - xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp | 65 -- xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp | 876 --------------------- .../src/BC_QRCoderErrorCorrectionLevel.cpp | 97 --- .../fxbarcode/src/BC_QRCoderFormatInformation.cpp | 119 --- xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp | 208 ----- xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp | 490 ------------ xfa/src/fxbarcode/src/BC_QRCoderMode.cpp | 178 ----- xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp | 777 ------------------ xfa/src/fxbarcode/src/BC_QRDataBlock.cpp | 104 --- xfa/src/fxbarcode/src/BC_QRDataMask.cpp | 149 ---- .../fxbarcode/src/BC_QRDecodedBitStreamParser.cpp | 254 ------ xfa/src/fxbarcode/src/BC_QRDetector.cpp | 264 ------- xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp | 51 -- xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp | 71 -- xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp | 451 ----------- xfa/src/fxbarcode/src/BC_QRGridSampler.cpp | 128 --- xfa/src/fxbarcode/src/BC_Reader.cpp | 14 - xfa/src/fxbarcode/src/BC_ReedSolomon.cpp | 100 --- xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp | 224 ------ xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp | 140 ---- xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp | 257 ------ xfa/src/fxbarcode/src/BC_ResultPoint.cpp | 35 - xfa/src/fxbarcode/src/BC_SymbolInfo.cpp | 242 ------ xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp | 30 - xfa/src/fxbarcode/src/BC_TextEncoder.cpp | 102 --- xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp | 137 ---- xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp | 49 -- xfa/src/fxbarcode/src/BC_UtilRSS.cpp | 164 ---- xfa/src/fxbarcode/src/BC_Utils.cpp | 46 -- .../fxbarcode/src/BC_WhiteRectangleDetector.cpp | 244 ------ xfa/src/fxbarcode/src/BC_Writer.cpp | 70 -- xfa/src/fxbarcode/src/BC_X12Encoder.cpp | 104 --- xfa/src/fxbarcode/src/barcode.h | 8 - xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h | 22 - xfa/src/fxbarcode/src/include/BC_Base256Encoder.h | 21 - xfa/src/fxbarcode/src/include/BC_Binarizer.h | 24 - xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h | 29 - .../src/include/BC_BufferedImageLuminanceSource.h | 33 - xfa/src/fxbarcode/src/include/BC_C40Encoder.h | 24 - xfa/src/fxbarcode/src/include/BC_CommonBitArray.h | 32 - xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h | 38 - xfa/src/fxbarcode/src/include/BC_CommonBitSource.h | 23 - xfa/src/fxbarcode/src/include/BC_CommonByteArray.h | 30 - .../fxbarcode/src/include/BC_CommonByteMatrix.h | 29 - .../src/include/BC_CommonCharacterSetECI.h | 25 - .../fxbarcode/src/include/BC_CommonDecoderResult.h | 33 - xfa/src/fxbarcode/src/include/BC_CommonECI.h | 21 - .../src/include/BC_CommonPerspectiveTransform.h | 39 - .../src/include/BC_DataMatrixBitMatrixParser.h | 33 - .../fxbarcode/src/include/BC_DataMatrixDataBlock.h | 26 - .../include/BC_DataMatrixDecodedBitStreamParser.h | 43 - .../fxbarcode/src/include/BC_DataMatrixDecoder.h | 24 - .../fxbarcode/src/include/BC_DataMatrixDetector.h | 78 -- .../fxbarcode/src/include/BC_DataMatrixReader.h | 25 - .../src/include/BC_DataMatrixSymbolInfo144.h | 19 - .../fxbarcode/src/include/BC_DataMatrixVersion.h | 101 --- .../fxbarcode/src/include/BC_DataMatrixWriter.h | 30 - xfa/src/fxbarcode/src/include/BC_DecoderResult.h | 32 - .../fxbarcode/src/include/BC_DefaultPlacement.h | 35 - xfa/src/fxbarcode/src/include/BC_Dimension.h | 24 - xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h | 23 - xfa/src/fxbarcode/src/include/BC_Encoder.h | 19 - xfa/src/fxbarcode/src/include/BC_EncoderContext.h | 48 -- xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h | 29 - .../fxbarcode/src/include/BC_FinderPatternInfo.h | 24 - .../src/include/BC_GlobalHistogramBinarizer.h | 28 - .../fxbarcode/src/include/BC_HighLevelEncoder.h | 60 -- xfa/src/fxbarcode/src/include/BC_LuminanceSource.h | 34 - xfa/src/fxbarcode/src/include/BC_OneDReader.h | 34 - xfa/src/fxbarcode/src/include/BC_OneDimReader.h | 39 - xfa/src/fxbarcode/src/include/BC_OneDimWriter.h | 70 -- .../fxbarcode/src/include/BC_OnedCodaBarReader.h | 30 - .../fxbarcode/src/include/BC_OnedCodaBarWriter.h | 38 - .../fxbarcode/src/include/BC_OnedCode128Reader.h | 40 - .../fxbarcode/src/include/BC_OnedCode128Writer.h | 37 - .../fxbarcode/src/include/BC_OnedCode39Reader.h | 32 - .../fxbarcode/src/include/BC_OnedCode39Writer.h | 37 - xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h | 24 - xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h | 31 - xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h | 20 - xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h | 32 - xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h | 30 - xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h | 31 - xfa/src/fxbarcode/src/include/BC_PDF417.h | 45 -- .../fxbarcode/src/include/BC_PDF417BarcodeMatrix.h | 35 - .../src/include/BC_PDF417BarcodeMetadata.h | 27 - .../fxbarcode/src/include/BC_PDF417BarcodeRow.h | 25 - .../fxbarcode/src/include/BC_PDF417BarcodeValue.h | 22 - .../fxbarcode/src/include/BC_PDF417BoundingBox.h | 43 - xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h | 34 - .../src/include/BC_PDF417CodewordDecoder.h | 27 - xfa/src/fxbarcode/src/include/BC_PDF417Common.h | 31 - .../fxbarcode/src/include/BC_PDF417Compaction.h | 22 - .../src/include/BC_PDF417DecodedBitStreamParser.h | 48 -- .../src/include/BC_PDF417DetectionResult.h | 48 -- .../src/include/BC_PDF417DetectionResultColumn.h | 31 - .../BC_PDF417DetectionResultRowIndicatorColumn.h | 28 - xfa/src/fxbarcode/src/include/BC_PDF417Detector.h | 43 - .../src/include/BC_PDF417DetectorResult.h | 22 - .../fxbarcode/src/include/BC_PDF417Dimensions.h | 25 - .../src/include/BC_PDF417ECErrorCorrection.h | 26 - .../fxbarcode/src/include/BC_PDF417ECModulusGF.h | 37 - .../fxbarcode/src/include/BC_PDF417ECModulusPoly.h | 34 - .../src/include/BC_PDF417ErrorCorrection.h | 21 - .../src/include/BC_PDF417HighLevelEncoder.h | 54 -- xfa/src/fxbarcode/src/include/BC_PDF417Reader.h | 26 - .../src/include/BC_PDF417ResultMetadata.h | 29 - .../src/include/BC_PDF417ScanningDecoder.h | 61 -- xfa/src/fxbarcode/src/include/BC_PDF417Writer.h | 26 - .../fxbarcode/src/include/BC_QRAlignmentPattern.h | 24 - .../src/include/BC_QRAlignmentPatternFinder.h | 32 - .../fxbarcode/src/include/BC_QRBitMatrixParser.h | 31 - xfa/src/fxbarcode/src/include/BC_QRCodeReader.h | 35 - xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h | 28 - xfa/src/fxbarcode/src/include/BC_QRCoder.h | 55 -- .../fxbarcode/src/include/BC_QRCoderBitVector.h | 32 - .../fxbarcode/src/include/BC_QRCoderBlockPair.h | 23 - xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h | 29 - xfa/src/fxbarcode/src/include/BC_QRCoderECB.h | 21 - xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h | 25 - xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h | 60 -- .../src/include/BC_QRCoderErrorCorrectionLevel.h | 32 - .../src/include/BC_QRCoderFormatInformation.h | 29 - xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h | 24 - .../fxbarcode/src/include/BC_QRCoderMatrixUtil.h | 50 -- xfa/src/fxbarcode/src/include/BC_QRCoderMode.h | 40 - xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h | 42 - xfa/src/fxbarcode/src/include/BC_QRDataBlock.h | 27 - xfa/src/fxbarcode/src/include/BC_QRDataMask.h | 25 - .../src/include/BC_QRDecodedBitStreamParser.h | 35 - xfa/src/fxbarcode/src/include/BC_QRDetector.h | 41 - .../fxbarcode/src/include/BC_QRDetectorResult.h | 23 - xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h | 29 - .../src/include/BC_QRFinderPatternFinder.h | 45 -- xfa/src/fxbarcode/src/include/BC_QRGridSampler.h | 33 - xfa/src/fxbarcode/src/include/BC_Reader.h | 19 - xfa/src/fxbarcode/src/include/BC_ReedSolomon.h | 25 - .../fxbarcode/src/include/BC_ReedSolomonDecoder.h | 24 - .../fxbarcode/src/include/BC_ReedSolomonGF256.h | 35 - .../src/include/BC_ReedSolomonGF256Poly.h | 33 - xfa/src/fxbarcode/src/include/BC_ResultPoint.h | 24 - xfa/src/fxbarcode/src/include/BC_SymbolInfo.h | 53 -- xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h | 21 - xfa/src/fxbarcode/src/include/BC_TextEncoder.h | 18 - xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h | 44 -- .../fxbarcode/src/include/BC_UtilCodingConvert.h | 22 - xfa/src/fxbarcode/src/include/BC_UtilRSS.h | 23 - .../src/include/BC_WhiteRectangleDetector.h | 38 - xfa/src/fxbarcode/src/include/BC_Writer.h | 35 - xfa/src/fxbarcode/src/include/BC_X12Encoder.h | 21 - xfa/src/fxbarcode/src/include/utils.h | 219 ------ xfa/src/fxbarcode/utils.h | 219 ++++++ 478 files changed, 26789 insertions(+), 26787 deletions(-) create mode 100644 xfa/src/fxbarcode/BC_BarCode.cpp create mode 100644 xfa/src/fxbarcode/BC_Binarizer.cpp create mode 100644 xfa/src/fxbarcode/BC_Binarizer.h create mode 100644 xfa/src/fxbarcode/BC_BinaryBitmap.cpp create mode 100644 xfa/src/fxbarcode/BC_BinaryBitmap.h create mode 100644 xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp create mode 100644 xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h create mode 100644 xfa/src/fxbarcode/BC_DecoderResult.h create mode 100644 xfa/src/fxbarcode/BC_Dimension.cpp create mode 100644 xfa/src/fxbarcode/BC_Dimension.h create mode 100644 xfa/src/fxbarcode/BC_Library.cpp create mode 100644 xfa/src/fxbarcode/BC_LuminanceSource.cpp create mode 100644 xfa/src/fxbarcode/BC_LuminanceSource.h create mode 100644 xfa/src/fxbarcode/BC_Reader.cpp create mode 100644 xfa/src/fxbarcode/BC_Reader.h create mode 100644 xfa/src/fxbarcode/BC_ResultPoint.cpp create mode 100644 xfa/src/fxbarcode/BC_ResultPoint.h create mode 100644 xfa/src/fxbarcode/BC_TwoDimWriter.cpp create mode 100644 xfa/src/fxbarcode/BC_TwoDimWriter.h create mode 100644 xfa/src/fxbarcode/BC_UtilCodingConvert.cpp create mode 100644 xfa/src/fxbarcode/BC_UtilCodingConvert.h create mode 100644 xfa/src/fxbarcode/BC_UtilRSS.cpp create mode 100644 xfa/src/fxbarcode/BC_UtilRSS.h create mode 100644 xfa/src/fxbarcode/BC_Utils.cpp create mode 100644 xfa/src/fxbarcode/BC_Writer.cpp create mode 100644 xfa/src/fxbarcode/BC_Writer.h create mode 100644 xfa/src/fxbarcode/barcode.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitArray.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitArray.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitMatrix.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitSource.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonBitSource.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonByteArray.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonByteArray.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonByteMatrix.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonDecoderResult.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonECI.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonECI.h create mode 100644 xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp create mode 100644 xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h create mode 100644 xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp create mode 100644 xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h create mode 100644 xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp create mode 100644 xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp create mode 100644 xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_Encoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h create mode 100644 xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp create mode 100644 xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h create mode 100644 xfa/src/fxbarcode/oned/BC_OneDReader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OneDReader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OneDimReader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OneDimReader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OneDimWriter.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h create mode 100644 xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp create mode 100644 xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Common.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp create mode 100644 xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoder.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDataMask.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDetector.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp create mode 100644 xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h delete mode 100644 xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_BarCode.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Base256Encoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Binarizer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_C40Encoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonBitArray.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonBitSource.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonByteArray.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonECI.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Dimension.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Encoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_EncoderContext.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Library.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_LuminanceSource.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OneDReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OneDimReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OneDimWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Common.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Detector.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder_unittest.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_PDF417Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCodeReader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderECB.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderMode.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRDataBlock.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRDataMask.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRDetector.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_QRGridSampler.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Reader.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomon.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_ResultPoint.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_SymbolInfo.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_TextEncoder.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_UtilRSS.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Utils.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_Writer.cpp delete mode 100644 xfa/src/fxbarcode/src/BC_X12Encoder.cpp delete mode 100644 xfa/src/fxbarcode/src/barcode.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Base256Encoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Binarizer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_C40Encoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitArray.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonBitSource.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonByteArray.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonECI.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DecoderResult.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Dimension.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Encoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_EncoderContext.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_LuminanceSource.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OneDReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OneDimReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OneDimWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Common.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Detector.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_PDF417Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCodeReader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderECB.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderMode.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRDataBlock.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRDataMask.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRDetector.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_QRGridSampler.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Reader.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomon.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_ResultPoint.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_SymbolInfo.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_TextEncoder.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_UtilRSS.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_Writer.h delete mode 100644 xfa/src/fxbarcode/src/include/BC_X12Encoder.h delete mode 100644 xfa/src/fxbarcode/src/include/utils.h create mode 100644 xfa/src/fxbarcode/utils.h (limited to 'xfa/src') diff --git a/xfa/src/fxbarcode/BC_BarCode.cpp b/xfa/src/fxbarcode/BC_BarCode.cpp new file mode 100644 index 0000000000..063f8b5d8d --- /dev/null +++ b/xfa/src/fxbarcode/BC_BarCode.cpp @@ -0,0 +1,873 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_Reader.h" +#include "BC_Writer.h" +#include "BC_DecoderResult.h" +#include "BC_LuminanceSource.h" +#include "BC_BufferedImageLuminanceSource.h" +#include "BC_Binarizer.h" +#include "BC_BinaryBitmap.h" +#include "BC_UtilCodingConvert.h" +#include "BC_ResultPoint.h" +#include "BC_BinaryBitmap.h" +#include "BC_TwoDimWriter.h" +#include "common/BC_GlobalHistogramBinarizer.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonBitArray.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonDecoderResult.h" +#include "datamatrix/BC_DataMatrixReader.h" +#include "datamatrix/BC_DataMatrixWriter.h" +#include "oned/BC_OneDReader.h" +#include "oned/BC_OneDimReader.h" +#include "oned/BC_OneDimWriter.h" +#include "oned/BC_OnedCode39Reader.h" +#include "oned/BC_OnedCode39Writer.h" +#include "oned/BC_OnedCodaBarReader.h" +#include "oned/BC_OnedCodaBarWriter.h" +#include "oned/BC_OnedCode128Reader.h" +#include "oned/BC_OnedCode128Writer.h" +#include "oned/BC_OnedEAN8Reader.h" +#include "oned/BC_OnedEAN8Writer.h" +#include "oned/BC_OnedEAN13Reader.h" +#include "oned/BC_OnedEAN13Writer.h" +#include "oned/BC_OnedUPCAReader.h" +#include "oned/BC_OnedUPCAWriter.h" +#include "pdf417/BC_PDF417DetectorResult.h" +#include "pdf417/BC_PDF417Compaction.h" +#include "pdf417/BC_PDF417.h" +#include "pdf417/BC_PDF417Writer.h" +#include "pdf417/BC_PDF417Detector.h" +#include "pdf417/BC_PDF417DetectorResult.h" +#include "pdf417/BC_PDF417Codeword.h" +#include "pdf417/BC_PDF417Common.h" +#include "pdf417/BC_PDF417BarcodeValue.h" +#include "pdf417/BC_PDF417BarcodeMetadata.h" +#include "pdf417/BC_PDF417BoundingBox.h" +#include "pdf417/BC_PDF417DetectionResultColumn.h" +#include "pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "pdf417/BC_PDF417DetectionResult.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417CodewordDecoder.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417ECModulusPoly.h" +#include "pdf417/BC_PDF417ECModulusGF.h" +#include "pdf417/BC_PDF417ECErrorCorrection.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417ScanningDecoder.h" +#include "pdf417/BC_PDF417Reader.h" +#include "pdf417/BC_PDF417HighLevelEncoder.h" +#include "qrcode/BC_QRCodeReader.h" +#include "qrcode/BC_QRCodeWriter.h" +CBC_CodeBase :: CBC_CodeBase() +{ +} +CBC_CodeBase :: ~CBC_CodeBase() +{ +} +FX_BOOL CBC_CodeBase::SetCharEncoding(FX_INT32 encoding) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetCharEncoding(encoding); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetModuleHeight(FX_INT32 moduleHeight) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetModuleHeight(moduleHeight); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetModuleWidth(FX_INT32 moduleWidth) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetModuleWidth(moduleWidth); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetHeight(FX_INT32 height) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetHeight(height); + } + return FALSE; +} +FX_BOOL CBC_CodeBase::SetWidth(FX_INT32 width) +{ + if (m_pBCWriter) { + return m_pBCWriter->SetWidth(width); + } + return FALSE; +} +void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) +{ + if (m_pBCWriter) { + m_pBCWriter->SetBackgroundColor(backgroundColor); + } +} +void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) +{ + if (m_pBCWriter) { + m_pBCWriter->SetBarcodeColor(foregroundColor); + } +} +CBC_OneCode::CBC_OneCode() +{ +}; +CBC_OneCode::~CBC_OneCode() +{ +} +FX_BOOL CBC_OneCode::CheckContentValidity(FX_WSTR contents) +{ + if (m_pBCWriter) { + return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents); + } + return FALSE; +} +CFX_WideString CBC_OneCode::FilterContents(FX_WSTR contents) +{ + CFX_WideString tmp; + if (m_pBCWriter == NULL) { + return tmp; + } + return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); +} +void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum); + } +} +void CBC_OneCode::SetDataLength(FX_INT32 length) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length); + } +} +void CBC_OneCode::SetCalChecksum(FX_BOOL calc) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc); + } +} +FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) +{ + if (m_pBCWriter) { + return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont); + } + return FALSE; +} +void CBC_OneCode::SetFontSize(FX_FLOAT size) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size); + } +} +void CBC_OneCode::SetFontStyle(FX_INT32 style) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style); + } +} +void CBC_OneCode::SetFontColor(FX_ARGB color) +{ + if (m_pBCWriter) { + ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color); + } +} +CBC_Code39::CBC_Code39() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCode39Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCode39Writer); +} +CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) +{ + m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit); + m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer; +} +CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) +{ + m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit, extendedMode); + m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer(extendedMode); +} +CBC_Code39::~CBC_Code39() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Code39::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODE_39; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString filtercontents = ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents); + CFX_WideString renderContents = ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents); + m_renderContents = renderContents; + CFX_ByteString byteString = filtercontents.UTF8Encode(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(renderContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Code39::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Code39::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) +{ + if (m_pBCWriter) { + return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location); + } + return FALSE; +} +FX_BOOL CBC_Code39::SetWideNarrowRatio(FX_INT32 ratio) +{ + if (m_pBCWriter) { + return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio); + } + return FALSE; +} +CBC_Codabar::CBC_Codabar() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCodaBarReader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCodaBarWriter); +} +CBC_Codabar::~CBC_Codabar() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start); + } + return FALSE; +} +FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end); + } + return FALSE; +} +FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) +{ + return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetTextLocation(location); +} +FX_BOOL CBC_Codabar::SetWideNarrowRatio(FX_INT32 ratio) +{ + if (m_pBCWriter) { + return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetWideNarrowRatio(ratio); + } + return FALSE; +} +FX_BOOL CBC_Codabar::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODABAR; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString filtercontents = ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); + CFX_ByteString byteString = filtercontents.UTF8Encode(); + m_renderContents = filtercontents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(filtercontents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Codabar::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_Code128::CBC_Code128(BC_TYPE type) +{ + m_pBCReader = (CBC_Reader *) FX_NEW (CBC_OnedCode128Reader); + m_pBCWriter = (CBC_Writer *) FX_NEW CBC_OnedCode128Writer(type); +} +CBC_Code128::~CBC_Code128() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) +{ + if (m_pBCWriter) { + return (( CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location); + } + return FALSE; +} +FX_BOOL CBC_Code128::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_CODE_128; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString content = contents; + if (contents.GetLength() % 2 && ((CBC_OnedCode128Writer *)m_pBCWriter)->GetType() == BC_CODE128_C) { + content += '0'; + } + CFX_WideString encodeContents = ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content); + m_renderContents = encodeContents; + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_Code128::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_Code128::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_EAN8::CBC_EAN8() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN8Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN8Writer); +} +CBC_EAN8::~CBC_EAN8() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_EAN8::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 7) { + for (FX_INT32 i = 0; i < 7 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedEAN8Writer *)m_pBCWriter)->CalcChecksum(byteString); + encodeContents += FX_WCHAR(checksum - 0 + '0'); + } + if (length > 8) { + encodeContents = encodeContents.Mid(0, 8); + } + return encodeContents; +} +FX_BOOL CBC_EAN8::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_EAN_8; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_EAN8::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_EAN13::CBC_EAN13() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN13Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN13Writer); +} +CBC_EAN13::~CBC_EAN13() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_EAN13::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 12) { + for (FX_INT32 i = 0; i < 12 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedEAN13Writer *)m_pBCWriter)->CalcChecksum(byteString); + byteString += checksum - 0 + '0'; + encodeContents = byteString.UTF8Decode(); + } + if (length > 13) { + encodeContents = encodeContents.Mid(0, 13); + } + return encodeContents; +} +FX_BOOL CBC_EAN13::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_EAN_13; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_EAN13::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_UPCA::CBC_UPCA() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedUPCAReader); + ((CBC_OnedUPCAReader *)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedUPCAWriter); +} +CBC_UPCA::~CBC_UPCA() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +CFX_WideString CBC_UPCA::Preprocess(FX_WSTR contents) +{ + CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); + FX_INT32 length = encodeContents.GetLength(); + if (length <= 11) { + for (FX_INT32 i = 0; i < 11 - length; i++) { + encodeContents = FX_WCHAR('0') + encodeContents; + } + CFX_ByteString byteString = encodeContents.UTF8Encode(); + FX_INT32 checksum = ((CBC_OnedUPCAWriter *)m_pBCWriter)->CalcChecksum(byteString); + byteString += checksum - 0 + '0'; + encodeContents = byteString.UTF8Decode(); + } + if (length > 12) { + encodeContents = encodeContents.Mid(0, 12); + } + return encodeContents; +} +FX_BOOL CBC_UPCA::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + if(contents.IsEmpty()) { + e = BCExceptionNoContents; + return FALSE; + } + BCFORMAT format = BCFORMAT_UPC_A; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + CFX_WideString encodeContents = Preprocess(contents); + CFX_ByteString byteString = encodeContents.UTF8Encode(); + m_renderContents = encodeContents; + ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init(); + FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_UPCA::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(str, str.GetLength()); +} +CBC_QRCode::CBC_QRCode() +{ + m_pBCReader = (CBC_Reader *) FX_NEW (CBC_QRCodeReader); + ((CBC_QRCodeReader*)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer *) FX_NEW (CBC_QRCodeWriter); +} +CBC_QRCode ::~CBC_QRCode() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_QRCode::SetVersion(FX_INT32 version) +{ + if (version < 0 || version > 40) { + return FALSE; + } + if (m_pBCWriter == NULL) { + return FALSE; + } + return((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version); +} +FX_BOOL CBC_QRCode::SetErrorCorrectionLevel (FX_INT32 level) +{ + if (level < 0 || level > 3) { + return FALSE; + } + if (m_pBCWriter == NULL) { + return FALSE; + } + return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level); +} +FX_BOOL CBC_QRCode::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_QRCodeWriter*)m_pBCWriter)->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)->GetErrorCorrectionLevel(), outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_QRCode::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); +} +CBC_PDF417I::CBC_PDF417I() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_PDF417Reader); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_PDF417Writer); +} +CBC_PDF417I::~CBC_PDF417I() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel (FX_INT32 level) +{ + ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level); + return TRUE; +} +void CBC_PDF417I::SetTruncated(FX_BOOL truncated) +{ + ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated); +} +FX_BOOL CBC_PDF417I::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + BCFORMAT format = BCFORMAT_PDF_417; + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_PDF417Writer*)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_PDF417I::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength()); +} +CBC_DataMatrix::CBC_DataMatrix() +{ + m_pBCReader = (CBC_Reader*) FX_NEW (CBC_DataMatrixReader); + ((CBC_DataMatrixReader*)m_pBCReader)->Init(); + m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_DataMatrixWriter); +} +CBC_DataMatrix::~CBC_DataMatrix() +{ + if(m_pBCReader) { + delete(m_pBCReader); + m_pBCReader = NULL; + } + if(m_pBCWriter) { + delete(m_pBCWriter); + m_pBCWriter = NULL; + } +} +FX_BOOL CBC_DataMatrix::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) +{ + FX_INT32 outWidth = 0; + FX_INT32 outHeight = 0; + FX_BYTE *data = ((CBC_DataMatrixWriter *)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); + FX_Free(data); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); + return TRUE; +} +FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) +{ + ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return TRUE; +} +CFX_WideString CBC_DataMatrix::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) +{ + CFX_WideString str; + return str; +} +CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); +} diff --git a/xfa/src/fxbarcode/BC_Binarizer.cpp b/xfa/src/fxbarcode/BC_Binarizer.cpp new file mode 100644 index 0000000000..da433d7375 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Binarizer.cpp @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_LuminanceSource.h" +#include "BC_Binarizer.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonBitArray.h" +CBC_Binarizer::CBC_Binarizer(CBC_LuminanceSource *source) +{ + m_source = source; +} +CBC_Binarizer::~CBC_Binarizer() +{ +} +CBC_LuminanceSource *CBC_Binarizer::GetLuminanceSource() +{ + return m_source; +} diff --git a/xfa/src/fxbarcode/BC_Binarizer.h b/xfa/src/fxbarcode/BC_Binarizer.h new file mode 100644 index 0000000000..357aef67c2 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Binarizer.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BINARIZER_H_ +#define _BC_BINARIZER_H_ +class CBC_LuminanceSource; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_BinaryBitmap; +class CBC_Binarizer : public CFX_Object +{ +public: + CBC_Binarizer(CBC_LuminanceSource *source); + virtual ~CBC_Binarizer(); + CBC_LuminanceSource *GetLuminanceSource(); + virtual CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e) = 0; + virtual CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) = 0; +private: + CBC_LuminanceSource *m_source; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_BinaryBitmap.cpp b/xfa/src/fxbarcode/BC_BinaryBitmap.cpp new file mode 100644 index 0000000000..90e1755cf4 --- /dev/null +++ b/xfa/src/fxbarcode/BC_BinaryBitmap.cpp @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_Binarizer.h" +#include "BC_LuminanceSource.h" +#include "BC_BinaryBitmap.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonBitArray.h" +CBC_BinaryBitmap::CBC_BinaryBitmap(CBC_Binarizer *binarizer): m_binarizer(binarizer), m_matrix(NULL) +{ +} +CBC_BinaryBitmap::~CBC_BinaryBitmap() +{ + if (m_matrix != NULL) { + delete m_matrix; + } + m_matrix = NULL; +} +FX_INT32 CBC_BinaryBitmap::GetHeight() +{ + return m_binarizer->GetLuminanceSource()->GetHeight(); +} +FX_INT32 CBC_BinaryBitmap::GetWidth() +{ + return m_binarizer->GetLuminanceSource()->GetWidth(); +} +CBC_CommonBitMatrix *CBC_BinaryBitmap::GetMatrix(FX_INT32 &e) +{ + if (m_matrix == NULL) { + m_matrix = m_binarizer->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return m_matrix; +} +FX_BOOL CBC_BinaryBitmap::IsCropSupported() +{ + return m_binarizer->GetLuminanceSource()->IsCropSupported(); +} +FX_BOOL CBC_BinaryBitmap::IsRotateSupported() +{ + return m_binarizer->GetLuminanceSource()->IsRotateSupported(); +} +CBC_CommonBitArray *CBC_BinaryBitmap::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) +{ + CBC_CommonBitArray *temp = m_binarizer->GetBlackRow(y, row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_CommonBitMatrix *CBC_BinaryBitmap::GetBlackMatrix(FX_INT32 &e) +{ + if (m_matrix == NULL) { + m_matrix = m_binarizer->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return m_matrix; +} diff --git a/xfa/src/fxbarcode/BC_BinaryBitmap.h b/xfa/src/fxbarcode/BC_BinaryBitmap.h new file mode 100644 index 0000000000..638d16f5a9 --- /dev/null +++ b/xfa/src/fxbarcode/BC_BinaryBitmap.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BINARYBITMAP_H_ +#define _BC_BINARYBITMAP_H_ +class CBC_Binarizer; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_BinaryBitmap; +class CBC_BinaryBitmap : public CFX_Object +{ +public: + CBC_BinaryBitmap(CBC_Binarizer *binarizer); + virtual ~CBC_BinaryBitmap(); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + CBC_CommonBitMatrix * GetMatrix(FX_INT32 &e); + CBC_CommonBitArray * GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); + CBC_CommonBitMatrix * GetBlackMatrix(FX_INT32 &e); + FX_BOOL IsCropSupported(); + FX_BOOL IsRotateSupported(); +private: + CBC_Binarizer * m_binarizer; + CBC_CommonBitMatrix * m_matrix; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp new file mode 100644 index 0000000000..d385c456de --- /dev/null +++ b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.cpp @@ -0,0 +1,204 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_LuminanceSource.h" +#include "BC_BufferedImageLuminanceSource.h" +class CBC_Pause : public IFX_Pause +{ +public: + virtual FX_BOOL NeedToPauseNow() + { + return TRUE; + } +}; +static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread) +{ + CFX_DIBitmap* bitmap = NULL; + CCodec_ModuleMgr* pCodecMgr = NULL; + ICodec_ProgressiveDecoder* pImageCodec = NULL; + pCodecMgr = CCodec_ModuleMgr::Create(); + pImageCodec = pCodecMgr->CreateProgressiveDecoder(); + FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH; + status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN); + if (status != FXCODEC_STATUS_FRAME_READY) { + return NULL; + } + bitmap = FX_NEW CFX_DIBitmap; + bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb); + bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF)); + CBC_Pause pause; + FX_INT32 frames; + status = pImageCodec->GetFrames(frames, &pause); + while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) { + status = pImageCodec->GetFrames(frames, &pause); + } + if (status != FXCODEC_STATUS_DECODE_READY) { + goto except; + } + status = pImageCodec->StartDecode(bitmap, + 0, + 0, + bitmap->GetWidth(), + bitmap->GetHeight(), + 0, + FALSE); + if (status == FXCODEC_STATUS_ERR_PARAMS) { + goto except; + } + if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) { + goto except; + } + while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + status = pImageCodec->ContinueDecode(&pause); + } + if (status != FXCODEC_STATUS_DECODE_FINISH) { + goto except; + } + if (pImageCodec) { + delete pImageCodec; + pImageCodec = NULL; + } + if (pCodecMgr) { + pCodecMgr->Destroy(); + pCodecMgr = NULL; + } + return bitmap; +except: + if (pImageCodec) { + delete pImageCodec; + pImageCodec = NULL; + } + if (pCodecMgr) { + pCodecMgr->Destroy(); + pCodecMgr = NULL; + } + if (bitmap) { + delete bitmap; + } + return NULL; +} +CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename) +{ + m_height = 0; + m_width = 0; + m_bytesPerLine = 0; + m_top = 0; + m_left = 0; +} +void CBC_BufferedImageLuminanceSource::Init(FX_INT32 &e) +{ + IFX_FileRead* fileread = FX_CreateFileRead(m_filename); + m_pBitmap = CreateDIBSource(fileread); + if (m_pBitmap == NULL) { + e = BCExceptionLoadFile; + return; + } + m_pBitmap->ConvertFormat(FXDIB_Argb); + m_height = m_pBitmap->GetHeight(); + m_width = m_pBitmap->GetWidth(); + m_rgbData.SetSize(m_height * m_width); + m_bytesPerLine = m_width * 4; + m_top = 0; + m_left = 0; +} +CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0) +{ + m_pBitmap = pBitmap->Clone(); + m_pBitmap->ConvertFormat(FXDIB_Argb); + m_height = m_pBitmap->GetHeight(); + m_width = m_pBitmap->GetWidth(); + m_rgbData.SetSize(m_height * m_width); + m_bytesPerLine = m_width * 4; + m_top = 0; + m_left = 0; +} +CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource() +{ + delete m_pBitmap; + m_pBitmap = NULL; +} +CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) +{ + if (y < 0 || y >= m_height) { + e = BCExceptionRequestedRowIsOutSizeTheImage; + return NULL; + } + FX_INT32 width = m_width; + if(row.GetSize() == 0 || row.GetSize() < width) { + row.SetSize(width); + } + if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) { + m_rgbData.SetSize(width); + } + FX_INT32* rowLine = (FX_INT32*)m_pBitmap->GetScanline(y); + FX_INT32 x; + for (x = 0; x < width; x++) { + FX_INT32 pixel = rowLine[x]; + FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + + 601 * ((pixel >> 8) & 0xFF) + + 117 * (pixel & 0xFF)) >> 10; + row[x] = (FX_BYTE) luminance; + } + return &row; +} +CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix() +{ + CFX_ByteArray *matirx = FX_NEW CFX_ByteArray(); + matirx->SetSize(m_bytesPerLine * m_height); + FX_INT32 *rgb = (FX_INT32*)m_pBitmap->GetBuffer(); + FX_INT32 y; + for(y = 0; y < m_height; y++) { + FX_INT32 offset = y * m_width; + FX_INT32 x; + for(x = 0; x < m_width; x++) { + FX_INT32 pixel = rgb[offset + x]; + FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + + 601 * ((pixel >> 8) & 0xFF) + + 117 * (pixel & 0xFF)) >> 10; + (*matirx)[offset + x] = (FX_BYTE) luminance; + } + } + return matirx; +} +FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported() +{ + return TRUE; +} +FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported() +{ + return TRUE; +} +CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height) +{ + return NULL; +} +CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(FX_INT32 &e) +{ + if (!IsRotateSupported()) { + e = BCExceptionRotateNotSupported; + return NULL; + } + FX_INT32 sourceWidth = m_width; + FX_INT32 sourceHeight = m_height; + return NULL; +} diff --git a/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h new file mode 100644 index 0000000000..4bff1756d5 --- /dev/null +++ b/xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ +#define _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ +class CBC_LuminanceSource; +class CBC_BufferedImageLuminanceSource; +class CBC_BufferedImageLuminanceSource : public CBC_LuminanceSource +{ +public: + CBC_BufferedImageLuminanceSource(const CFX_WideString &filename); + CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap); + virtual ~CBC_BufferedImageLuminanceSource(); + CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e); + CBC_LuminanceSource *Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height); + + CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e); + CFX_ByteArray *GetMatrix(); + FX_BOOL IsCropSupported(); + FX_BOOL IsRotateSupported(); + virtual void Init(FX_INT32 &e); +private: + FX_INT32 m_bytesPerLine; + FX_INT32 m_left; + FX_INT32 m_top; + CFX_Int32Array m_rgbData; + CFX_DIBitmap *m_pBitmap; + const CFX_WideString m_filename; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_DecoderResult.h b/xfa/src/fxbarcode/BC_DecoderResult.h new file mode 100644 index 0000000000..ff98b2c407 --- /dev/null +++ b/xfa/src/fxbarcode/BC_DecoderResult.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DECODERRESULT_H_ +#define _BC_DECODERRESULT_H_ +class CBC_DecoderResult; +class CBC_DecoderResult : public CFX_Object +{ +public: + CBC_DecoderResult(CFX_ByteArray* rawBytes, CFX_ByteString text, CFX_ByteString ecLevel); + virtual ~CBC_DecoderResult(); + CFX_ByteArray* getRawBytes(); + CFX_ByteString getText(); + CFX_ByteString getECLevel(); + FX_INT32 getErrorsCorrected(); + void setErrorsCorrected(FX_INT32 errorsCorrected); + FX_INT32 getErasures(); + void setErasures(FX_INT32 erasures); + CFX_Object* getOther(); + void setOther(CFX_Object* other); +private: + CFX_ByteArray* m_rawBytes; + CFX_ByteString m_text; + CFX_ByteString m_ecLevel; + FX_INT32 m_errorsCorrected; + FX_INT32 m_erasures; + CFX_Object* m_other; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_Dimension.cpp b/xfa/src/fxbarcode/BC_Dimension.cpp new file mode 100644 index 0000000000..5662c6eba7 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Dimension.cpp @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_Dimension.h" +#include "datamatrix/BC_Encoder.h" +CBC_Dimension::CBC_Dimension() +{ +} +CBC_Dimension::CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + if (width < 0 || height < 0) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + } + m_width = width; + m_height = height; +} +CBC_Dimension::~CBC_Dimension() +{ +} +FX_INT32 CBC_Dimension::getWidth() +{ + return m_width; +} +FX_INT32 CBC_Dimension::getHeight() +{ + return m_height; +} +FX_INT32 CBC_Dimension::hashCode() +{ + return m_width * 32713 + m_height; +} +CFX_WideString CBC_Dimension::toString() +{ + return (FX_WCHAR)(m_width + (FX_WCHAR)'x' + m_height); +} diff --git a/xfa/src/fxbarcode/BC_Dimension.h b/xfa/src/fxbarcode/BC_Dimension.h new file mode 100644 index 0000000000..ff4aecace4 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Dimension.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DIMENSION_H_ +#define _BC_DIMENSION_H_ +class CBC_Dimension; +class CBC_Dimension : public CFX_Object +{ +public: + CBC_Dimension(); + CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e); + virtual ~CBC_Dimension(); + FX_INT32 getWidth(); + FX_INT32 getHeight(); + FX_INT32 hashCode(); + CFX_WideString toString(); +private: + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_Library.cpp b/xfa/src/fxbarcode/BC_Library.cpp new file mode 100644 index 0000000000..e84eda6099 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Library.cpp @@ -0,0 +1,123 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "BC_Reader.h" +#include "BC_UtilCodingConvert.h" +#include "BC_BinaryBitmap.h" +#include "BC_LuminanceSource.h" +#include "BC_BufferedImageLuminanceSource.h" +#include "BC_Binarizer.h" +#include "BC_Writer.h" +#include "BC_Dimension.h" +#include "BC_UtilCodingConvert.h" +#include "BC_ResultPoint.h" +#include "BC_BinaryBitmap.h" +#include "BC_DecoderResult.h" +#include "BC_TwoDimWriter.h" +#include "common/BC_GlobalHistogramBinarizer.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/reedsolomon/BC_ReedSolomonGF256.h" +#include "common/BC_CommonByteMatrix.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonBitArray.h" +#include "common/BC_CommonBitMatrix.h" +#include "common/BC_CommonDecoderResult.h" +#include "datamatrix/BC_DataMatrixVersion.h" +#include "datamatrix/BC_DataMatrixReader.h" +#include "datamatrix/BC_Encoder.h" +#include "datamatrix/BC_DefaultPlacement.h" +#include "datamatrix/BC_SymbolShapeHint.h" +#include "datamatrix/BC_SymbolInfo.h" +#include "datamatrix/BC_DataMatrixSymbolInfo144.h" +#include "datamatrix/BC_ErrorCorrection.h" +#include "datamatrix/BC_EncoderContext.h" +#include "datamatrix/BC_C40Encoder.h" +#include "datamatrix/BC_TextEncoder.h" +#include "datamatrix/BC_X12Encoder.h" +#include "datamatrix/BC_EdifactEncoder.h" +#include "datamatrix/BC_Base256Encoder.h" +#include "datamatrix/BC_ASCIIEncoder.h" +#include "datamatrix/BC_HighLevelEncoder.h" +#include "datamatrix/BC_DataMatrixWriter.h" +#include "oned/BC_OneDReader.h" +#include "oned/BC_OnedCode128Reader.h" +#include "oned/BC_OnedCode39Reader.h" +#include "oned/BC_OneDimReader.h" +#include "oned/BC_OnedEAN13Reader.h" +#include "oned/BC_OnedEAN8Reader.h" +#include "oned/BC_OnedUPCAReader.h" +#include "oned/BC_OnedCodaBarReader.h" +#include "oned/BC_OneDimWriter.h" +#include "oned/BC_OnedCode128Writer.h" +#include "oned/BC_OnedCode39Writer.h" +#include "oned/BC_OnedEAN13Writer.h" +#include "oned/BC_OnedEAN8Writer.h" +#include "oned/BC_OnedUPCAWriter.h" +#include "pdf417/BC_PDF417DetectorResult.h" +#include "pdf417/BC_PDF417Compaction.h" +#include "pdf417/BC_PDF417HighLevelEncoder.h" +#include "pdf417/BC_PDF417Detector.h" +#include "pdf417/BC_PDF417DetectorResult.h" +#include "pdf417/BC_PDF417Codeword.h" +#include "pdf417/BC_PDF417Common.h" +#include "pdf417/BC_PDF417BarcodeValue.h" +#include "pdf417/BC_PDF417BarcodeMetadata.h" +#include "pdf417/BC_PDF417BoundingBox.h" +#include "pdf417/BC_PDF417DetectionResultColumn.h" +#include "pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "pdf417/BC_PDF417DetectionResult.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417CodewordDecoder.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417ECModulusPoly.h" +#include "pdf417/BC_PDF417ECModulusGF.h" +#include "pdf417/BC_PDF417ECErrorCorrection.h" +#include "pdf417/BC_PDF417DecodedBitStreamParser.h" +#include "pdf417/BC_PDF417ScanningDecoder.h" +#include "pdf417/BC_PDF417Reader.h" +#include "qrcode/BC_QRCodeReader.h" +#include "qrcode/BC_QRCodeWriter.h" +#include "qrcode/BC_QRCoderErrorCorrectionLevel.h" +#include "qrcode/BC_QRCoderMode.h" +#include "qrcode/BC_QRCoderVersion.h" +#include "qrcode/BC_QRDataMask.h" +#include "qrcode/BC_QRDecodedBitStreamParser.h" +void BC_Library_Init() +{ + CBC_QRCoderErrorCorrectionLevel::Initialize(); + CBC_QRCoderMode::Initialize(); + CBC_QRCoderVersion::Initialize(); + CBC_QRDataMask::Initialize(); + CBC_ReedSolomonGF256::Initialize(); + CBC_DataMatrixVersion::Initialize(); + CBC_SymbolInfo::Initialize(); + CBC_ErrorCorrection::Initialize(); + CBC_PDF417HighLevelEncoder::Initialize(); + FX_INT32 e = 0; + CBC_PDF417ECModulusGF::Initialize(e); + CBC_DecodedBitStreamPaser::Initialize(); + CBC_PDF417CodewordDecoder::Initialize(); + CBC_PDF417ECErrorCorrection::Initialize(e); + CBC_PDF417ScanningDecoder::Initialize(); +} +void BC_Library_Destory() +{ + CBC_QRCoderErrorCorrectionLevel::Finalize(); + CBC_QRCoderMode::Finalize(); + CBC_QRCoderVersion::Finalize(); + CBC_QRDataMask::Finalize(); + CBC_ReedSolomonGF256::Finalize(); + CBC_DataMatrixVersion::Finalize(); + CBC_SymbolInfo::Finalize(); + CBC_ErrorCorrection::Finalize(); + CBC_PDF417HighLevelEncoder::Finalize(); + CBC_DecodedBitStreamPaser::Finalize(); + CBC_PDF417CodewordDecoder::Finalize(); + CBC_PDF417ECErrorCorrection::Finalize(); + CBC_PDF417ECModulusGF::Finalize(); + CBC_PDF417ScanningDecoder::Finalize(); +} diff --git a/xfa/src/fxbarcode/BC_LuminanceSource.cpp b/xfa/src/fxbarcode/BC_LuminanceSource.cpp new file mode 100644 index 0000000000..e237454a83 --- /dev/null +++ b/xfa/src/fxbarcode/BC_LuminanceSource.cpp @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_LuminanceSource.h" +CBC_LuminanceSource::CBC_LuminanceSource(FX_INT32 width, FX_INT32 height): m_width(width), m_height(height) +{ +} +CBC_LuminanceSource::~CBC_LuminanceSource() +{ +} +FX_INT32 CBC_LuminanceSource::GetWidth() +{ + return m_width; +} +FX_INT32 CBC_LuminanceSource::GetHeight() +{ + return m_height; +} diff --git a/xfa/src/fxbarcode/BC_LuminanceSource.h b/xfa/src/fxbarcode/BC_LuminanceSource.h new file mode 100644 index 0000000000..6aa85101c9 --- /dev/null +++ b/xfa/src/fxbarcode/BC_LuminanceSource.h @@ -0,0 +1,34 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_LUMINANCESOURCE_H +#define _BC_LUMINANCESOURCE_H +class CBC_LuminanceSource; +class CBC_LuminanceSource : public CFX_Object +{ +public: + CBC_LuminanceSource(FX_INT32 width, FX_INT32 height); + virtual ~CBC_LuminanceSource(); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + + virtual CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) = 0; + virtual CFX_ByteArray *GetMatrix() = 0; + virtual FX_BOOL IsCropSupported() + { + return FALSE; + } + virtual FX_BOOL IsRotateSupported() + { + return FALSE; + } + + virtual CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e) = 0; +protected: + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_Reader.cpp b/xfa/src/fxbarcode/BC_Reader.cpp new file mode 100644 index 0000000000..3b0929bfbf --- /dev/null +++ b/xfa/src/fxbarcode/BC_Reader.cpp @@ -0,0 +1,14 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "BC_Reader.h" +CBC_Reader::CBC_Reader() +{ +} +CBC_Reader::~CBC_Reader() +{ +} diff --git a/xfa/src/fxbarcode/BC_Reader.h b/xfa/src/fxbarcode/BC_Reader.h new file mode 100644 index 0000000000..42b2aa11f5 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Reader.h @@ -0,0 +1,19 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_READER_H_ +#define _BC_READER_H_ +class CBC_BinaryBitmap; +class CBC_Reader; +class CBC_Reader : public CFX_Object +{ +public: + CBC_Reader(); + virtual ~CBC_Reader(); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e) = 0; + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) = 0; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_ResultPoint.cpp b/xfa/src/fxbarcode/BC_ResultPoint.cpp new file mode 100644 index 0000000000..6f1aac4e31 --- /dev/null +++ b/xfa/src/fxbarcode/BC_ResultPoint.cpp @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_ResultPoint.h" +CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y): m_x(x), m_y(y) +{ +} +FX_FLOAT CBC_ResultPoint::GetX() +{ + return m_x; +} +FX_FLOAT CBC_ResultPoint::GetY() +{ + return m_y; +} diff --git a/xfa/src/fxbarcode/BC_ResultPoint.h b/xfa/src/fxbarcode/BC_ResultPoint.h new file mode 100644 index 0000000000..7001cfa2a5 --- /dev/null +++ b/xfa/src/fxbarcode/BC_ResultPoint.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_RESULTPOINT_H_ +#define _BC_RESULTPOINT_H_ +class CBC_ResultPoint; +class CBC_ResultPoint : public CFX_Object +{ +public: + CBC_ResultPoint(); + CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y); + virtual ~CBC_ResultPoint() + { + } + virtual FX_FLOAT GetX(); + virtual FX_FLOAT GetY(); +protected: + FX_FLOAT m_x; + FX_FLOAT m_y; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_TwoDimWriter.cpp b/xfa/src/fxbarcode/BC_TwoDimWriter.cpp new file mode 100644 index 0000000000..c0456cd104 --- /dev/null +++ b/xfa/src/fxbarcode/BC_TwoDimWriter.cpp @@ -0,0 +1,137 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "common/BC_CommonBitMatrix.h" +#include "BC_Writer.h" +#include "BC_TwoDimWriter.h" +CBC_TwoDimWriter::CBC_TwoDimWriter() +{ + m_iCorrectLevel = 1; + m_bFixedSize = TRUE; + m_output = NULL; +} +CBC_TwoDimWriter::~CBC_TwoDimWriter() +{ + if (m_output != NULL) { + delete m_output; + m_output = NULL; + } +} +void CBC_TwoDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix) +{ + CFX_GraphStateData stateData; + CFX_PathData path; + path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); + device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); + FX_INT32 leftPos = 0; + FX_INT32 topPos = 0; + if ( m_bFixedSize) { + leftPos = (m_Width - m_output->GetWidth()) / 2; + topPos = (m_Height - m_output->GetHeight()) / 2; + } + CFX_Matrix matri = *matrix; + if (m_Width < m_output->GetWidth() && m_Height < m_output->GetHeight()) { + CFX_Matrix matriScale((FX_FLOAT)m_Width / (FX_FLOAT)m_output->GetWidth(), 0.0, 0.0, (FX_FLOAT)m_Height / (FX_FLOAT)m_output->GetHeight(), 0.0, 0.0); + matriScale.Concat(*matrix); + matri = matriScale; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + CFX_PathData rect; + rect.AppendRect((FX_FLOAT)leftPos + x, (FX_FLOAT)topPos + y, (FX_FLOAT)(leftPos + x + 1), (FX_FLOAT)(topPos + y + 1)); + CFX_GraphStateData stateData; + if(m_output->Get(x, y)) { + device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); + } + } + } +} +void CBC_TwoDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e) +{ + if (m_bFixedSize) { + pOutBitmap = CreateDIBitmap(m_Width, m_Height); + } else { + pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); + } + if (!pOutBitmap) { + e = BCExceptionFailToCreateBitmap; + return; + } + pOutBitmap->Clear(m_backgroundColor); + FX_INT32 leftPos = 0; + FX_INT32 topPos = 0; + if ( m_bFixedSize) { + leftPos = (m_Width - m_output->GetWidth()) / 2; + topPos = (m_Height - m_output->GetHeight()) / 2; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + if (m_output->Get(x, y)) { + pOutBitmap->SetPixel(leftPos + x, topPos + y, m_barColor); + } + } + } + if (!m_bFixedSize) { + CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); + if (pOutBitmap) { + delete pOutBitmap; + } + pOutBitmap = pStretchBitmap; + } +} +void CBC_TwoDimWriter::RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e) +{ + FX_INT32 inputWidth = codeWidth; + FX_INT32 inputHeight = codeHeight; + FX_INT32 tempWidth = inputWidth + (1 << 1); + FX_INT32 tempHeight = inputHeight + (1 << 1); + FX_FLOAT moduleHSize = (FX_FLOAT)FX_MIN(m_ModuleWidth, m_ModuleHeight); + if (moduleHSize > 8) { + moduleHSize = 8; + } else if (moduleHSize < 1) { + moduleHSize = 1; + } + FX_INT32 outputWidth = (FX_INT32)FX_MAX(tempWidth * moduleHSize, tempWidth); + FX_INT32 outputHeight = (FX_INT32)FX_MAX(tempHeight * moduleHSize, tempHeight); + FX_INT32 multiX = 1; + FX_INT32 multiY = 1; + if (m_bFixedSize) { + if (m_Width < outputWidth || m_Height < outputHeight) { + e = BCExceptionBitmapSizeError; + return; + } + } else { + if (m_Width > outputWidth || m_Height > outputHeight) { + outputWidth = (FX_INT32)(outputWidth * ceil ( (FX_FLOAT)m_Width / (FX_FLOAT)outputWidth)); + outputHeight = (FX_INT32)(outputHeight * ceil ( (FX_FLOAT)m_Height / (FX_FLOAT)outputHeight)); + } + } + multiX = (FX_INT32)ceil((FX_FLOAT)outputWidth / (FX_FLOAT)tempWidth); + multiY = (FX_INT32)ceil((FX_FLOAT)outputHeight / (FX_FLOAT) tempHeight); + if (m_bFixedSize) { + multiX = FX_MIN(multiX, multiY); + multiY = multiX; + } + FX_INT32 leftPadding = (outputWidth - (inputWidth * multiX)) / 2; + FX_INT32 topPadding = (outputHeight - (inputHeight * multiY)) / 2; + if (leftPadding < 0) { + leftPadding = 0; + } + if (topPadding < 0) { + topPadding = 0; + } + m_output = FX_NEW CBC_CommonBitMatrix; + m_output->Init(outputWidth, outputHeight); + for (FX_INT32 inputY = 0, outputY = topPadding; (inputY < inputHeight) && (outputY < outputHeight - multiY); inputY++, outputY += multiY) { + for (FX_INT32 inputX = 0, outputX = leftPadding; (inputX < inputWidth) && (outputX < outputWidth - multiX); inputX++, outputX += multiX) { + if (code[inputX + inputY * inputWidth] == 1) { + m_output->SetRegion(outputX, outputY, multiX, multiY, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } +} diff --git a/xfa/src/fxbarcode/BC_TwoDimWriter.h b/xfa/src/fxbarcode/BC_TwoDimWriter.h new file mode 100644 index 0000000000..369d494c08 --- /dev/null +++ b/xfa/src/fxbarcode/BC_TwoDimWriter.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_TWODIMWRITER_H_ +#define _BC_TWODIMWRITER_H_ +#include "BC_Writer.h" +class CBC_Writer; +class CBC_CommonBitMatrix; +class CBC_TwoDimWriter; +class CBC_TwoDimWriter : public CBC_Writer +{ +public: + CBC_TwoDimWriter(); + virtual ~CBC_TwoDimWriter(); + virtual FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) + { + return NULL; + }; + virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) + { + return NULL; + }; + virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) + { + return NULL; + }; + virtual void RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e); + virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e); + virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix); + virtual FX_BOOL SetErrorCorrectionLevel (FX_INT32 level) = 0; + virtual FX_INT32 GetErrorCorrectionLevel() + { + return m_iCorrectLevel; + }; + +protected: + FX_INT32 m_iCorrectLevel; + FX_BOOL m_bFixedSize; + CBC_CommonBitMatrix* m_output; +}; +#endif diff --git a/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp b/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp new file mode 100644 index 0000000000..c6aa1f3eb7 --- /dev/null +++ b/xfa/src/fxbarcode/BC_UtilCodingConvert.cpp @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "BC_UtilCodingConvert.h" +CBC_UtilCodingConvert::CBC_UtilCodingConvert() +{ +} +CBC_UtilCodingConvert::~CBC_UtilCodingConvert() +{ +} +void CBC_UtilCodingConvert::UnicodeToLocale(const CFX_WideString &src, CFX_ByteString &dst) +{ + dst.ConvertFrom(src); +} +void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteString &dst) +{ + CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); + dst = unicode.UTF8Encode(); +} +void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteArray &dst) +{ + CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); + CFX_ByteString utf8 = unicode.UTF8Encode(); + for (FX_INT32 i = 0; i < utf8.GetLength(); i ++) { + dst.Add(utf8[i]); + } +} +void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray &src, CFX_ByteString &dst) +{ + CFX_ByteString utf8; + for (FX_INT32 i = 0; i < src.GetSize(); i ++) { + utf8 += src[i]; + } + CFX_WideString unicode = CFX_WideString::FromUTF8(utf8, utf8.GetLength()); + dst.ConvertFrom(unicode); +} +void CBC_UtilCodingConvert::Utf8ToLocale(const FX_BYTE *src, FX_INT32 count, CFX_ByteString &dst) +{ + CFX_WideString unicode = CFX_WideString::FromUTF8((const char*)src, count); + dst.ConvertFrom(unicode); +} +void CBC_UtilCodingConvert::UnicodeToUTF8(const CFX_WideString &src, CFX_ByteString &dst) +{ + dst = src.UTF8Encode(); +} diff --git a/xfa/src/fxbarcode/BC_UtilCodingConvert.h b/xfa/src/fxbarcode/BC_UtilCodingConvert.h new file mode 100644 index 0000000000..1ee3a8c64c --- /dev/null +++ b/xfa/src/fxbarcode/BC_UtilCodingConvert.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_UTILCODINGCONVERT_H_ +#define _BC_UTILCODINGCONVERT_H_ +class CBC_UtilCodingConvert; +class CBC_UtilCodingConvert : public CFX_Object +{ +public: + CBC_UtilCodingConvert(); + virtual ~CBC_UtilCodingConvert(); + static void UnicodeToLocale(const CFX_WideString &source, CFX_ByteString &result); + static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteString &result); + static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteArray &result); + static void Utf8ToLocale(const CFX_ByteArray &source, CFX_ByteString &result); + static void Utf8ToLocale(const FX_BYTE *source, FX_INT32 count, CFX_ByteString &result); + static void UnicodeToUTF8(const CFX_WideString &source, CFX_ByteString &result); +}; +#endif diff --git a/xfa/src/fxbarcode/BC_UtilRSS.cpp b/xfa/src/fxbarcode/BC_UtilRSS.cpp new file mode 100644 index 0000000000..c65df34e13 --- /dev/null +++ b/xfa/src/fxbarcode/BC_UtilRSS.cpp @@ -0,0 +1,164 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "barcode.h" +#include "BC_UtilRSS.h" +CBC_UtilRSS::CBC_UtilRSS() +{ +} +CBC_UtilRSS::~CBC_UtilRSS() +{ +} +CFX_Int32Array *CBC_UtilRSS::GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow) +{ + CFX_Int32Array *iTemp = FX_NEW CFX_Int32Array; + iTemp->SetSize(elements); + CBC_AutoPtr widths(iTemp); + FX_INT32 bar; + FX_INT32 narrowMask = 0; + for (bar = 0; bar < elements - 1; bar++) { + narrowMask |= (1 << bar); + FX_INT32 elmWidth = 1; + FX_INT32 subVal; + while (TRUE) { + subVal = Combins(n - elmWidth - 1, elements - bar - 2); + if (noNarrow && (narrowMask == 0) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2); + } + if (elements - bar - 1 > 1) { + FX_INT32 lessVal = 0; + for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; + mxwElement--) { + lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3); + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val -= subVal; + if (val < 0) { + break; + } + elmWidth++; + narrowMask &= ~(1 << bar); + } + val += subVal; + n -= elmWidth; + (*widths)[bar] = elmWidth; + } + (*widths)[bar] = n; + return widths.release(); +} +FX_INT32 CBC_UtilRSS::GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow) +{ + FX_INT32 elements = widths.GetSize(); + FX_INT32 n = 0; + for (FX_INT32 i = 0; i < elements; i++) { + n += widths[i]; + } + FX_INT32 val = 0; + FX_INT32 narrowMask = 0; + for (FX_INT32 bar = 0; bar < elements - 1; bar++) { + FX_INT32 elmWidth; + for (elmWidth = 1, narrowMask |= (1 << bar); + elmWidth < widths[bar]; + elmWidth++, narrowMask &= ~(1 << bar)) { + FX_INT32 subVal = Combins(n - elmWidth - 1, elements - bar - 2); + if (noNarrow && (narrowMask == 0) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= Combins(n - elmWidth - (elements - bar), + elements - bar - 2); + } + if (elements - bar - 1 > 1) { + FX_INT32 lessVal = 0; + for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; mxwElement--) { + lessVal += Combins(n - elmWidth - mxwElement - 1, + elements - bar - 3); + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val += subVal; + } + n -= elmWidth; + } + return val; +} +FX_INT32 CBC_UtilRSS::Combins(FX_INT32 n, FX_INT32 r) +{ + FX_INT32 maxDenom; + FX_INT32 minDenom; + if (n - r > r) { + minDenom = r; + maxDenom = n - r; + } else { + minDenom = n - r; + maxDenom = r; + } + FX_INT32 val = 1; + FX_INT32 j = 1; + for (FX_INT32 i = n; i > maxDenom; i--) { + val *= i; + if (j <= minDenom) { + val /= j; + j++; + } + } + while (j <= minDenom) { + val /= j; + j++; + } + return val; +} +CFX_Int32Array *CBC_UtilRSS::Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K) +{ + CFX_Int32Array *widths = FX_NEW CFX_Int32Array; + widths->SetSize(eDist.GetSize() + 2); + FX_INT32 twoK = K << 1; + (*widths)[0] = 1; + FX_INT32 i; + FX_INT32 minEven = 10; + FX_INT32 barSum = 1; + for (i = 1; i < twoK - 2; i += 2) { + (*widths)[i] = eDist[i - 1] - (*widths)[i - 1]; + (*widths)[i + 1] = eDist[i] - (*widths)[i]; + barSum += (*widths)[i] + (*widths)[i + 1]; + if ((*widths)[i] < minEven) { + minEven = (*widths)[i]; + } + } + (*widths)[twoK - 1] = N - barSum; + if ((*widths)[twoK - 1] < minEven) { + minEven = (*widths)[twoK - 1]; + } + if (minEven > 1) { + for (i = 0; i < twoK; i += 2) { + (*widths)[i] += minEven - 1; + (*widths)[i + 1] -= minEven - 1; + } + } + return widths; +} diff --git a/xfa/src/fxbarcode/BC_UtilRSS.h b/xfa/src/fxbarcode/BC_UtilRSS.h new file mode 100644 index 0000000000..37834eaa76 --- /dev/null +++ b/xfa/src/fxbarcode/BC_UtilRSS.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_UTILRESS_H_ +#define _BC_UTILRESS_H_ +class CBC_RssPair; +class CBC_UtilRSS : public CFX_Object +{ +public: + virtual ~CBC_UtilRSS(); + static FX_INT32 GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow); + +protected: + static CFX_Int32Array *GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow); + static FX_INT32 Combins(FX_INT32 n, FX_INT32 r); + static CFX_Int32Array *Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K); +private: + CBC_UtilRSS(); +}; +#endif diff --git a/xfa/src/fxbarcode/BC_Utils.cpp b/xfa/src/fxbarcode/BC_Utils.cpp new file mode 100644 index 0000000000..3a04ebda2b --- /dev/null +++ b/xfa/src/fxbarcode/BC_Utils.cpp @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c) +{ + if (first > last || count <= 0) { + return FALSE; + } + dst.Delete(first, last - first); + for (FX_INT32 i = 0; i < count; i ++) { + dst.Insert(0, c); + } + return TRUE; +} +void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c) +{ + for (FX_INT32 i = 0; i < count; i ++) { + dst += c; + } +} +void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba) +{ + for (FX_INT32 i = 0; i < ba.GetSize(); i ++) { + dst += ba[i]; + } +} +void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun) +{ + FX_INT32 nLength = src.GetSize(); + FX_BOOL changed = true; + do { + changed = false; + for (FX_INT32 i = 0; i < nLength - 1; i++) { + if ( fun(src[i + 1], src[i]) ) { + void *temp = src[i]; + src.SetAt(i, src[i + 1]); + src.SetAt(i + 1, temp); + changed = true; + } + } + } while (changed); +} diff --git a/xfa/src/fxbarcode/BC_Writer.cpp b/xfa/src/fxbarcode/BC_Writer.cpp new file mode 100644 index 0000000000..69276dd1f4 --- /dev/null +++ b/xfa/src/fxbarcode/BC_Writer.cpp @@ -0,0 +1,70 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "barcode.h" +#include "BC_Writer.h" +CBC_Writer::CBC_Writer() +{ + m_CharEncoding = 0; + m_ModuleHeight = 1; + m_ModuleWidth = 1; + m_Height = 320; + m_Width = 640; + m_colorSpace = FXDIB_Argb; + m_barColor = 0xff000000; + m_backgroundColor = 0xffffffff; +} +CBC_Writer::~CBC_Writer() +{ +} +FX_BOOL CBC_Writer::SetCharEncoding(FX_INT32 encoding) +{ + m_CharEncoding = encoding; + return TRUE; +} +FX_BOOL CBC_Writer::SetModuleHeight(FX_INT32 moduleHeight) +{ + if (moduleHeight > 10 || moduleHeight < 1) { + return FALSE; + } + m_ModuleHeight = moduleHeight; + return TRUE; +} +FX_BOOL CBC_Writer::SetModuleWidth(FX_INT32 moduleWidth) +{ + if ( moduleWidth > 10 || moduleWidth < 1) { + return FALSE; + } + m_ModuleWidth = moduleWidth; + return TRUE; +} +FX_BOOL CBC_Writer::SetHeight(FX_INT32 height) +{ + m_Height = height; + return TRUE; +} +FX_BOOL CBC_Writer::SetWidth(FX_INT32 width) +{ + m_Width = width; + return TRUE; +} +void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) +{ + m_backgroundColor = backgroundColor; +} +void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) +{ + m_barColor = foregroundColor; +} +CFX_DIBitmap* CBC_Writer::CreateDIBitmap(FX_INT32 width, FX_INT32 height) +{ + CFX_DIBitmap *pDIBitmap = NULL; + pDIBitmap = FX_NEW CFX_DIBitmap; + if(pDIBitmap != NULL) { + pDIBitmap->Create(width, height, m_colorSpace); + } + return pDIBitmap; +} diff --git a/xfa/src/fxbarcode/BC_Writer.h b/xfa/src/fxbarcode/BC_Writer.h new file mode 100644 index 0000000000..deb68c07be --- /dev/null +++ b/xfa/src/fxbarcode/BC_Writer.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_WRITER_H_ +#define _BC_WRITER_H_ +class CBC_Writer; +class CBC_Writer : public CFX_Object +{ +public: + CBC_Writer(); + virtual ~CBC_Writer(); + virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) = 0; + virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) = 0; + virtual FX_BOOL SetCharEncoding(FX_INT32 encoding); + virtual FX_BOOL SetModuleHeight(FX_INT32 moduleHeight); + virtual FX_BOOL SetModuleWidth(FX_INT32 moduleWidth); + virtual FX_BOOL SetHeight(FX_INT32 height); + virtual FX_BOOL SetWidth(FX_INT32 width); + virtual void SetBackgroundColor(FX_ARGB backgroundColor); + virtual void SetBarcodeColor(FX_ARGB foregroundColor); +protected: + CFX_DIBitmap* CreateDIBitmap(FX_INT32 width, FX_INT32 height); + FX_INT32 m_CharEncoding; + FX_INT32 m_ModuleHeight; + FX_INT32 m_ModuleWidth; + FX_INT32 m_Height; + FX_INT32 m_Width; + FXDIB_Format m_colorSpace; + FX_ARGB m_barColor; + FX_ARGB m_backgroundColor; +}; +#endif diff --git a/xfa/src/fxbarcode/barcode.h b/xfa/src/fxbarcode/barcode.h new file mode 100644 index 0000000000..333d3f7a11 --- /dev/null +++ b/xfa/src/fxbarcode/barcode.h @@ -0,0 +1,8 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../foxitlib.h" +#include "utils.h" diff --git a/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp b/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp new file mode 100644 index 0000000000..6263affbe8 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitArray.cpp @@ -0,0 +1,124 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonBitArray.h" +CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array) +{ + m_size = array->GetSize(); + m_bits.Copy(array->GetBits()); +} +CBC_CommonBitArray::CBC_CommonBitArray() +{ + m_bits.SetSize(1); + m_size = 0; +} +CBC_CommonBitArray::CBC_CommonBitArray(FX_INT32 size) +{ + m_bits.SetSize((size + 31) >> 5); + m_size = size; +} +CBC_CommonBitArray::~CBC_CommonBitArray() +{ + m_size = 0; +} +FX_INT32 CBC_CommonBitArray::GetSize() +{ + return m_size; +} +CFX_Int32Array& CBC_CommonBitArray::GetBits() +{ + return m_bits; +} +FX_INT32 CBC_CommonBitArray::GetSizeInBytes() +{ + return (m_size + 7) >> 3; +} +FX_BOOL CBC_CommonBitArray::Get(FX_INT32 i) +{ + return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0; +} +void CBC_CommonBitArray::Set(FX_INT32 i) +{ + m_bits[i >> 5] |= 1 << (i & 0x1F); +} +void CBC_CommonBitArray::Flip(FX_INT32 i) +{ + m_bits[i >> 5] ^= 1 << (i & 0x1F); +} +void CBC_CommonBitArray::SetBulk(FX_INT32 i, FX_INT32 newBits) +{ + m_bits[i >> 5] = newBits; +} +void CBC_CommonBitArray::Clear() +{ + FXSYS_memset32(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(FX_INT32)); +} +FX_BOOL CBC_CommonBitArray::IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e) +{ + if (end < start) { + e = BCExceptionEndLessThanStart; + return FALSE; + } + if (end == start) { + return TRUE; + } + end--; + FX_INT32 firstInt = start >> 5; + FX_INT32 lastInt = end >> 5; + FX_INT32 i; + for (i = firstInt; i <= lastInt; i++) { + FX_INT32 firstBit = i > firstInt ? 0 : start & 0x1F; + FX_INT32 lastBit = i < lastInt ? 31 : end & 0x1F; + FX_INT32 mask; + if (firstBit == 0 && lastBit == 31) { + mask = -1; + } else { + mask = 0; + for (FX_INT32 j = firstBit; j <= lastBit; j++) { + mask |= 1 << j; + } + } + if ((m_bits[i] & mask) != (value ? mask : 0)) { + return FALSE; + } + } + return TRUE; +} +FX_INT32* CBC_CommonBitArray::GetBitArray() +{ + return &m_bits[0]; +} +void CBC_CommonBitArray::Reverse() +{ + FX_INT32* newBits = FX_Alloc(FX_INT32, m_bits.GetSize()); + FXSYS_memset32(newBits, 0x00, m_bits.GetSize() * sizeof(FX_INT32)); + FX_INT32 size = m_size; + FX_INT32 i; + for (i = 0; i < size; i++) { + if (Get(size - i - 1)) { + newBits[i >> 5] |= 1 << (i & 0x1F); + } + } + FXSYS_memcpy32(&m_bits[0], newBits, m_bits.GetSize() * sizeof(FX_INT32)); + FX_Free(newBits); +} diff --git a/xfa/src/fxbarcode/common/BC_CommonBitArray.h b/xfa/src/fxbarcode/common/BC_CommonBitArray.h new file mode 100644 index 0000000000..484d87d5a7 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitArray.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONBITARRAY_H_ +#define _BC_COMMONBITARRAY_H_ +class CBC_CommonBitArray; +class CBC_CommonBitArray : public CFX_Object +{ +public: + CBC_CommonBitArray(CBC_CommonBitArray* array); + CBC_CommonBitArray(FX_INT32 size); + CBC_CommonBitArray(); + virtual ~CBC_CommonBitArray(); + FX_INT32 GetSize(); + CFX_Int32Array& GetBits(); + FX_INT32 GetSizeInBytes(); + FX_BOOL Get(FX_INT32 i); + void Set(FX_INT32 i); + void Flip(FX_INT32 i); + void SetBulk(FX_INT32 i, FX_INT32 newBits); + FX_BOOL IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e); + FX_INT32 *GetBitArray(); + void Reverse(); + void Clear(); +private: + FX_INT32 m_size; + CFX_Int32Array m_bits; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp new file mode 100644 index 0000000000..df24d1dabb --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.cpp @@ -0,0 +1,161 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonBitArray.h" +#include "BC_CommonBitMatrix.h" +CBC_CommonBitMatrix::CBC_CommonBitMatrix() +{ + m_width = 0; + m_height = 0; + m_rowSize = 0; + m_bits = NULL; +} +void CBC_CommonBitMatrix::Init(FX_INT32 dimension) +{ + m_width = dimension; + m_height = dimension; + FX_INT32 rowSize = (m_height + 31) >> 5; + m_rowSize = rowSize; + m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +void CBC_CommonBitMatrix::Init(FX_INT32 width, FX_INT32 height) +{ + m_width = width; + m_height = height; + FX_INT32 rowSize = (width + 31) >> 5; + m_rowSize = rowSize; + m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +CBC_CommonBitMatrix::~CBC_CommonBitMatrix() +{ + if (m_bits != NULL) { + FX_Free(m_bits); + } + m_bits = NULL; + m_height = m_width = m_rowSize = 0; +} +FX_BOOL CBC_CommonBitMatrix::Get(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + if (offset >= m_rowSize * m_height || offset < 0) { + return false; + } + return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0; +} +FX_INT32* CBC_CommonBitMatrix::GetBits() +{ + return m_bits; +} +void CBC_CommonBitMatrix::Set(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + if (offset >= m_rowSize * m_height || offset < 0) { + return; + } + m_bits[offset] |= 1 << (x & 0x1f); +} +void CBC_CommonBitMatrix::Flip(FX_INT32 x, FX_INT32 y) +{ + FX_INT32 offset = y * m_rowSize + (x >> 5); + m_bits[offset] ^= 1 << (x & 0x1f); +} +void CBC_CommonBitMatrix::Clear() +{ + FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); +} +void CBC_CommonBitMatrix::SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + if (top < 0 || left < 0) { + e = BCExceptionLeftAndTopMustBeNonnegative; + return; + } + if (height < 1 || width < 1) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + return; + } + FX_INT32 right = left + width; + FX_INT32 bottom = top + height; + if (m_height < bottom || m_width < right) { + e = BCExceptionRegionMustFitInsideMatrix; + return; + } + FX_INT32 y; + for (y = top; y < bottom; y++) { + FX_INT32 offset = y * m_rowSize; + FX_INT32 x; + for (x = left; x < right; x++) { + m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f); + } + } +} +CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(FX_INT32 y, CBC_CommonBitArray* row) +{ + CBC_CommonBitArray* rowArray = NULL; + if (row == NULL || row->GetSize() < m_width) { + rowArray = FX_NEW CBC_CommonBitArray(m_width); + } else { + rowArray = FX_NEW CBC_CommonBitArray(row); + } + FX_INT32 offset = y * m_rowSize; + FX_INT32 x; + for (x = 0; x < m_rowSize; x++) { + rowArray->SetBulk(x << 5, m_bits[offset + x]); + } + return rowArray; +} +void CBC_CommonBitMatrix::SetRow(FX_INT32 y, CBC_CommonBitArray* row) +{ + FX_INT32 l = y * m_rowSize; + for (FX_INT32 i = 0; i < m_rowSize; i++) { + m_bits[l] = row->GetBitArray()[i]; + l++; + } +} +void CBC_CommonBitMatrix::SetCol(FX_INT32 y, CBC_CommonBitArray* col) +{ + for (FX_INT32 i = 0; i < col->GetBits().GetSize(); i++) { + m_bits[i * m_rowSize + y] = col->GetBitArray()[i]; + } +} +FX_INT32 CBC_CommonBitMatrix::GetWidth() +{ + return m_width; +} +FX_INT32 CBC_CommonBitMatrix::GetHeight() +{ + return m_height; +} +FX_INT32 CBC_CommonBitMatrix::GetRowSize() +{ + return m_rowSize; +} +FX_INT32 CBC_CommonBitMatrix::GetDimension(FX_INT32 &e) +{ + if (m_width != m_height) { + e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; + return 0; + } + return m_width; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h new file mode 100644 index 0000000000..f69d7a0e33 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitMatrix.h @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONBITMATRIX_H_ +#define _BC_COMMONBITMATRIX_H_ +class CBC_CommonBitArray; +class CBC_CommonBitMatrix; +class CBC_CommonBitMatrix : public CFX_Object +{ +public: + CBC_CommonBitMatrix(); + virtual ~CBC_CommonBitMatrix(); + FX_BOOL Get(FX_INT32 x, FX_INT32 y); + void Set(FX_INT32 x, FX_INT32 y); + void Flip(FX_INT32 x, FX_INT32 y); + void Clear(); + void SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e); + CBC_CommonBitArray* GetRow(FX_INT32 y, CBC_CommonBitArray* row); + void SetRow(FX_INT32 y, CBC_CommonBitArray* row); + CBC_CommonBitArray* GetCol(FX_INT32 y, CBC_CommonBitArray* row); + void SetCol(FX_INT32 y, CBC_CommonBitArray* col); + FX_INT32 GetWidth(); + FX_INT32 GetHeight(); + FX_INT32 GetRowSize(); + FX_INT32 GetDimension(FX_INT32 &e); + virtual void Init(FX_INT32 dimension); + virtual void Init(FX_INT32 width, FX_INT32 height); + FX_INT32* GetBits(); +private: + FX_INT32 m_width; + FX_INT32 m_height; + FX_INT32 m_rowSize; + FX_INT32* m_bits; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp b/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp new file mode 100644 index 0000000000..b71848a60c --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitSource.cpp @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonBitSource.h" +CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) +{ + m_bytes.Copy((*bytes)); + m_bitOffset = 0; + m_byteOffset = 0; +} +CBC_CommonBitSource::~CBC_CommonBitSource() +{ +} +FX_INT32 CBC_CommonBitSource::ReadBits(FX_INT32 numBits, FX_INT32 &e) +{ + if (numBits < 1 || numBits > 32) { + e = BCExceptionIllegalArgument; + return 0; + } + FX_INT32 result = 0; + if (m_bitOffset > 0) { + FX_INT32 bitsLeft = 8 - m_bitOffset; + FX_INT32 toRead = numBits < bitsLeft ? numBits : bitsLeft; + FX_INT32 bitsToNotRead = bitsLeft - toRead; + FX_INT32 mask = (0xff >> (8 - toRead)) << bitsToNotRead; + result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead; + numBits -= toRead; + m_bitOffset += toRead; + if (m_bitOffset == 8) { + m_bitOffset = 0; + m_byteOffset++; + } + } + if (numBits > 0) { + while(numBits >= 8) { + result = (result << 8) | (m_bytes[m_byteOffset] & 0xff); + m_byteOffset++; + numBits -= 8; + } + if (numBits > 0) { + FX_INT32 bitsToNotRead = 8 - numBits; + FX_INT32 mask = (0xff >> bitsToNotRead) << bitsToNotRead; + result = (result << numBits) | ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead); + m_bitOffset += numBits; + } + } + return result; +} +FX_INT32 CBC_CommonBitSource::Available() +{ + return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset; +} +FX_INT32 CBC_CommonBitSource::getByteOffset() +{ + return m_byteOffset; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonBitSource.h b/xfa/src/fxbarcode/common/BC_CommonBitSource.h new file mode 100644 index 0000000000..53891cf671 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonBitSource.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONBITSOURCE_H_ +#define _BC_COMMONBITSOURCE_H_ +class CBC_CommonBitSource; +class CBC_CommonBitSource : public CFX_Object +{ +public: + CBC_CommonBitSource(CFX_ByteArray *bytes); + virtual ~CBC_CommonBitSource(); + FX_INT32 ReadBits(FX_INT32 numBits, FX_INT32 &e); + FX_INT32 Available(); + FX_INT32 getByteOffset(); +private: + CFX_ByteArray m_bytes; + FX_INT32 m_byteOffset; + FX_INT32 m_bitOffset; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp b/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp new file mode 100644 index 0000000000..99e97d38d8 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonByteArray.cpp @@ -0,0 +1,114 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonByteArray.h" +CBC_CommonByteArray::CBC_CommonByteArray() +{ + m_bytes = NULL; + m_size = 0; + m_index = 0; +} +CBC_CommonByteArray::CBC_CommonByteArray(FX_INT32 size) +{ + m_size = size; + m_bytes = FX_Alloc(FX_BYTE, size); + FXSYS_memset32(m_bytes, 0, size); + m_index = 0; +} +CBC_CommonByteArray::CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size) +{ + m_size = size; + m_bytes = FX_Alloc(FX_BYTE, size); + FXSYS_memcpy32(m_bytes, byteArray, size); + m_index = size; +} +CBC_CommonByteArray::~CBC_CommonByteArray() +{ + if ( m_bytes != NULL) { + FX_Free( m_bytes ); + m_bytes = NULL; + } + m_index = 0; + m_size = 0; +} +FX_INT32 CBC_CommonByteArray::At(FX_INT32 index) +{ + return m_bytes[index] & 0xff; +} +void CBC_CommonByteArray::Set(FX_INT32 index, FX_INT32 value) +{ + m_bytes[index] = (FX_BYTE) value; +} +FX_INT32 CBC_CommonByteArray::Size() +{ + return m_size; +} +FX_BOOL CBC_CommonByteArray::IsEmpty() +{ + return m_size == 0; +} +void CBC_CommonByteArray::AppendByte(FX_INT32 value) +{ + if (m_size == 0 || m_index >= m_size) { + FX_INT32 newSize = FX_MAX(32, m_size << 1); + Reserve(newSize); + } + m_bytes[m_index] = (FX_BYTE)value; + m_index++; +} +void CBC_CommonByteArray::Reserve(FX_INT32 capacity) +{ + if (m_bytes == NULL || m_size < capacity) { + FX_BYTE *newArray = FX_Alloc(FX_BYTE, capacity); + FXSYS_memset32(newArray, 0, capacity); + if (m_bytes != NULL) { + FXSYS_memcpy32(newArray, m_bytes, m_size); + FX_Free( m_bytes ); + } + m_bytes = newArray; + m_size = capacity; + } +} +void CBC_CommonByteArray::Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count) +{ + if (m_bytes != NULL) { + FX_Free( m_bytes ); + } + m_bytes = FX_Alloc(FX_BYTE, count); + m_size = count; + FXSYS_memcpy32(m_bytes, source + offset, count); + m_index = count; +} +void CBC_CommonByteArray::Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count) +{ + if (m_bytes != NULL) { + FX_Free( m_bytes ); + } + m_bytes = FX_Alloc(FX_BYTE, count); + m_size = count; + FX_INT32 i; + for(i = 0; i < count; i++) { + m_bytes[i] = source->operator [](i + offset); + } + m_index = m_size; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonByteArray.h b/xfa/src/fxbarcode/common/BC_CommonByteArray.h new file mode 100644 index 0000000000..fe0a67ffd1 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonByteArray.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONBYTEARRAY_H_ +#define _BC_COMMONBYTEARRAY_H_ +class CBC_CommonByteArray; +class CBC_CommonByteArray : public CFX_Object +{ +private: + FX_INT32 m_size; + FX_INT32 m_index; + FX_BYTE* m_bytes; +public: + CBC_CommonByteArray(); + CBC_CommonByteArray(FX_INT32 size); + CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size); + virtual ~CBC_CommonByteArray(); + FX_INT32 At(FX_INT32 index); + void Set(FX_INT32 index, FX_INT32 value); + FX_INT32 Size(); + FX_BOOL IsEmpty(); + void AppendByte(FX_INT32 value); + void Reserve(FX_INT32 capacity); + void Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count); + void Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count); +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp new file mode 100644 index 0000000000..27c8615bf9 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.cpp @@ -0,0 +1,76 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonByteMatrix.h" +CBC_CommonByteMatrix::CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height) +{ + m_height = height; + m_width = width; + m_bytes = NULL; +} +void CBC_CommonByteMatrix::Init() +{ + m_bytes = FX_Alloc(FX_BYTE, m_height * m_width); + FXSYS_memset8(m_bytes, 0xff, m_height * m_width); +} +CBC_CommonByteMatrix::~CBC_CommonByteMatrix() +{ + if(m_bytes != NULL) { + FX_Free(m_bytes); + m_bytes = NULL; + } +} +FX_INT32 CBC_CommonByteMatrix::GetHeight() +{ + return m_height; +} +FX_INT32 CBC_CommonByteMatrix::GetWidth() +{ + return m_width; +} +FX_BYTE CBC_CommonByteMatrix::Get(FX_INT32 x, FX_INT32 y) +{ + return m_bytes[y * m_width + x]; +} +void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_INT32 value) +{ + m_bytes[y * m_width + x] = (FX_BYTE)value; +} +void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_BYTE value) +{ + m_bytes[y * m_width + x] = value; +} +void CBC_CommonByteMatrix::clear(FX_BYTE value) +{ + FX_INT32 y; + for(y = 0; y < m_height; y++) { + FX_INT32 x; + for(x = 0; x < m_width; x++) { + m_bytes[y * m_width + x] = value; + } + } +} +FX_BYTE* CBC_CommonByteMatrix::GetArray() +{ + return m_bytes; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h new file mode 100644 index 0000000000..3d831d1911 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonByteMatrix.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONBYTEMATRIX_H_ +#define _BC_COMMONBYTEMATRIX_H_ +class CBC_CommonByteMatrix; +class CBC_CommonByteMatrix : public CFX_Object +{ +public: + CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height); + virtual ~CBC_CommonByteMatrix(); + FX_INT32 GetHeight(); + FX_INT32 GetWidth(); + FX_BYTE Get(FX_INT32 x, FX_INT32 y); + FX_BYTE* GetArray(); + + void Set(FX_INT32 x, FX_INT32 y, FX_INT32 value); + void Set(FX_INT32 x, FX_INT32 y, FX_BYTE value); + void clear(FX_BYTE value); + virtual void Init(); +private: + FX_BYTE *m_bytes; + FX_INT32 m_width; + FX_INT32 m_height; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp new file mode 100644 index 0000000000..2909704796 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.cpp @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonECI.h" +#include "BC_CommonCharacterSetECI.h" +void CBC_CommonCharacterSetECI::initialize() +{ +} +CBC_CommonCharacterSetECI::CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName): + CBC_CommonECI(value), m_encodingName(encodingName) +{ +} +CBC_CommonCharacterSetECI::~CBC_CommonCharacterSetECI() +{ +} +CFX_ByteString CBC_CommonCharacterSetECI::GetEncodingName() +{ + return m_encodingName; +} +void CBC_CommonCharacterSetECI::AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName) +{ +} +CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(FX_INT32 value) +{ + return NULL; +} +CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByName(const CFX_ByteString& name) +{ + return NULL; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h new file mode 100644 index 0000000000..1e9f9a433f --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonCharacterSetECI.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONCHARACTERSETECI_H_ +#define _BC_COMMONCHARACTERSETECI_H_ +class CBC_CommonECI; +class CBC_CommonCharacterSetECI; +class CBC_CommonCharacterSetECI : public CBC_CommonECI +{ +public: + CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName); + virtual ~CBC_CommonCharacterSetECI(); + CFX_ByteString GetEncodingName(); + static void AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName); + FX_INT32 GetValue(); + static CBC_CommonCharacterSetECI* GetCharacterSetECIByValue(FX_INT32 value); + static CBC_CommonCharacterSetECI* GetCharacterSetECIByName(const CFX_ByteString& name); +private: + CFX_ByteString m_encodingName; + static void initialize(); +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp new file mode 100644 index 0000000000..d0c55734db --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.cpp @@ -0,0 +1,79 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../qrcode/BC_QRCoderErrorCorrectionLevel.h" +#include "../pdf417/BC_PDF417ResultMetadata.h" +#include "BC_CommonDecoderResult.h" +CBC_CommonDecoderResult::CBC_CommonDecoderResult() +{ +} +void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) +{ + if(text.IsEmpty()) { + e = BCExceptionIllegalArgument; + return; + } + m_rawBytes.Copy(rawBytes); + m_text = text; + m_byteSegments.Copy(byteSegments); + m_ecLevel = ecLevel; + m_other = NULL; +} +void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e) +{ + if(text.IsEmpty()) { + e = BCExceptionIllegalArgument; + return; + } + m_rawBytes.Copy(rawBytes); + m_text = text; + m_pdf417byteSegments.Copy(byteSegments); + m_pdf417ecLevel = ecLevel; + m_other = NULL; +} +void CBC_CommonDecoderResult::setOther(CBC_PDF417ResultMetadata* other) +{ + m_other = other; +} +CBC_CommonDecoderResult::~CBC_CommonDecoderResult() +{ + if (m_other != NULL) { + delete m_other; + } +} +const CFX_ByteArray& CBC_CommonDecoderResult::GetRawBytes() +{ + return m_rawBytes; +} +const CFX_Int32Array& CBC_CommonDecoderResult::GetByteSegments() +{ + return m_byteSegments; +} +const CFX_ByteString& CBC_CommonDecoderResult::GetText() +{ + return m_text; +} +CBC_QRCoderErrorCorrectionLevel* CBC_CommonDecoderResult::GetECLevel() +{ + return m_ecLevel; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h new file mode 100644 index 0000000000..808203bd01 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonDecoderResult.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONDECODERRESULT_H_ +#define _BC_COMMONDECODERRESULT_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_PDF417ResultMetadata; +class CBC_CommonDecoderResult; +class CBC_CommonDecoderResult : public CFX_Object +{ +public: + CBC_CommonDecoderResult(); + virtual ~CBC_CommonDecoderResult(); + const CFX_ByteArray& GetRawBytes(); + const CFX_ByteString& GetText(); + const CFX_Int32Array& GetByteSegments(); + CBC_QRCoderErrorCorrectionLevel* GetECLevel(); + virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); + virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e); + void setOther(CBC_PDF417ResultMetadata* other); +private: + CFX_ByteArray m_rawBytes; + CFX_ByteString m_text; + CFX_Int32Array m_byteSegments; + CFX_PtrArray m_pdf417byteSegments; + CBC_QRCoderErrorCorrectionLevel* m_ecLevel; + CFX_ByteString m_pdf417ecLevel; + CBC_PDF417ResultMetadata* m_other; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonECI.cpp b/xfa/src/fxbarcode/common/BC_CommonECI.cpp new file mode 100644 index 0000000000..5aa64095f7 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonECI.cpp @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonECI.h" +#include "BC_CommonCharacterSetECI.h" +CBC_CommonECI::CBC_CommonECI(FX_INT32 value) +{ + m_value = value; +} +CBC_CommonECI::~CBC_CommonECI() +{ +} +FX_INT32 CBC_CommonECI::GetValue() +{ + return m_value; +} +CBC_CommonECI* CBC_CommonECI::GetEICByValue(FX_INT32 value, FX_INT32 &e) +{ + if(value < 0 || value > 999999) { + e = BCExceptionBadECI; + return NULL; + } + if(value < 900) { + } + return NULL; +} diff --git a/xfa/src/fxbarcode/common/BC_CommonECI.h b/xfa/src/fxbarcode/common/BC_CommonECI.h new file mode 100644 index 0000000000..3907066066 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonECI.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONECI_H_ +#define _BC_COMMONECI_H_ +class CBC_CommonECI; +class CBC_CommonECI : public CFX_Object +{ +public: + CBC_CommonECI(FX_INT32 value); + virtual ~CBC_CommonECI(); + + FX_INT32 GetValue(); + static CBC_CommonECI* GetEICByValue(FX_INT32 value, FX_INT32 &e); +private: + FX_INT32 m_value; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp new file mode 100644 index 0000000000..cb59d99cdf --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.cpp @@ -0,0 +1,125 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_CommonPerspectiveTransform.h" +CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, + FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, + FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33) : + m_a11(a11), m_a21(a21), m_a31(a31), + m_a12(a12), m_a22(a22), m_a32(a32), + m_a13(a13), m_a23(a23), m_a33(a33) +{ +} +CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() +{ +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x0p, FX_FLOAT y0p, + FX_FLOAT x1p, FX_FLOAT y1p, + FX_FLOAT x2p, FX_FLOAT y2p, + FX_FLOAT x3p, FX_FLOAT y3p) +{ + CBC_AutoPtr qToS(QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3)); + CBC_AutoPtr sToQ(SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p)); + return sToQ->Times(*(qToS.get())); +} +void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray *points) +{ + FX_INT32 max = points->GetSize(); + FX_FLOAT a11 = m_a11; + FX_FLOAT a12 = m_a12; + FX_FLOAT a13 = m_a13; + FX_FLOAT a21 = m_a21; + FX_FLOAT a22 = m_a22; + FX_FLOAT a23 = m_a23; + FX_FLOAT a31 = m_a31; + FX_FLOAT a32 = m_a32; + FX_FLOAT a33 = m_a33; + FX_INT32 i; + for (i = 0; i < max; i += 2) { + FX_FLOAT x = (*points)[i]; + FX_FLOAT y = (*points)[i + 1]; + FX_FLOAT denominator = a13 * x + a23 * y + a33; + (*points)[i] = (a11 * x + a21 * y + a31) / denominator; + (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator; + } +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3) +{ + FX_FLOAT dy2 = y3 - y2; + FX_FLOAT dy3 = y0 - y1 + y2 - y3; + if ((dy2 == 0.0f) && (dy3 == 0.0f)) { + return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, + y1 - y0, y2 - y1, y0, + 0.0f, 0.0f, 1.0f); + } else { + FX_FLOAT dx1 = x1 - x2; + FX_FLOAT dx2 = x3 - x2; + FX_FLOAT dx3 = x0 - x1 + x2 - x3; + FX_FLOAT dy1 = y1 - y2; + FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1; + FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator; + FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator; + return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, + y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, + a13, a23, 1.0f); + } +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3) +{ + CBC_AutoPtr temp1(SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3)); + return temp1->BuildAdjoint(); +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::BuildAdjoint() +{ + return FX_NEW CBC_CommonPerspectiveTransform(m_a22 * m_a33 - m_a23 * m_a32, + m_a23 * m_a31 - m_a21 * m_a33, + m_a21 * m_a32 - m_a22 * m_a31, + m_a13 * m_a32 - m_a12 * m_a33, + m_a11 * m_a33 - m_a13 * m_a31, + m_a12 * m_a31 - m_a11 * m_a32, + m_a12 * m_a23 - m_a13 * m_a22, + m_a13 * m_a21 - m_a11 * m_a23, + m_a11 * m_a22 - m_a12 * m_a21); +} +CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::Times(CBC_CommonPerspectiveTransform &other) +{ + return FX_NEW CBC_CommonPerspectiveTransform(m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13, + m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23, + m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33, + m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13, + m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23, + m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33, + m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13, + m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23, + m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33); +} diff --git a/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h new file mode 100644 index 0000000000..5c42a1a6a7 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_CommonPerspectiveTransform.h @@ -0,0 +1,39 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMMONPERSPECTIVETRANSFORM_H_ +#define _BC_COMMONPERSPECTIVETRANSFORM_H_ +class CBC_CommonPerspectiveTransform; +class CBC_CommonPerspectiveTransform : public CFX_Object +{ +public: + CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, + FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, + FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33); + virtual ~CBC_CommonPerspectiveTransform(); + static CBC_CommonPerspectiveTransform *QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x0p, FX_FLOAT y0p, + FX_FLOAT x1p, FX_FLOAT y1p, + FX_FLOAT x2p, FX_FLOAT y2p, + FX_FLOAT x3p, FX_FLOAT y3p); + static CBC_CommonPerspectiveTransform *SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3); + static CBC_CommonPerspectiveTransform *QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, + FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3); + CBC_CommonPerspectiveTransform *BuildAdjoint(); + CBC_CommonPerspectiveTransform *Times(CBC_CommonPerspectiveTransform &other); + void TransformPoints(CFX_FloatArray *points); +private: + FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp new file mode 100644 index 0000000000..7ef1671d98 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.cpp @@ -0,0 +1,169 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Binarizer.h" +#include "../BC_LuminanceSource.h" +#include "BC_CommonBitMatrix.h" +#include "BC_CommonBitArray.h" +#include "BC_GlobalHistogramBinarizer.h" +const FX_INT32 LUMINANCE_BITS = 5; +const FX_INT32 LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; +const FX_INT32 LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; +CBC_GlobalHistogramBinarizer::CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source): CBC_Binarizer(source) +{ +} +CBC_GlobalHistogramBinarizer::~CBC_GlobalHistogramBinarizer() +{ +} +CBC_CommonBitArray *CBC_GlobalHistogramBinarizer::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) +{ + CBC_LuminanceSource *source = GetLuminanceSource(); + FX_INT32 width = source->GetWidth(); + CBC_AutoPtr result(FX_NEW CBC_CommonBitArray(width)); + InitArrays(width); + CFX_ByteArray *localLuminances = source->GetRow(y, m_luminance, e); + if (e != BCExceptionNO) { + return result.release(); + } + CFX_Int32Array localBuckets; + localBuckets.Copy(m_buckets); + FX_INT32 x; + for (x = 0; x < width; x++) { + FX_INT32 pixel = (*localLuminances)[x] & 0xff; + localBuckets[pixel >> LUMINANCE_SHIFT]++; + } + FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); + if (e != BCExceptionNO) { + return result.release(); + } + FX_INT32 left = (*localLuminances)[0] & 0xff; + FX_INT32 center = (*localLuminances)[1] & 0xff; + for (x = 1; x < width - 1; x++) { + FX_INT32 right = (*localLuminances)[x + 1] & 0xff; + FX_INT32 luminance = ((center << 2) - left - right) >> 1; + if (luminance < blackPoint) { + result->Set(x); + } + left = center; + center = right; + } + return result.release(); +} +CBC_CommonBitMatrix *CBC_GlobalHistogramBinarizer::GetBlackMatrix(FX_INT32 &e) +{ + CBC_LuminanceSource *source = GetLuminanceSource(); + FX_INT32 width = source->GetWidth(); + FX_INT32 height = source->GetHeight(); + CBC_CommonBitMatrix *BitMatrixTemp = FX_NEW CBC_CommonBitMatrix(); + BitMatrixTemp->Init(width, height); + CBC_AutoPtr matrix(BitMatrixTemp); + InitArrays(width); + CFX_Int32Array localBuckets; + localBuckets.Copy(m_buckets); + FX_INT32 y; + for (y = 1; y < 5; y++) { + FX_INT32 row = height * y / 5; + CFX_ByteArray *localLuminances = source->GetRow(row, m_luminance, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 right = (width << 2) / 5; + FX_INT32 x; + for (x = width / 5; x < right; x++) { + FX_INT32 pixel = (*localLuminances)[x] & 0xff; + localBuckets[pixel >> LUMINANCE_SHIFT]++; + } + } + FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr localLuminances(source->GetMatrix()); + for (y = 0; y < height; y++) { + FX_INT32 offset = y * width; + for (FX_INT32 x = 0; x < width; x++) { + FX_INT32 pixel = (*localLuminances)[offset + x] & 0xff; + if (pixel < blackPoint) { + matrix->Set(x, y); + } + } + } + return matrix.release(); +} +void CBC_GlobalHistogramBinarizer::InitArrays(FX_INT32 luminanceSize) +{ + if(m_luminance.GetSize() < luminanceSize) { + m_luminance.SetSize(luminanceSize); + } + if(m_buckets.GetSize() <= 0) { + m_buckets.SetSize(LUMINANCE_BUCKETS); + } else { + FX_INT32 x; + for(x = 0; x < LUMINANCE_BUCKETS; x++) { + m_buckets[x] = 0; + } + } +} +FX_INT32 CBC_GlobalHistogramBinarizer::EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e) +{ + FX_INT32 numBuckets = buckets.GetSize(); + FX_INT32 maxBucketCount = 0; + FX_INT32 firstPeak = 0; + FX_INT32 firstPeakSize = 0; + FX_INT32 x; + for (x = 0; x < numBuckets; x++) { + if (buckets[x] > firstPeakSize) { + firstPeak = x; + firstPeakSize = buckets[x]; + } + if (buckets[x] > maxBucketCount) { + maxBucketCount = buckets[x]; + } + } + FX_INT32 secondPeak = 0; + FX_INT32 secondPeakScore = 0; + for (x = 0; x < numBuckets; x++) { + FX_INT32 distanceToBiggest = x - firstPeak; + FX_INT32 score = buckets[x] * distanceToBiggest * distanceToBiggest; + if (score > secondPeakScore) { + secondPeak = x; + secondPeakScore = score; + } + } + if (firstPeak > secondPeak) { + FX_INT32 temp = firstPeak; + firstPeak = secondPeak; + secondPeak = temp; + } + if (secondPeak - firstPeak <= numBuckets >> 4) { + e = BCExceptionRead; + return 0; + } + FX_INT32 bestValley = secondPeak - 1; + FX_INT32 bestValleyScore = -1; + for (x = secondPeak - 1; x > firstPeak; x--) { + FX_INT32 fromFirst = x - firstPeak; + FX_INT32 score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); + if (score > bestValleyScore) { + bestValley = x; + bestValleyScore = score; + } + } + return bestValley << LUMINANCE_SHIFT; +} diff --git a/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h new file mode 100644 index 0000000000..ef084c075e --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h @@ -0,0 +1,28 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_GLOBALHISTOGRAMBINARIZER_H_ +#define _BC_GLOBALHISTOGRAMBINARIZER_H_ +class CBC_CommonBinarizer; +class CBC_CommonBitArray; +class CBC_CommonBitMatrix; +class CBC_LuminanceSource; +class CBC_GlobalHistogramBinarizer; +class CBC_GlobalHistogramBinarizer : public CBC_Binarizer +{ +public: + CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source); + virtual ~CBC_GlobalHistogramBinarizer(); + + void InitArrays(FX_INT32 luminanceSize); + CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e); + CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); + static FX_INT32 EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e); +private: + CFX_ByteArray m_luminance; + CFX_Int32Array m_buckets; +}; +#endif diff --git a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp new file mode 100644 index 0000000000..8bc93136ca --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.cpp @@ -0,0 +1,244 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_WhiteRectangleDetector.h" +#include "BC_CommonBitMatrix.h" +#include "../BC_ResultPoint.h" +const FX_INT32 CBC_WhiteRectangleDetector::INIT_SIZE = 30; +const FX_INT32 CBC_WhiteRectangleDetector::CORR = 1; +CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image) +{ + m_image = image; + m_height = image->GetHeight(); + m_width = image->GetWidth(); + m_leftInit = (m_width - INIT_SIZE) >> 1; + m_rightInit = (m_width + INIT_SIZE) >> 1; + m_upInit = (m_height - INIT_SIZE) >> 1; + m_downInit = (m_height + INIT_SIZE) >> 1; +} +void CBC_WhiteRectangleDetector::Init(FX_INT32 &e) +{ + if (m_upInit < 0 || m_leftInit < 0 || m_downInit >= m_height || m_rightInit >= m_width) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y) +{ + m_image = image; + m_height = image->GetHeight(); + m_width = image->GetWidth(); + FX_INT32 halfsize = initSize >> 1; + m_leftInit = x - halfsize; + m_rightInit = x + halfsize; + m_upInit = y - halfsize; + m_downInit = y + halfsize; +} +CBC_WhiteRectangleDetector::~CBC_WhiteRectangleDetector() +{ +} +CFX_PtrArray *CBC_WhiteRectangleDetector::Detect(FX_INT32 &e) +{ + FX_INT32 left = m_leftInit; + FX_INT32 right = m_rightInit; + FX_INT32 up = m_upInit; + FX_INT32 down = m_downInit; + FX_BOOL sizeExceeded = FALSE; + FX_BOOL aBlackPointFoundOnBorder = TRUE; + FX_BOOL atLeastOneBlackPointFoundOnBorder = FALSE; + while (aBlackPointFoundOnBorder) { + aBlackPointFoundOnBorder = FALSE; + FX_BOOL rightBorderNotWhite = TRUE; + while (rightBorderNotWhite && right < m_width) { + rightBorderNotWhite = ContainsBlackPoint(up, down, right, FALSE); + if (rightBorderNotWhite) { + right++; + aBlackPointFoundOnBorder = TRUE; + } + } + if (right >= m_width) { + sizeExceeded = TRUE; + break; + } + FX_BOOL bottomBorderNotWhite = TRUE; + while (bottomBorderNotWhite && down < m_height) { + bottomBorderNotWhite = ContainsBlackPoint(left, right, down, TRUE); + if (bottomBorderNotWhite) { + down++; + aBlackPointFoundOnBorder = TRUE; + } + } + if (down >= m_height) { + sizeExceeded = TRUE; + break; + } + FX_BOOL leftBorderNotWhite = TRUE; + while (leftBorderNotWhite && left >= 0) { + leftBorderNotWhite = ContainsBlackPoint(up, down, left, FALSE); + if (leftBorderNotWhite) { + left--; + aBlackPointFoundOnBorder = TRUE; + } + } + if (left < 0) { + sizeExceeded = TRUE; + break; + } + FX_BOOL topBorderNotWhite = TRUE; + while (topBorderNotWhite && up >= 0) { + topBorderNotWhite = ContainsBlackPoint(left, right, up, TRUE); + if (topBorderNotWhite) { + up--; + aBlackPointFoundOnBorder = TRUE; + } + } + if (up < 0) { + sizeExceeded = TRUE; + break; + } + if (aBlackPointFoundOnBorder) { + atLeastOneBlackPointFoundOnBorder = TRUE; + } + } + if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { + FX_INT32 maxSize = right - left; + CBC_AutoPtr z(NULL); + for (FX_INT32 i = 1; i < maxSize; i++) { + z = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(down - i), (FX_FLOAT)(left + i), (FX_FLOAT)(down)) ); + if (z.get() != NULL) { + break; + } + } + if (z.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr t(NULL); + for (FX_INT32 j = 1; j < maxSize; j++) { + t = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(up + j), (FX_FLOAT)(left + j), (FX_FLOAT)up)); + if (t.get() != NULL) { + break; + } + } + if (t.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr x(NULL); + for (FX_INT32 k = 1; k < maxSize; k++) { + x = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(up + k), (FX_FLOAT)(right - k), (FX_FLOAT)up)); + if (x.get() != NULL) { + break; + } + } + if (x.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_AutoPtr y(NULL); + for (FX_INT32 m = 1; m < maxSize; m++) { + y = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(down - m), (FX_FLOAT)(right - m), (FX_FLOAT) down)); + if (y.get() != NULL) { + break; + } + } + if (y.get() == NULL) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return CenterEdges(y.get(), z.get(), x.get(), t.get()); + } else { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return NULL; +} +FX_INT32 CBC_WhiteRectangleDetector::Round(FX_FLOAT d) +{ + return (FX_INT32) (d + 0.5f); +} +CBC_ResultPoint *CBC_WhiteRectangleDetector::GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) +{ + FX_INT32 dist = DistanceL2(aX, aY, bX, bY); + float xStep = (bX - aX) / dist; + float yStep = (bY - aY) / dist; + for (FX_INT32 i = 0; i < dist; i++) { + FX_INT32 x = Round(aX + i * xStep); + FX_INT32 y = Round(aY + i * yStep); + if (m_image->Get(x, y)) { + return FX_NEW CBC_ResultPoint((FX_FLOAT)x, (FX_FLOAT) y); + } + } + return NULL; +} +FX_INT32 CBC_WhiteRectangleDetector::DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) +{ + float xDiff = aX - bX; + float yDiff = aY - bY; + return Round((float)sqrt(xDiff * xDiff + yDiff * yDiff)); +} +CFX_PtrArray *CBC_WhiteRectangleDetector::CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, CBC_ResultPoint *x, CBC_ResultPoint *t) +{ + float yi = y->GetX(); + float yj = y->GetY(); + float zi = z->GetX(); + float zj = z->GetY(); + float xi = x->GetX(); + float xj = x->GetY(); + float ti = t->GetX(); + float tj = t->GetY(); + if (yi < m_width / 2) { + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + (*result)[0] = FX_NEW CBC_ResultPoint(ti - CORR, tj + CORR); + (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj + CORR); + (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj - CORR); + (*result)[3] = FX_NEW CBC_ResultPoint(yi + CORR, yj - CORR); + return result; + } else { + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + (*result)[0] = FX_NEW CBC_ResultPoint(ti + CORR, tj + CORR); + (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj - CORR); + (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj + CORR); + (*result)[3] = FX_NEW CBC_ResultPoint(yi - CORR, yj - CORR); + return result; + } +} +FX_BOOL CBC_WhiteRectangleDetector::ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal) +{ + if (horizontal) { + for (FX_INT32 x = a; x <= b; x++) { + if (m_image->Get(x, fixed)) { + return TRUE; + } + } + } else { + for (FX_INT32 y = a; y <= b; y++) { + if (m_image->Get(fixed, y)) { + return TRUE; + } + } + } + return FALSE; +} diff --git a/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h new file mode 100644 index 0000000000..83d91ced92 --- /dev/null +++ b/xfa/src/fxbarcode/common/BC_WhiteRectangleDetector.h @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_WHITERECTANLEDETECTOR_H_ +#define _BC_WHITERECTANLEDETECTOR_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_WhiteRectangleDetector; +class CBC_WhiteRectangleDetector : public CFX_Object +{ +public: + CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image); + CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y); + virtual ~CBC_WhiteRectangleDetector(); + CFX_PtrArray *Detect(FX_INT32 &e); + virtual void Init(FX_INT32 &e); +private: + FX_INT32 Round(float d); + CBC_ResultPoint *GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); + FX_INT32 DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); + CFX_PtrArray *CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, + CBC_ResultPoint *x, CBC_ResultPoint *t); + FX_BOOL ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal); + const static FX_INT32 INIT_SIZE; + const static FX_INT32 CORR; + + CBC_CommonBitMatrix *m_image; + FX_INT32 m_height; + FX_INT32 m_width; + FX_INT32 m_leftInit; + FX_INT32 m_rightInit; + FX_INT32 m_downInit; + FX_INT32 m_upInit; +}; +#endif diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp new file mode 100644 index 0000000000..1fc8b6685a --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp @@ -0,0 +1,100 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../barcode.h" +#include "BC_ReedSolomonGF256.h" +#include "BC_ReedSolomonGF256Poly.h" +#include "BC_ReedSolomon.h" +CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) +{ + m_field = field; +} +void CBC_ReedSolomonEncoder::Init() +{ + m_cachedGenerators.Add(FX_NEW CBC_ReedSolomonGF256Poly(m_field, 1)); +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(FX_INT32 degree, FX_INT32 &e) +{ + if(degree >= m_cachedGenerators.GetSize()) { + CBC_ReedSolomonGF256Poly* lastGenerator = (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[m_cachedGenerators.GetSize() - 1]); + for(FX_INT32 d = m_cachedGenerators.GetSize(); d <= degree; d++) { + CFX_Int32Array temp; + temp.Add(1); + temp.Add(m_field->Exp(d - 1)); + CBC_ReedSolomonGF256Poly temp_poly; + temp_poly.Init(m_field, &temp, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ReedSolomonGF256Poly* nextGenerator = lastGenerator->Multiply(&temp_poly, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + m_cachedGenerators.Add(nextGenerator); + lastGenerator = nextGenerator; + } + } + return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]); +} +void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e) +{ + if(ecBytes == 0) { + e = BCExceptionNoCorrectionBytes; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 dataBytes = toEncode->GetSize() - ecBytes; + if(dataBytes <= 0) { + e = BCExceptionNoDataBytesProvided; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_Int32Array infoCoefficients; + infoCoefficients.SetSize(dataBytes); + for(FX_INT32 x = 0; x < dataBytes; x++) { + infoCoefficients[x] = toEncode->operator [](x); + } + CBC_ReedSolomonGF256Poly info; + info.Init(m_field, &infoCoefficients, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_ReedSolomonGF256Poly* rsg = info.MultiplyByMonomial(ecBytes, 1, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr infoTemp(rsg); + CFX_PtrArray *pa = infoTemp->Divide(generator, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr temp(pa); + CBC_ReedSolomonGF256Poly* remainder = (CBC_ReedSolomonGF256Poly*)(temp->operator [](1)); + CFX_Int32Array* coefficients = remainder->GetCoefficients(); + FX_INT32 numZeroCoefficients = ecBytes - coefficients->GetSize(); + for(FX_INT32 i = 0; i < numZeroCoefficients; i++) { + (*toEncode)[dataBytes + i] = 0; + } + for(FX_INT32 y = 0; y < coefficients->GetSize(); y++) { + (*toEncode)[dataBytes + numZeroCoefficients + y] = + coefficients->operator [](y); + } + for (FX_INT32 k = 0; k < temp->GetSize(); k++) { + delete (CBC_ReedSolomonGF256Poly*)(*temp)[k]; + } +} +CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() +{ + for (FX_INT32 i = 0; i < m_cachedGenerators.GetSize(); i++) { + delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i]; + } +} diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h new file mode 100644 index 0000000000..2950b8f315 --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomon.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_READSOLOMON_H_ +#define _BC_READSOLOMON_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonEncoder; +class CBC_ReedSolomonEncoder : public CFX_Object +{ +private: + CBC_ReedSolomonGF256* m_field; + CFX_PtrArray m_cachedGenerators; + CBC_ReedSolomonGF256Poly* BuildGenerator(FX_INT32 degree, FX_INT32 &e); +public: + CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256 * field); + virtual ~CBC_ReedSolomonEncoder(); + + void Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp new file mode 100644 index 0000000000..3cb5e7762f --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.cpp @@ -0,0 +1,224 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../barcode.h" +#include "BC_ReedSolomonGF256.h" +#include "BC_ReedSolomonGF256Poly.h" +#include "BC_ReedSolomonDecoder.h" +CBC_ReedSolomonDecoder::CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field) +{ + m_field = field; +} +CBC_ReedSolomonDecoder::~CBC_ReedSolomonDecoder() +{ +} +void CBC_ReedSolomonDecoder::Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e) +{ + CBC_ReedSolomonGF256Poly poly; + poly.Init(m_field, received, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_Int32Array syndromeCoefficients; + syndromeCoefficients.SetSize(twoS); + FX_BOOL dataMatrix = FALSE; + FX_BOOL noError = TRUE; + for (FX_INT32 i = 0; i < twoS; i++) { + FX_INT32 eval = poly.EvaluateAt(m_field->Exp(dataMatrix ? i + 1 : i)); + syndromeCoefficients[twoS - 1 - i] = eval; + if (eval != 0) { + noError = FALSE; + } + } + if(noError) { + return; + } + CBC_ReedSolomonGF256Poly syndrome; + syndrome.Init(m_field, &syndromeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_ReedSolomonGF256Poly* rsg = m_field->BuildMonomial(twoS, 1, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr temp(rsg); + CFX_PtrArray* pa = RunEuclideanAlgorithm(temp.get(), &syndrome, twoS, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr sigmaOmega(pa); + CBC_AutoPtr sigma((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[0]); + CBC_AutoPtr omega((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[1]); + CFX_Int32Array* ia1 = FindErrorLocations(sigma.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr errorLocations(ia1); + CFX_Int32Array* ia2 = FindErrorMagnitudes(omega.get(), errorLocations.get(), dataMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_AutoPtr errorMagnitudes(ia2); + for (FX_INT32 k = 0; k < errorLocations->GetSize(); k++) { + FX_INT32 position = received->GetSize() - 1 - m_field->Log((*errorLocations)[k], e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(position < 0) { + e = BCExceptionBadErrorLocation; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + (*received)[position] = CBC_ReedSolomonGF256::AddOrSubtract((*received)[position], (*errorMagnitudes)[k]); + } +} +CFX_PtrArray *CBC_ReedSolomonDecoder::RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e) +{ + if (a->GetDegree() < b->GetDegree()) { + CBC_ReedSolomonGF256Poly* temp = a; + a = b; + b = temp; + } + CBC_ReedSolomonGF256Poly* rsg1 = a->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr rLast(rsg1); + CBC_ReedSolomonGF256Poly* rsg2 = b->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr r(rsg2); + CBC_ReedSolomonGF256Poly* rsg3 = m_field->GetOne()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr sLast(rsg3); + CBC_ReedSolomonGF256Poly* rsg4 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr s(rsg4); + CBC_ReedSolomonGF256Poly* rsg5 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr tLast(rsg5); + CBC_ReedSolomonGF256Poly* rsg6 = m_field->GetOne()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr t(rsg6); + while (r->GetDegree() >= R / 2) { + CBC_AutoPtr rLastLast = rLast; + CBC_AutoPtr sLastLast = sLast; + CBC_AutoPtr tLastlast = tLast; + rLast = r; + sLast = s; + tLast = t; + if (rLast->IsZero()) { + e = BCExceptionR_I_1IsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_ReedSolomonGF256Poly* rsg7 = rLastLast->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr rTemp(rsg7); + r = rTemp; + CBC_ReedSolomonGF256Poly* rsg8 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr q(rsg8); + FX_INT32 denominatorLeadingTerm = rLast->GetCoefficients(rLast->GetDegree()); + FX_INT32 dltInverse = m_field->Inverse(denominatorLeadingTerm, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + while (r->GetDegree() >= rLast->GetDegree() && !(r->IsZero())) { + FX_INT32 degreeDiff = r->GetDegree() - rLast->GetDegree(); + FX_INT32 scale = m_field->Multiply(r->GetCoefficients(r->GetDegree()), dltInverse); + CBC_ReedSolomonGF256Poly* rsgp1 = m_field->BuildMonomial(degreeDiff, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr build(rsgp1); + CBC_ReedSolomonGF256Poly* rsgp2 = q->AddOrSubtract(build.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp(rsgp2); + q = temp; + CBC_ReedSolomonGF256Poly* rsgp3 = rLast->MultiplyByMonomial(degreeDiff, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr multiply(rsgp3); + CBC_ReedSolomonGF256Poly* rsgp4 = r->AddOrSubtract(multiply.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp3(rsgp4); + r = temp3; + } + CBC_ReedSolomonGF256Poly* rsg9 = q->Multiply(sLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp1(rsg9); + CBC_ReedSolomonGF256Poly* rsg10 = temp1->AddOrSubtract(sLastLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp2(rsg10); + s = temp2; + CBC_ReedSolomonGF256Poly* rsg11 = q->Multiply(tLast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp5(rsg11); + CBC_ReedSolomonGF256Poly* rsg12 = temp5->AddOrSubtract(tLastlast.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp6(rsg12); + t = temp6; + } + FX_INT32 sigmaTildeAtZero = t->GetCoefficients(0); + if (sigmaTildeAtZero == 0) { + e = BCExceptionIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 inverse = m_field->Inverse(sigmaTildeAtZero, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ReedSolomonGF256Poly* rsg13 = t->Multiply(inverse, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr sigma(rsg13); + CBC_ReedSolomonGF256Poly* rsg14 = r->Multiply(inverse, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr omega(rsg14); + CFX_PtrArray *temp = FX_NEW CFX_PtrArray; + temp->Add(sigma.release()); + temp->Add(omega.release()); + return temp; +} +CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e) +{ + FX_INT32 numErrors = errorLocator->GetDegree(); + if (numErrors == 1) { + CBC_AutoPtr temp(FX_NEW CFX_Int32Array); + temp->Add(errorLocator->GetCoefficients(1)); + return temp.release(); + } + CFX_Int32Array *tempT = FX_NEW CFX_Int32Array; + tempT->SetSize(numErrors); + CBC_AutoPtr result(tempT); + FX_INT32 ie = 0; + for (FX_INT32 i = 1; i < 256 && ie < numErrors; i++) { + if(errorLocator->EvaluateAt(i) == 0) { + (*result)[ie] = m_field->Inverse(i, ie); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + ie++; + } + } + if (ie != numErrors) { + e = BCExceptionDegreeNotMatchRoots; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return result.release(); +} +CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e) +{ + FX_INT32 s = errorLocations->GetSize(); + CFX_Int32Array * temp = FX_NEW CFX_Int32Array; + temp->SetSize(s); + CBC_AutoPtr result(temp); + for (FX_INT32 i = 0; i < s; i++) { + FX_INT32 xiInverse = m_field->Inverse(errorLocations->operator [](i), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 denominator = 1; + for(FX_INT32 j = 0; j < s; j++) { + if(i != j) { + denominator = m_field->Multiply(denominator, + CBC_ReedSolomonGF256::AddOrSubtract(1, m_field->Multiply(errorLocations->operator [](j), xiInverse))); + } + } + FX_INT32 temp = m_field->Inverse(denominator, temp); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + (*result)[i] = m_field->Multiply(errorEvaluator->EvaluateAt(xiInverse), + temp); + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h new file mode 100644 index 0000000000..c1dd0f03f5 --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonDecoder.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_REEDSOLOMONDECODER_H_ +#define _BC_REEDSOLOMONDECODER_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonDecoder; +class CBC_ReedSolomonDecoder : public CFX_Object +{ +private: + CBC_ReedSolomonGF256 * m_field; +public: + CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256 * field); + virtual ~CBC_ReedSolomonDecoder(); + void Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e); + CFX_PtrArray* RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e); + CFX_Int32Array* FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e); + CFX_Int32Array* FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp new file mode 100644 index 0000000000..bb045ac24c --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp @@ -0,0 +1,140 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../barcode.h" +#include "BC_ReedSolomonGF256Poly.h" +#include "BC_ReedSolomonGF256.h" +CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::QRCodeFild = NULL; +CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::DataMatrixField = NULL; +void CBC_ReedSolomonGF256::Initialize() +{ + QRCodeFild = FX_NEW CBC_ReedSolomonGF256(0x011D); + QRCodeFild->Init(); + DataMatrixField = FX_NEW CBC_ReedSolomonGF256(0x012D); + DataMatrixField->Init(); +} +void CBC_ReedSolomonGF256::Finalize() +{ + if (QRCodeFild) { + delete QRCodeFild; + } + QRCodeFild = NULL; + if (DataMatrixField) { + delete DataMatrixField; + } + DataMatrixField = NULL; +} +CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(FX_INT32 primitive) +{ + FX_INT32 x = 1; + for(FX_INT32 j = 0; j < 256; j++) { + m_expTable[j] = x; + x <<= 1; + if(x >= 0x100) { + x ^= primitive; + } + } + for(FX_INT32 i = 0; i < 255; i++) { + m_logTable[m_expTable[i]] = i; + } + m_logTable[0] = 0; +} +void CBC_ReedSolomonGF256::Init() +{ + m_zero = FX_NEW CBC_ReedSolomonGF256Poly(this, 0); + m_one = FX_NEW CBC_ReedSolomonGF256Poly(this, 1); +} +CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() +{ + if(m_zero != NULL) { + delete m_zero; + m_zero = NULL; + } + if(m_one != NULL) { + delete m_one; + m_one = NULL; + } +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero() +{ + return m_zero; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne() +{ + return m_one; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if(degree < 0) { + e = BCExceptionDegreeIsNegative; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(coefficient == 0) { + CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + CFX_Int32Array coefficients; + coefficients.SetSize(degree + 1); + coefficients[0] = coefficient; + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(this, &coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +FX_INT32 CBC_ReedSolomonGF256::AddOrSubtract(FX_INT32 a, FX_INT32 b) +{ + return a ^ b; +} +FX_INT32 CBC_ReedSolomonGF256::Exp(FX_INT32 a) +{ + return m_expTable[a]; +} +FX_INT32 CBC_ReedSolomonGF256::Log(FX_INT32 a, FX_INT32 &e) +{ + if(a == 0) { + e = BCExceptionAIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return m_logTable[a]; +} +FX_INT32 CBC_ReedSolomonGF256::Inverse(FX_INT32 a, FX_INT32 &e) +{ + if(a == 0) { + e = BCExceptionAIsZero; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return m_expTable[255 - m_logTable[a]]; +} +FX_INT32 CBC_ReedSolomonGF256::Multiply(FX_INT32 a, FX_INT32 b) +{ + if(a == 0 || b == 0) { + return 0; + } + if(a == 1) { + return b; + } + if(b == 1) { + return a; + } + return m_expTable[(m_logTable[a] + m_logTable[b]) % 255]; +} diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h new file mode 100644 index 0000000000..1687b95e09 --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_REEDSOLOMONGF256_H_ +#define _BC_REEDSOLOMONGF256_H_ +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256 : public CFX_Object +{ +public: + static void Initialize(); + static void Finalize(); + static CBC_ReedSolomonGF256 *QRCodeFild; + static CBC_ReedSolomonGF256 *DataMatrixField; + CBC_ReedSolomonGF256(FX_INT32 primitive); + virtual ~CBC_ReedSolomonGF256(); + CBC_ReedSolomonGF256Poly* GetZero(); + CBC_ReedSolomonGF256Poly* GetOne(); + CBC_ReedSolomonGF256Poly* BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + static FX_INT32 AddOrSubtract(FX_INT32 a, FX_INT32 b); + FX_INT32 Exp(FX_INT32 a); + FX_INT32 Log(FX_INT32 a, FX_INT32 &e); + FX_INT32 Inverse(FX_INT32 a, FX_INT32 &e); + FX_INT32 Multiply(FX_INT32 a, FX_INT32 b); + virtual void Init(); +private: + FX_INT32 m_expTable[256]; + FX_INT32 m_logTable[256]; + CBC_ReedSolomonGF256Poly *m_zero; + CBC_ReedSolomonGF256Poly *m_one; +}; +#endif diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp new file mode 100644 index 0000000000..6476e4cf80 --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp @@ -0,0 +1,257 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../barcode.h" +#include "BC_ReedSolomonGF256.h" +#include "BC_ReedSolomonGF256Poly.h" +CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients) +{ + if(field == NULL) { + return; + } + m_field = field; + m_coefficients.Add(coefficients); +} +CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() +{ + m_field = NULL; +} +void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e) +{ + if(coefficients == NULL || coefficients->GetSize() == 0) { + e = BCExceptionCoefficientsSizeIsNull; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + m_field = field; + FX_INT32 coefficientsLength = coefficients->GetSize(); + if((coefficientsLength > 1 && (*coefficients)[0] == 0)) { + FX_INT32 firstNonZero = 1; + while((firstNonZero < coefficientsLength) && ((*coefficients)[firstNonZero] == 0)) { + firstNonZero++; + } + if(firstNonZero == coefficientsLength) { + m_coefficients.Copy( *(m_field->GetZero()->GetCoefficients())); + } else { + m_coefficients.SetSize(coefficientsLength - firstNonZero); + for(FX_INT32 i = firstNonZero, j = 0; i < coefficientsLength; i++, j++) { + m_coefficients[j] = coefficients->operator [](i); + } + } + } else { + m_coefficients.Copy(*coefficients); + } +} +CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() +{ + return &m_coefficients; +} +FX_INT32 CBC_ReedSolomonGF256Poly::GetDegree() +{ + return m_coefficients.GetSize() - 1; +} +FX_BOOL CBC_ReedSolomonGF256Poly::IsZero() +{ + return m_coefficients[0] == 0; +} +FX_INT32 CBC_ReedSolomonGF256Poly::GetCoefficients(FX_INT32 degree) +{ + return m_coefficients[m_coefficients.GetSize() - 1 - degree]; +} +FX_INT32 CBC_ReedSolomonGF256Poly::EvaluateAt(FX_INT32 a) +{ + if(a == 0) { + return GetCoefficients(0); + } + FX_INT32 size = m_coefficients.GetSize(); + if(a == 1) { + FX_INT32 result = 0; + for(FX_INT32 i = 0; i < size; i++) { + result = CBC_ReedSolomonGF256::AddOrSubtract(result, m_coefficients[i]); + } + return result; + } + FX_INT32 result = m_coefficients[0]; + for(FX_INT32 j = 1; j < size; j++) { + result = CBC_ReedSolomonGF256::AddOrSubtract( + m_field->Multiply(a, result), + m_coefficients[j]); + } + return result; +} +CBC_ReedSolomonGF256Poly *CBC_ReedSolomonGF256Poly::Clone(FX_INT32 &e) +{ + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) +{ + if(IsZero()) { + return other->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(other->IsZero()) { + return this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CFX_Int32Array smallerCoefficients; + smallerCoefficients.Copy(m_coefficients); + CFX_Int32Array largerCoefficients; + largerCoefficients.Copy( *(other->GetCoefficients())); + if(smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { + CFX_Int32Array temp; + temp.Copy(smallerCoefficients); + smallerCoefficients.Copy(largerCoefficients); + largerCoefficients.Copy(temp); + } + CFX_Int32Array sumDiff; + sumDiff.SetSize(largerCoefficients.GetSize() ); + FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); + for(FX_INT32 i = 0; i < lengthDiff; i++) { + sumDiff[i] = largerCoefficients[i]; + } + for(FX_INT32 j = lengthDiff; j < largerCoefficients.GetSize(); j++) { + sumDiff[j] = (CBC_ReedSolomonGF256::AddOrSubtract(smallerCoefficients[j - lengthDiff], + largerCoefficients[j])); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &sumDiff, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) +{ + if(IsZero() || other->IsZero()) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + CFX_Int32Array aCoefficients ; + aCoefficients.Copy(m_coefficients); + FX_INT32 aLength = m_coefficients.GetSize(); + CFX_Int32Array bCoefficients; + bCoefficients.Copy(*(other->GetCoefficients())); + FX_INT32 bLength = other->GetCoefficients()->GetSize(); + CFX_Int32Array product; + product.SetSize(aLength + bLength - 1); + for(FX_INT32 i = 0; i < aLength; i++) { + FX_INT32 aCoeff = m_coefficients[i]; + for(FX_INT32 j = 0; j < bLength; j++) { + product[i + j] = CBC_ReedSolomonGF256::AddOrSubtract( + product[i + j], + m_field->Multiply(aCoeff, other->GetCoefficients()->operator [](j))); + } + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(FX_INT32 scalar, FX_INT32 &e) +{ + if(scalar == 0) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + if(scalar == 1) { + return this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size); + for(FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->Multiply(m_coefficients[i], scalar); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if(degree < 0) { + e = BCExceptionDegreeIsNegative; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + if(coefficient == 0) { + CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size + degree); + for(FX_INT32 i = 0; i < size; i++) { + product[i] = (m_field->Multiply(m_coefficients[i], coefficient)); + } + CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); + temp->Init(m_field, &product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CFX_PtrArray* CBC_ReedSolomonGF256Poly::Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e) +{ + if(other->IsZero()) { + e = BCExceptionDivideByZero; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_ReedSolomonGF256Poly* rsg1 = m_field->GetZero()->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr quotient(rsg1); + CBC_ReedSolomonGF256Poly* rsg2 = this->Clone(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr remainder(rsg2); + FX_INT32 denominatorLeadingTerm = other->GetCoefficients(other->GetDegree()); + FX_INT32 inverseDenominatorLeadingTeam = m_field->Inverse(denominatorLeadingTerm, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_BOOL bFirst = TRUE; + while(remainder->GetDegree() >= other->GetDegree() && !remainder->IsZero()) { + FX_INT32 degreeDifference = remainder->GetDegree() - other->GetDegree(); + FX_INT32 scale = m_field->Multiply(remainder->GetCoefficients((remainder->GetDegree())), + inverseDenominatorLeadingTeam); + CBC_ReedSolomonGF256Poly* rsg3 = other->MultiplyByMonomial(degreeDifference, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr term(rsg3); + CBC_ReedSolomonGF256Poly* rsg4 = m_field->BuildMonomial(degreeDifference, scale, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr iteratorQuotient(rsg4); + CBC_ReedSolomonGF256Poly* rsg5 = quotient->AddOrSubtract(iteratorQuotient.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp(rsg5); + quotient = temp; + CBC_ReedSolomonGF256Poly* rsg6 = remainder->AddOrSubtract(term.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr temp1(rsg6); + remainder = temp1; + } + CFX_PtrArray* tempPtrA = FX_NEW CFX_PtrArray; + tempPtrA->Add(quotient.release()); + tempPtrA->Add(remainder.release()); + return tempPtrA; +} +CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() +{ + m_coefficients.RemoveAll(); +} diff --git a/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h new file mode 100644 index 0000000000..a6db24e231 --- /dev/null +++ b/xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_READSOLOMONGF256POLY_H_ +#define _BC_READSOLOMONGF256POLY_H_ +class CBC_ReedSolomonGF256; +class CBC_ReedSolomonGF256Poly; +class CBC_ReedSolomonGF256Poly : public CFX_Object +{ +public: + CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients); + CBC_ReedSolomonGF256Poly(); + virtual ~CBC_ReedSolomonGF256Poly(); + FX_INT32 GetCoefficients(FX_INT32 degree); + CFX_Int32Array* GetCoefficients(); + FX_INT32 GetDegree(); + FX_BOOL IsZero(); + FX_INT32 EvaluateAt(FX_INT32 a); + CBC_ReedSolomonGF256Poly* AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Multiply(FX_INT32 scalar, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + CFX_PtrArray* Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e); + CBC_ReedSolomonGF256Poly* Clone(FX_INT32 &e); + virtual void Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e); +private: + CBC_ReedSolomonGF256* m_field; + CFX_Int32Array m_coefficients; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp new file mode 100644 index 0000000000..bc29b7d6ce --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp @@ -0,0 +1,99 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_ASCIIEncoder.h" +CBC_ASCIIEncoder::CBC_ASCIIEncoder() +{ +} +CBC_ASCIIEncoder::~CBC_ASCIIEncoder() +{ +} +FX_INT32 CBC_ASCIIEncoder::getEncodingMode() +{ + return ASCII_ENCODATION; +} +void CBC_ASCIIEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + FX_INT32 n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(context.m_msg, context.m_pos); + if (n >= 2) { + FX_WCHAR code = encodeASCIIDigits(context.m_msg.GetAt(context.m_pos), context.m_msg.GetAt(context.m_pos + 1), e); + if (e != BCExceptionNO) { + return; + } + context.writeCodeword(code); + context.m_pos += 2; + } else { + FX_WCHAR c = context.getCurrentChar(); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + switch (newMode) { + case BASE256_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256); + context.signalEncoderChange(BASE256_ENCODATION); + return; + case C40_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40); + context.signalEncoderChange(C40_ENCODATION); + return; + case X12_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12); + context.signalEncoderChange(X12_ENCODATION); + break; + case TEXT_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT); + context.signalEncoderChange(TEXT_ENCODATION); + break; + case EDIFACT_ENCODATION: + context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT); + context.signalEncoderChange(EDIFACT_ENCODATION); + break; + default: + e = BCExceptionIllegalStateIllegalMode; + return; + } + } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) { + context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT); + context.writeCodeword((FX_WCHAR) (c - 128 + 1)); + context.m_pos++; + } else { + context.writeCodeword((FX_WCHAR) (c + 1)); + context.m_pos++; + } + } +} +FX_WCHAR CBC_ASCIIEncoder::encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e) +{ + if (CBC_HighLevelEncoder::isDigit(digit1) && CBC_HighLevelEncoder::isDigit(digit2)) { + FX_INT32 num = (digit1 - 48) * 10 + (digit2 - 48); + FX_WCHAR a = (FX_WCHAR) (num + 130); + return (FX_WCHAR) (num + 130); + } + e = BCExceptionIllegalArgumentNotGigits; + return 0; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h new file mode 100644 index 0000000000..9a48b8762f --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_ASCIIEncoder.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ASCIIENCODER_H_ +#define _BC_ASCIIENCODER_H_ +class CBC_Encoder; +class CBC_EncoderContext; +class CBC_ASCIIEncoder; +class CBC_ASCIIEncoder : public CBC_Encoder +{ +public: + CBC_ASCIIEncoder(); + virtual ~CBC_ASCIIEncoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static FX_WCHAR encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp new file mode 100644 index 0000000000..d896cf6445 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.cpp @@ -0,0 +1,95 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_Base256Encoder.h" +CBC_Base256Encoder::CBC_Base256Encoder() +{ +} +CBC_Base256Encoder::~CBC_Base256Encoder() +{ +} +FX_INT32 CBC_Base256Encoder::getEncodingMode() +{ + return BASE256_ENCODATION; +} +void CBC_Base256Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + buffer += (FX_WCHAR)'\0'; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + buffer += c; + context.m_pos++; + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + FX_INT32 dataCount = buffer.GetLength() - 1; + FX_CHAR buf[128]; +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buf, 0, sizeof(FX_CHAR) * 128); + _itoa_s(dataCount, buf, 128, 10); +#else + FXSYS_itoa(dataCount, buf, 10); +#endif + buffer.SetAt(0, FX_WCHAR(*buf) - '0'); + FX_INT32 lengthFieldSize = 1; + FX_INT32 currentSize = context.getCodewordCount() + dataCount + lengthFieldSize; + context.updateSymbolInfo(currentSize, e); + if (e != BCExceptionNO) { + return; + } + FX_BOOL mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0; + if (context.hasMoreCharacters() || mustPad) { + if (dataCount <= 249) { + buffer.SetAt(0, (FX_WCHAR) dataCount); + } else if (dataCount > 249 && dataCount <= 1555) { + buffer.SetAt(0, (FX_WCHAR) ((dataCount / 250) + 249)); + buffer.Insert(1, (FX_WCHAR) (dataCount % 250)); + } else { + e = BCExceptionIllegalStateMessageLengthInvalid; + return; + } + } + for (FX_INT32 i = 0, c = buffer.GetLength(); i < c; i++) { + context.writeCodeword(randomize255State(buffer.GetAt(i), context.getCodewordCount() + 1)); + } +} +FX_WCHAR CBC_Base256Encoder::randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition) +{ + FX_INT32 pseudoRandom = ((149 * codewordPosition) % 255) + 1; + FX_INT32 tempVariable = ch + pseudoRandom; + if (tempVariable <= 255) { + return (FX_WCHAR) tempVariable; + } else { + return (FX_WCHAR) (tempVariable - 256); + } +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h new file mode 100644 index 0000000000..96110b1d08 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_Base256Encoder.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BASE256ENCODER_H_ +#define _BC_BASE256ENCODER_H_ +class CBC_Encoder; +class CBC_Base256Encoder; +class CBC_Base256Encoder : public CBC_Encoder +{ +public: + CBC_Base256Encoder(); + virtual ~CBC_Base256Encoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static FX_WCHAR randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp new file mode 100644 index 0000000000..4c3b458afa --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.cpp @@ -0,0 +1,198 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_C40Encoder.h" +CBC_C40Encoder::CBC_C40Encoder() +{ +} +CBC_C40Encoder::~CBC_C40Encoder() +{ +} +FX_INT32 CBC_C40Encoder::getEncodingMode() +{ + return C40_ENCODATION; +} +void CBC_C40Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + context.m_pos++; + FX_INT32 lastCharSize = encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; + FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; + context.updateSymbolInfo(curCodewordCount, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; + if (!context.hasMoreCharacters()) { + CFX_WideString removed; + if ((buffer.GetLength() % 3) == 2) { + if (available < 2 || available > 2) { + lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); + if (e != BCExceptionNO) { + return; + } + } + } + while ((buffer.GetLength() % 3) == 1 + && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { + lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); + if (e != BCExceptionNO) { + return; + } + } + break; + } + FX_INT32 count = buffer.GetLength(); + if ((count % 3) == 0) { + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + } + handleEOD(context, buffer, e); +} +void CBC_C40Encoder::writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer) +{ + context.writeCodewords(encodeToCodewords(buffer, 0)); + buffer.Delete(0, 3); +} +void CBC_C40Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) +{ + FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; + FX_INT32 rest = buffer.GetLength() % 3; + FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; + context.updateSymbolInfo(curCodewordCount, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; + if (rest == 2) { + buffer += (FX_WCHAR)'\0'; + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + } else if (available == 1 && rest == 1) { + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + context.m_pos--; + } else if (rest == 0) { + while (buffer.GetLength() >= 3) { + writeNextTriplet(context, buffer); + } + if (available > 0 || context.hasMoreCharacters()) { + context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); + } + } else { + e = BCExceptionIllegalStateUnexpectedCase; + return; + } + context.signalEncoderChange(ASCII_ENCODATION); +} +FX_INT32 CBC_C40Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == ' ') { + sb += (FX_WCHAR)'\3'; + return 1; + } else if ((c >= '0') && (c <= '9')) { + sb += (FX_WCHAR)(c - 48 + 4); + return 1; + } else if ((c >= 'A') && (c <= 'Z')) { + sb += (FX_WCHAR)(c - 65 + 14); + return 1; + } else if ((c >= '\0') && (c <= 0x1f)) { + sb += (FX_WCHAR)'\0'; + sb += c; + return 2; + } else if ((c >= '!') && (c <= '/')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 33); + return 2; + } else if ((c >= ':') && (c <= '@')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 58 + 15); + return 2; + } else if ((c >= '[') && (c <= '_')) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)(c - 91 + 22); + return 2; + } else if ((c >= 60) && (c <= 0x7f)) { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR)(c - 96); + return 2; + } else if (c >= 80) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)0x001e; + FX_INT32 len = 2; + len += encodeChar((c - 128), sb, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return len; + } else { + e = BCExceptionIllegalArgument; + return 0; + } +} +FX_INT32 CBC_C40Encoder::backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e) +{ + FX_INT32 count = buffer.GetLength(); + buffer.Delete(count - lastCharSize, count); + context.m_pos--; + FX_WCHAR c = context.getCurrentChar(); + lastCharSize = encodeChar(c, removed, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + context.resetSymbolInfo(); + return lastCharSize; +} +CFX_WideString CBC_C40Encoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos) +{ + FX_WCHAR c1 = sb.GetAt(startPos); + FX_WCHAR c2 = sb.GetAt(startPos + 1); + FX_WCHAR c3 = sb.GetAt(startPos + 2); + FX_INT32 v = (1600 * c1) + (40 * c2) + c3 + 1; + FX_WCHAR cw1 = (FX_WCHAR) (v / 256); + FX_WCHAR cw2 = (FX_WCHAR) (v % 256); + CFX_WideString b1(cw1); + CFX_WideString b2(cw2); + return b1 + b2; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h new file mode 100644 index 0000000000..7f2d2f7e79 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_C40Encoder.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_C40ENCODER_H_ +#define _BC_C40ENCODER_H_ +class CBC_C40Encoder; +class CBC_C40Encoder : public CBC_Encoder +{ +public: + CBC_C40Encoder(); + virtual ~CBC_C40Encoder(); + virtual FX_INT32 getEncodingMode(); + virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e); + static void writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer); + virtual void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); + virtual FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +private: + FX_INT32 backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e); + static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp new file mode 100644 index 0000000000..cfb676b0a7 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.cpp @@ -0,0 +1,366 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_DataMatrixVersion.h" +#include "BC_DataMatrixBitMatrixParser.h" +CBC_DataMatrixBitMatrixParser::CBC_DataMatrixBitMatrixParser() +{ + m_mappingBitMatrix = NULL; + m_version = NULL; + m_readMappingMatrix = NULL; +} +void CBC_DataMatrixBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + FX_INT32 dimension = bitMatrix->GetHeight(); + if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) { + e = BCExceptionFormatException; + return; + } + m_version = ReadVersion(bitMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_mappingBitMatrix = ExtractDataRegion(bitMatrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_readMappingMatrix = FX_NEW CBC_CommonBitMatrix(); + m_readMappingMatrix->Init(m_mappingBitMatrix->GetWidth(), m_mappingBitMatrix->GetHeight()); +} +CBC_DataMatrixBitMatrixParser::~CBC_DataMatrixBitMatrixParser() +{ + if(m_mappingBitMatrix != NULL) { + delete m_mappingBitMatrix; + } + m_mappingBitMatrix = NULL; + if(m_readMappingMatrix != NULL) { + delete m_readMappingMatrix; + } + m_readMappingMatrix = NULL; +} +CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::GetVersion() +{ + return m_version; +} +CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + FX_INT32 rows = bitMatrix->GetHeight(); + FX_INT32 columns = bitMatrix->GetWidth(); + CBC_DataMatrixVersion *temp = CBC_DataMatrixVersion::GetVersionForDimensions(rows, columns, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return temp; +} +CFX_ByteArray *CBC_DataMatrixBitMatrixParser::ReadCodewords(FX_INT32 &e) +{ + CBC_AutoPtr result(FX_NEW CFX_ByteArray()); + result->SetSize(m_version->GetTotalCodewords()); + FX_INT32 resultOffset = 0; + FX_INT32 row = 4; + FX_INT32 column = 0; + FX_INT32 numRows = m_mappingBitMatrix->GetHeight(); + FX_INT32 numColumns = m_mappingBitMatrix->GetWidth(); + FX_BOOL corner1Read = FALSE; + FX_BOOL corner2Read = FALSE; + FX_BOOL corner3Read = FALSE; + FX_BOOL corner4Read = FALSE; + do { + if ((row == numRows) && (column == 0) && !corner1Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner1(numRows, numColumns); + row -= 2; + column += 2; + corner1Read = TRUE; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner2(numRows, numColumns); + row -= 2; + column += 2; + corner2Read = TRUE; + } else if ((row == numRows + 4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner3(numRows, numColumns); + row -= 2; + column += 2; + corner3Read = TRUE; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { + (*result)[resultOffset++] = (FX_BYTE) ReadCorner4(numRows, numColumns); + row -= 2; + column += 2; + corner4Read = TRUE; + } else { + do { + if ((row < numRows) && (column >= 0) && !m_readMappingMatrix->Get(column, row)) { + if (resultOffset < (*result).GetSize() ) { + (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); + } + } + row -= 2; + column += 2; + } while ((row >= 0) && (column < numColumns)); + row += 1; + column += 3; + do { + if ((row >= 0) && (column < numColumns) && !m_readMappingMatrix->Get(column, row)) { + if (resultOffset < (*result).GetSize() ) { + (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); + } + } + row += 2; + column -= 2; + } while ((row < numRows) && (column >= 0)); + row += 3; + column += 1; + } + } while ((row < numRows) || (column < numColumns)); + if (resultOffset != m_version->GetTotalCodewords()) { + e = BCExceptionFormatException; + return NULL; + } + return result.release(); +} +FX_BOOL CBC_DataMatrixBitMatrixParser::ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) +{ + if (row < 0) { + row += numRows; + column += 4 - ((numRows + 4) & 0x07); + } + if (column < 0) { + column += numColumns; + row += 4 - ((numColumns + 4) & 0x07); + } + m_readMappingMatrix->Set(column, row); + return m_mappingBitMatrix->Get(column, row); +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(row - 2, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 2, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row - 1, column, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(row, column, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(2, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(3, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 3, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 2, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 4, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 3, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns) +{ + FX_INT32 currentByte = 0; + if (ReadModule(numRows - 3, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 2, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(numRows - 1, 0, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 2, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(0, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(1, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(2, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + currentByte <<= 1; + if (ReadModule(3, numColumns - 1, numRows, numColumns)) { + currentByte |= 1; + } + return currentByte; +} +CBC_CommonBitMatrix *CBC_DataMatrixBitMatrixParser::ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix , FX_INT32 &e) +{ + FX_INT32 symbolSizeRows = m_version->GetSymbolSizeRows(); + FX_INT32 symbolSizeColumns = m_version->GetSymbolSizeColumns(); + if (bitMatrix->GetHeight() != symbolSizeRows) { + e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; + return NULL; + } + FX_INT32 dataRegionSizeRows = m_version->GetDataRegionSizeRows(); + FX_INT32 dataRegionSizeColumns = m_version->GetDataRegionSizeColumns(); + FX_INT32 numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; + FX_INT32 numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; + FX_INT32 sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; + FX_INT32 sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; + CBC_CommonBitMatrix *bitMatrixWithoutAlignment = FX_NEW CBC_CommonBitMatrix(); + bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow); + FX_INT32 dataRegionRow; + for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { + FX_INT32 dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; + FX_INT32 dataRegionColumn; + for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { + FX_INT32 dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; + FX_INT32 i; + for (i = 0; i < dataRegionSizeRows; ++i) { + FX_INT32 readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; + FX_INT32 writeRowOffset = dataRegionRowOffset + i; + FX_INT32 j; + for (j = 0; j < dataRegionSizeColumns; ++j) { + FX_INT32 readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; + if (bitMatrix->Get(readColumnOffset, readRowOffset)) { + FX_INT32 writeColumnOffset = dataRegionColumnOffset + j; + bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset); + } + } + } + } + } + return bitMatrixWithoutAlignment; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h new file mode 100644 index 0000000000..c5f1f3f7a0 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixBitMatrixParser.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXBITMATRIXPARSER_H_ +#define _BC_DATAMATRIXBITMATRIXPARSER_H_ +class CBC_CommonBitMatrix; +class CBC_DataMatrixVersion; +class CBC_DataMatrixBitMatrixParser; +class CBC_DataMatrixBitMatrixParser : public CFX_Object +{ +public: + CBC_DataMatrixBitMatrixParser(); + virtual ~CBC_DataMatrixBitMatrixParser(); + CBC_DataMatrixVersion *GetVersion(); + CFX_ByteArray *ReadCodewords(FX_INT32 &e); + FX_BOOL ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns); + FX_INT32 ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns); + CBC_CommonBitMatrix *ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); + virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); +private: + static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); + CBC_CommonBitMatrix *m_mappingBitMatrix; + CBC_CommonBitMatrix *m_readMappingMatrix; + CBC_DataMatrixVersion *m_version; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp new file mode 100644 index 0000000000..c884834fa9 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.cpp @@ -0,0 +1,99 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_DataMatrixVersion.h" +#include "BC_DataMatrixDataBlock.h" +CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock() +{ +} +CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) +{ + m_codewords.Copy(*codewords); + m_numDataCodewords = numDataCodewords; +} +CFX_PtrArray *CBC_DataMatrixDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e) +{ + ECBlocks *ecBlocks = version->GetECBlocks(); + FX_INT32 totalBlocks = 0; + const CFX_PtrArray &ecBlockArray = ecBlocks->GetECBlocks(); + FX_INT32 i; + for (i = 0; i < ecBlockArray.GetSize(); i++) { + totalBlocks += ((ECB*)ecBlockArray[i])->GetCount(); + } + CBC_AutoPtrresult(FX_NEW CFX_PtrArray()); + result->SetSize(totalBlocks); + FX_INT32 numResultBlocks = 0; + FX_INT32 j; + for (j = 0; j < ecBlockArray.GetSize(); j++) { + for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) { + FX_INT32 numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords(); + FX_INT32 numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords; + CFX_ByteArray codewords; + codewords.SetSize(numBlockCodewords); + (*result)[numResultBlocks++] = FX_NEW CBC_DataMatrixDataBlock(numDataCodewords, &codewords); + codewords.SetSize(0); + } + } + FX_INT32 longerBlocksTotalCodewords = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); + FX_INT32 longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks->GetECCodewords(); + FX_INT32 shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; + FX_INT32 rawCodewordsOffset = 0; + for (i = 0; i < shorterBlocksNumDataCodewords; i++) { + FX_INT32 j; + for (j = 0; j < numResultBlocks; j++) { + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](i) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + } + FX_BOOL specialVersion = version->GetVersionNumber() == 24; + FX_INT32 numLongerBlocks = specialVersion ? 8 : numResultBlocks; + for (j = 0; j < numLongerBlocks; j++) { + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](longerBlocksNumDataCodewords - 1) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + FX_INT32 max = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); + for (i = longerBlocksNumDataCodewords; i < max; i++) { + FX_INT32 j; + for (j = 0; j < numResultBlocks; j++) { + FX_INT32 iOffset = specialVersion && j > 7 ? i - 1 : i; + if (rawCodewordsOffset < rawCodewords->GetSize()) { + ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](iOffset) = (*rawCodewords)[rawCodewordsOffset++]; + } + } + } + if (rawCodewordsOffset != rawCodewords->GetSize()) { + e = BCExceptionIllegalArgument; + return NULL; + } + return result.release(); +} +FX_INT32 CBC_DataMatrixDataBlock::GetNumDataCodewords() +{ + return m_numDataCodewords; +} +CFX_ByteArray *CBC_DataMatrixDataBlock::GetCodewords() +{ + return &m_codewords; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h new file mode 100644 index 0000000000..1dd62fe1fe --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDataBlock.h @@ -0,0 +1,26 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXDATABLOCK_H_ +#define _BC_DATAMATRIXDATABLOCK_H_ +class CBC_DataMatrixVersion; +class CBC_DataMatrixDataBlock; +class CBC_DataMatrixDataBlock : public CFX_Object +{ +public: + virtual ~CBC_DataMatrixDataBlock(); + + FX_INT32 GetNumDataCodewords(); + CFX_ByteArray* GetCodewords(); + + static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e); +private: + FX_INT32 m_numDataCodewords; + CFX_ByteArray m_codewords; + + CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp new file mode 100644 index 0000000000..e934d9313d --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.cpp @@ -0,0 +1,472 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonDecoderResult.h" +#include "../common/BC_CommonBitSource.h" +#include "BC_DataMatrixDecodedBitStreamParser.h" +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_BASIC_SET_CHARS[] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = { + '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', + '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' +}; +const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = { + '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (FX_CHAR) 127 +}; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::PAD_ENCODE = 0; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ASCII_ENCODE = 1; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::C40_ENCODE = 2; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::TEXT_ENCODE = 3; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ANSIX12_ENCODE = 4; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::EDIFACT_ENCODE = 5; +const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::BASE256_ENCODE = 6; +CBC_DataMatrixDecodedBitStreamParser::CBC_DataMatrixDecodedBitStreamParser() +{ +} +CBC_DataMatrixDecodedBitStreamParser::~CBC_DataMatrixDecodedBitStreamParser() +{ +} +CBC_CommonDecoderResult *CBC_DataMatrixDecodedBitStreamParser::Decode(CFX_ByteArray &bytes, FX_INT32 &e) +{ + CBC_CommonBitSource bits(&bytes); + CFX_ByteString result; + CFX_ByteString resultTrailer; + CFX_Int32Array byteSegments; + FX_INT32 mode = ASCII_ENCODE; + do { + if (mode == 1) { + mode = DecodeAsciiSegment(&bits, result, resultTrailer, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + switch (mode) { + case 2: + DecodeC40Segment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 3: + DecodeTextSegment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 4: + DecodeAnsiX12Segment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 5: + DecodeEdifactSegment(&bits, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case 6: + DecodeBase256Segment(&bits, result, byteSegments, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + default: + NULL; + e = BCExceptionFormatException; + return NULL; + } + mode = ASCII_ENCODE; + } + } while (mode != PAD_ENCODE && bits.Available() > 0); + if (resultTrailer.GetLength() > 0) { + result += resultTrailer; + } + CBC_CommonDecoderResult *tempCp = FX_NEW CBC_CommonDecoderResult(); + tempCp->Init(bytes, result, (byteSegments.GetSize() <= 0) ? CFX_Int32Array() : byteSegments, NULL, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return tempCp; +} +FX_INT32 CBC_DataMatrixDecodedBitStreamParser::DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e) +{ + FX_CHAR buffer[128]; + FX_BOOL upperShift = FALSE; + do { + FX_INT32 oneByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + if (oneByte == 0) { + e = BCExceptionFormatException; + return 0; + } else if (oneByte <= 128) { + oneByte = upperShift ? oneByte + 128 : oneByte; + upperShift = FALSE; + result += ((FX_CHAR) (oneByte - 1)); + return ASCII_ENCODE; + } else if (oneByte == 129) { + return PAD_ENCODE; + } else if (oneByte <= 229) { + FX_INT32 value = oneByte - 130; +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buffer, 0, sizeof(FX_CHAR) * 128); + _itoa_s(value, buffer, 128, 10); +#else + FXSYS_itoa(value, buffer, 10); +#endif + if (value < 10) { + result += '0'; + buffer[1] = '\0'; + } else { + buffer[2] = '\0'; + } + result += buffer; + } else if (oneByte == 230) { + return C40_ENCODE; + } else if (oneByte == 231) { + return BASE256_ENCODE; + } else if (oneByte == 232 || oneByte == 233 || oneByte == 234) { + } else if (oneByte == 235) { + upperShift = TRUE; + } else if (oneByte == 236) { + result += "[)>"; + result += 0x1E; + result += "05"; + result += 0x1D; + resultTrailer.Insert(0, 0x1E); + resultTrailer.Insert(0 + 1, 0x04); + } else if (oneByte == 237) { + result += "[)>"; + result += 0x1E; + result += "06"; + result += 0x1D; + resultTrailer.Insert(0, 0x1E); + resultTrailer.Insert(0 + 1, 0x04); + } else if (oneByte == 238) { + return ANSIX12_ENCODE; + } else if (oneByte == 239) { + return TEXT_ENCODE; + } else if (oneByte == 240) { + return EDIFACT_ENCODE; + } else if (oneByte == 241) { + } else if (oneByte >= 242) { + if (oneByte == 254 && bits->Available() == 0) { + } else { + e = BCExceptionFormatException; + return 0; + } + } + } while (bits->Available() > 0); + return ASCII_ENCODE; +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_BOOL upperShift = FALSE; + CFX_Int32Array cValues; + cValues.SetSize(3); + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 tempp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, tempp, cValues); + FX_INT32 shift = 0; + FX_INT32 i; + for (i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < 27) { + FX_CHAR c40char = C40_BASIC_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else { + e = BCExceptionFormatException; + return ; + } + break; + case 1: + if (upperShift) { + result += (FX_CHAR) (cValue + 128); + upperShift = FALSE; + } else { + result += cValue; + } + shift = 0; + break; + case 2: + if (cValue < 27) { + FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else if (cValue == 27) { + e = BCExceptionFormatException; + return; + } else if (cValue == 30) { + upperShift = TRUE; + } else { + e = BCExceptionFormatException; + return; + } + shift = 0; + break; + case 3: + if (upperShift) { + result += (FX_CHAR) (cValue + 224); + upperShift = FALSE; + } else { + result += (FX_CHAR) (cValue + 96); + } + shift = 0; + break; + default: + break; + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_BOOL upperShift = FALSE; + CFX_Int32Array cValues; + cValues.SetSize(3); + FX_INT32 shift = 0; + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 inTp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, inTp, cValues); + for (FX_INT32 i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < 40) { + FX_CHAR textChar = TEXT_BASIC_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (textChar + 128); + upperShift = FALSE; + } else { + result += textChar; + } + } else { + e = BCExceptionFormatException; + return; + } + break; + case 1: + if (upperShift) { + result += (FX_CHAR) (cValue + 128); + upperShift = FALSE; + } else { + result += cValue; + } + shift = 0; + break; + case 2: + if (cValue < 27) { + FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (c40char + 128); + upperShift = FALSE; + } else { + result += c40char; + } + } else if (cValue == 27) { + e = BCExceptionFormatException; + return; + } else if (cValue == 30) { + upperShift = TRUE; + } else { + e = BCExceptionFormatException; + return; + } + shift = 0; + break; + case 3: + if (cValue < 19) { + FX_CHAR textChar = TEXT_SHIFT3_SET_CHARS[cValue]; + if (upperShift) { + result += (FX_CHAR) (textChar + 128); + upperShift = FALSE; + } else { + result += textChar; + } + shift = 0; + } else { + e = BCExceptionFormatException; + return; + } + break; + default: + break; + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + CFX_Int32Array cValues; + cValues.SetSize(3); + do { + if (bits->Available() == 8) { + return; + } + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (firstByte == 254) { + return; + } + FX_INT32 iTemp1 = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + ParseTwoBytes(firstByte, iTemp1, cValues); + FX_INT32 i; + for (i = 0; i < 3; i++) { + FX_INT32 cValue = cValues[i]; + if (cValue == 0) { + BC_FX_ByteString_Append(result, 1, '\r'); + } else if (cValue == 1) { + BC_FX_ByteString_Append(result, 1, '*'); + } else if (cValue == 2) { + BC_FX_ByteString_Append(result, 1, '>'); + } else if (cValue == 3) { + BC_FX_ByteString_Append(result, 1, ' '); + } else if (cValue < 14) { + BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 44)); + } else if (cValue < 40) { + BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 51)); + } else { + e = BCExceptionFormatException; + return; + } + } + } while (bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result) +{ + FX_INT32 fullBitValue = (firstByte << 8) + secondByte - 1; + FX_INT32 temp = fullBitValue / 1600; + result[0] = temp; + fullBitValue -= temp * 1600; + temp = fullBitValue / 40; + result[1] = temp; + result[2] = fullBitValue - temp * 40; +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) +{ + FX_CHAR buffer[128]; + FX_BOOL unlatch = FALSE; + do { + if (bits->Available() <= 16) { + return; + } + FX_INT32 i; + for (i = 0; i < 4; i++) { + FX_INT32 edifactValue = bits->ReadBits(6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if (edifactValue == 0x1F) { + unlatch = TRUE; + } + if (!unlatch) { + if ((edifactValue & 32) == 0) { + edifactValue |= 64; + } +#if defined(_FX_WINAPI_PARTITION_APP_) + memset(buffer, 0, sizeof(FX_CHAR) * 128); + _itoa_s(edifactValue, buffer, 128, 10); + result += buffer; +#else + result += FXSYS_itoa(edifactValue, buffer, 10); +#endif + } + } + } while (!unlatch && bits->Available() > 0); +} +void CBC_DataMatrixDecodedBitStreamParser::DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e) +{ + FX_INT32 codewordPosition = 1 + bits->getByteOffset(); + FX_INT32 iTmp = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 d1 = Unrandomize255State(iTmp, codewordPosition++); + FX_INT32 count; + if (d1 == 0) { + count = bits->Available() / 8; + } else if (d1 < 250) { + count = d1; + } else { + FX_INT32 iTmp3 = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + count = 250 * (d1 - 249) + Unrandomize255State(iTmp3, codewordPosition++); + } + if (count < 0) { + e = BCExceptionFormatException; + return; + } + CFX_ByteArray *bytes = FX_NEW CFX_ByteArray(); + bytes->SetSize(count); + FX_INT32 i; + for (i = 0; i < count; i++) { + if (bits->Available() < 8) { + e = BCExceptionFormatException; + delete bytes; + return; + } + FX_INT32 iTemp5 = bits->ReadBits(8, e); + if (e != BCExceptionNO) { + delete bytes; + return; + } + bytes->SetAt(i, Unrandomize255State(iTemp5, codewordPosition++)); + } + BC_FX_ByteString_Append(result, *bytes); + delete bytes; +} +FX_BYTE CBC_DataMatrixDecodedBitStreamParser::Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition) +{ + FX_INT32 pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; + FX_INT32 tempVariable = randomizedBase256Codeword - pseudoRandomNumber; + return (FX_BYTE) (tempVariable >= 0 ? tempVariable : tempVariable + 256); +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h new file mode 100644 index 0000000000..060972d53a --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecodedBitStreamParser.h @@ -0,0 +1,43 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ +#define _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_CommonBitSource; +class CBC_DataMatrixDecodedBitStreamParser; +class CBC_DataMatrixDecodedBitStreamParser : public CFX_Object +{ +public: + CBC_DataMatrixDecodedBitStreamParser(); + virtual ~CBC_DataMatrixDecodedBitStreamParser(); + static CBC_CommonDecoderResult *Decode(CFX_ByteArray &bytes, FX_INT32 &e); + +private: + static FX_INT32 DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e); + static void DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result); + static void DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); + static void DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e); + static FX_BYTE Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition); + + const static FX_CHAR C40_BASIC_SET_CHARS[]; + const static FX_CHAR C40_SHIFT2_SET_CHARS[]; + + + const static FX_CHAR TEXT_BASIC_SET_CHARS[]; + const static FX_CHAR TEXT_SHIFT3_SET_CHARS[]; + const static FX_INT32 PAD_ENCODE; + const static FX_INT32 ASCII_ENCODE; + const static FX_INT32 C40_ENCODE; + const static FX_INT32 TEXT_ENCODE; + const static FX_INT32 ANSIX12_ENCODE; + const static FX_INT32 EDIFACT_ENCODE; + const static FX_INT32 BASE256_ENCODE; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp new file mode 100644 index 0000000000..e9eb32cf84 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.cpp @@ -0,0 +1,110 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/reedsolomon/BC_ReedSolomonDecoder.h" +#include "../common/reedsolomon/BC_ReedSolomonGF256.h" +#include "BC_DataMatrixDecoder.h" +#include "BC_DataMatrixBitMatrixParser.h" +#include "BC_DataMatrixVersion.h" +#include "BC_DataMatrixDataBlock.h" +#include "BC_DataMatrixDecodedBitStreamParser.h" +CBC_DataMatrixDecoder::CBC_DataMatrixDecoder() +{ + m_rsDecoder = NULL; +} +void CBC_DataMatrixDecoder::Init() +{ + m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField); +} +CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder() +{ + if(m_rsDecoder != NULL) { + delete m_rsDecoder; + } + m_rsDecoder = NULL; +} +CBC_CommonDecoderResult *CBC_DataMatrixDecoder::Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e) +{ + CBC_DataMatrixBitMatrixParser parser; + parser.Init(bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DataMatrixVersion *version = parser.GetVersion(); + CFX_ByteArray* byteTemp = parser.ReadCodewords(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr codewords(byteTemp); + CFX_PtrArray *dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 dataBlocksCount = dataBlocks->GetSize(); + FX_INT32 totalBytes = 0; + FX_INT32 i, j; + for (i = 0; i < dataBlocksCount; i++) { + totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords(); + } + CFX_ByteArray resultBytes; + resultBytes.SetSize(totalBytes); + for (j = 0; j < dataBlocksCount; j++) { + CFX_ByteArray *codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords(); + FX_INT32 numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords(); + CorrectErrors(*codewordBytes, numDataCodewords, e); + if (e != BCExceptionNO) { + for(FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { + delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; + } + delete dataBlocks; + dataBlocks = NULL; + return NULL; + } + FX_INT32 i; + for (i = 0; i < numDataCodewords; i++) { + resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i]; + } + } + for(i = 0; i < (dataBlocks->GetSize()); i++) { + delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; + } + delete dataBlocks; + dataBlocks = NULL; + CBC_CommonDecoderResult *resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return resultR; +} +void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) +{ + FX_INT32 numCodewords = codewordBytes.GetSize(); + CFX_Int32Array codewordsInts; + codewordsInts.SetSize(numCodewords); + FX_INT32 i; + for (i = 0; i < numCodewords; i++) { + codewordsInts[i] = codewordBytes[i] & 0xFF; + } + FX_INT32 numECCodewords = codewordBytes.GetSize() - numDataCodewords; + m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); + if (e != BCExceptionNO) { + e = BCExceptionChecksumException; + return ; + } + for (i = 0; i < numDataCodewords; i++) { + codewordBytes[i] = (FX_BYTE) codewordsInts[i]; + } +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h new file mode 100644 index 0000000000..44f7efc7b7 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDecoder.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXDECODER_H_ +#define _BC_DATAMATRIXDECODER_H_ +class CBC_ReedSolomonDecoder; +class CBC_CommonDecoderResult; +class CBC_CommonBitMatrix; +class CBC_DataMatrixDecoder; +class CBC_DataMatrixDecoder : public CFX_Object +{ +public: + CBC_DataMatrixDecoder(); + virtual ~CBC_DataMatrixDecoder(); + CBC_CommonDecoderResult *Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e); + virtual void Init(); +private: + void CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); + CBC_ReedSolomonDecoder *m_rsDecoder; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp new file mode 100644 index 0000000000..12877c5c3a --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.cpp @@ -0,0 +1,368 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_WhiteRectangleDetector.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../qrcode/BC_QRFinderPatternFinder.h" +#include "../qrcode/BC_QRDetectorResult.h" +#include "../qrcode/BC_QRGridSampler.h" +#include "BC_DataMatrixDetector.h" +const FX_INT32 CBC_DataMatrixDetector::INTEGERS[5] = {0, 1, 2, 3, 4}; +CBC_DataMatrixDetector::CBC_DataMatrixDetector(CBC_CommonBitMatrix *image): + m_image(image), m_rectangleDetector(NULL) +{ +} +void CBC_DataMatrixDetector::Init(FX_INT32 &e) +{ + m_rectangleDetector = FX_NEW CBC_WhiteRectangleDetector(m_image); + m_rectangleDetector->Init(e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +CBC_DataMatrixDetector::~CBC_DataMatrixDetector() +{ + if(m_rectangleDetector != NULL) { + delete m_rectangleDetector; + } + m_rectangleDetector = NULL; +} +inline FX_BOOL ResultPointsAndTransitionsComparator(FX_LPVOID a, FX_LPVOID b) +{ + return ((CBC_ResultPointsAndTransitions *)b)->GetTransitions() > ((CBC_ResultPointsAndTransitions *)a)->GetTransitions(); +} +CBC_QRDetectorResult *CBC_DataMatrixDetector::Detect(FX_INT32 &e) +{ + CFX_PtrArray* cornerPoints = m_rectangleDetector->Detect(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_ResultPoint *pointA = (CBC_ResultPoint*)(*cornerPoints)[0]; + CBC_ResultPoint *pointB = (CBC_ResultPoint*)(*cornerPoints)[1]; + CBC_ResultPoint *pointC = (CBC_ResultPoint*)(*cornerPoints)[2]; + CBC_ResultPoint *pointD = (CBC_ResultPoint*)(*cornerPoints)[3]; + delete cornerPoints; + cornerPoints = NULL; + CFX_PtrArray transitions; + transitions.Add(TransitionsBetween(pointA, pointB)); + transitions.Add(TransitionsBetween(pointA, pointC)); + transitions.Add(TransitionsBetween(pointB, pointD)); + transitions.Add(TransitionsBetween(pointC, pointD)); + BC_FX_PtrArray_Sort(transitions, &ResultPointsAndTransitionsComparator); + delete ( (CBC_ResultPointsAndTransitions *)transitions[2] ); + delete ( (CBC_ResultPointsAndTransitions *)transitions[3] ); + CBC_ResultPointsAndTransitions *lSideOne = (CBC_ResultPointsAndTransitions*)transitions[0]; + CBC_ResultPointsAndTransitions *lSideTwo = (CBC_ResultPointsAndTransitions*)transitions[1]; + CFX_MapPtrTemplate pointCount; + Increment(pointCount, lSideOne->GetFrom()); + Increment(pointCount, lSideOne->GetTo()); + Increment(pointCount, lSideTwo->GetFrom()); + Increment(pointCount, lSideTwo->GetTo()); + delete ( (CBC_ResultPointsAndTransitions *)transitions[1] ); + delete ( (CBC_ResultPointsAndTransitions *)transitions[0] ); + transitions.RemoveAll(); + CBC_ResultPoint *maybeTopLeft = NULL; + CBC_ResultPoint *bottomLeft = NULL; + CBC_ResultPoint *maybeBottomRight = NULL; + FX_POSITION itBegin = pointCount.GetStartPosition(); + while(itBegin != NULL) { + CBC_ResultPoint *key = 0; + FX_INT32 value = 0; + pointCount.GetNextAssoc(itBegin, key, value); + if(value == 2) { + bottomLeft = key; + } else { + if (maybeBottomRight == NULL) { + maybeBottomRight = key; + } else { + maybeTopLeft = key; + } + } + } + if (maybeTopLeft == NULL || bottomLeft == NULL || maybeBottomRight == NULL) { + delete pointA; + delete pointB; + delete pointC; + delete pointD; + e = BCExceptionNotFound; + return NULL; + } + CFX_PtrArray corners; + corners.SetSize(3); + corners[0] = maybeTopLeft; + corners[1] = bottomLeft; + corners[2] = maybeBottomRight; + OrderBestPatterns(&corners); + CBC_ResultPoint *bottomRight = (CBC_ResultPoint*)corners[0]; + bottomLeft = (CBC_ResultPoint*)corners[1]; + CBC_ResultPoint *topLeft = (CBC_ResultPoint*)corners[2]; + CBC_ResultPoint *topRight = NULL; + FX_INT32 value; + if (!pointCount.Lookup(pointA, value)) { + topRight = pointA; + } else if (!pointCount.Lookup(pointB, value)) { + topRight = pointB; + } else if (!pointCount.Lookup(pointC, value)) { + topRight = pointC; + } else { + topRight = pointD; + } + FX_INT32 dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, topRight))->GetTransitions(); + FX_INT32 dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, topRight))->GetTransitions(); + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + dimensionTop += 2; + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + dimensionRight += 2; + CBC_AutoPtr bits(NULL); + CBC_AutoPtr correctedTopRight(NULL); + if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { + correctedTopRight = + CBC_AutoPtr(CorrectTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight, + dimensionTop, dimensionRight)); + if (correctedTopRight.get() == NULL) { + correctedTopRight = CBC_AutoPtr(topRight); + } else { + delete topRight; + topRight = NULL; + } + dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(); + dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions(); + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + bits = CBC_AutoPtr(SampleGrid(m_image, topLeft, bottomLeft, bottomRight, + correctedTopRight.get(), dimensionTop, dimensionRight, e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + FX_INT32 dimension = FX_MIN(dimensionRight, dimensionTop); + correctedTopRight = CBC_AutoPtr(CorrectTopRight(bottomLeft, bottomRight, + topLeft, topRight, dimension)); + if (correctedTopRight.get() == NULL) { + correctedTopRight = CBC_AutoPtr(topRight); + } else { + delete topRight; + topRight = NULL; + } + FX_INT32 dimensionCorrected = FX_MAX(CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(), + CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions()); + dimensionCorrected++; + if ((dimensionCorrected & 0x01) == 1) { + dimensionCorrected++; + } + bits = CBC_AutoPtr(SampleGrid(m_image, + topLeft, + bottomLeft, + bottomRight, + correctedTopRight.get(), + dimensionCorrected, + dimensionCorrected, e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CFX_PtrArray *result = FX_NEW CFX_PtrArray; + result->SetSize(4); + result->Add(topLeft); + result->Add(bottomLeft); + result->Add(bottomRight); + result->Add(correctedTopRight.release()); + return FX_NEW CBC_QRDetectorResult(bits.release(), result); +} +CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimensionTop, FX_INT32 dimensionRight) +{ + FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimensionTop; + FX_INT32 norm = Distance(topLeft, topRight); + FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; + FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; + CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + corr = Distance(bottomLeft, topLeft) / (FX_FLOAT)dimensionRight; + norm = Distance(bottomRight, topRight); + cos = (topRight->GetX() - bottomRight->GetX()) / norm; + sin = (topRight->GetY() - bottomRight->GetY()) / norm; + CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + if (!IsValid(c1.get())) { + if (IsValid(c2.get())) { + return c2.release(); + } + return NULL; + } else if (!IsValid(c2.get())) { + return c1.release(); + } + FX_INT32 l1 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions()) + + FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); + FX_INT32 l2 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions()) + + FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); + if (l1 <= l2) { + return c1.release(); + } + return c2.release(); +} +CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRight(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimension) +{ + FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; + FX_INT32 norm = Distance(topLeft, topRight); + FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; + FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; + CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; + norm = Distance(bottomRight, topRight); + cos = (topRight->GetX() - bottomRight->GetX()) / norm; + sin = (topRight->GetY() - bottomRight->GetY()) / norm; + CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); + if (!IsValid(c1.get())) { + if (IsValid(c2.get())) { + return c2.release(); + } + return NULL; + } else if (!IsValid(c2.get())) { + return c1.release(); + } + FX_INT32 l1 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions() - + CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); + FX_INT32 l2 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions() - + CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); + return l1 <= l2 ? c1.release() : c2.release(); +} +FX_BOOL CBC_DataMatrixDetector::IsValid(CBC_ResultPoint *p) +{ + return p->GetX() >= 0 && p->GetX() < m_image->GetWidth() && p->GetY() > 0 && p->GetY() < m_image->GetHeight(); +} +FX_INT32 CBC_DataMatrixDetector::Round(FX_FLOAT d) +{ + return (FX_INT32) (d + 0.5f); +} +FX_INT32 CBC_DataMatrixDetector::Distance(CBC_ResultPoint *a, CBC_ResultPoint *b) +{ + return Round((FX_FLOAT) sqrt((a->GetX() - b->GetX()) + * (a->GetX() - b->GetX()) + (a->GetY() - b->GetY()) + * (a->GetY() - b->GetY()))); +} +void CBC_DataMatrixDetector::Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key) +{ + FX_INT32 value; + if(table.Lookup(key, value)) { + table.SetAt(key, INTEGERS[value + 1]); + } else { + table.SetAt(key, INTEGERS[1]); + } +} +CBC_CommonBitMatrix *CBC_DataMatrixDetector::SampleGrid(CBC_CommonBitMatrix *image, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topRight, + FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e) +{ + CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); + CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, + dimensionX, + dimensionY, + 0.5f, + 0.5f, + dimensionX - 0.5f, + 0.5f, + dimensionX - 0.5f, + dimensionY - 0.5f, + 0.5f, + dimensionY - 0.5f, + topLeft->GetX(), + topLeft->GetY(), + topRight->GetX(), + topRight->GetY(), + bottomRight->GetX(), + bottomRight->GetY(), + bottomLeft->GetX(), + bottomLeft->GetY(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cbm; +} +CBC_ResultPointsAndTransitions *CBC_DataMatrixDetector::TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to) +{ + FX_INT32 fromX = (FX_INT32) from->GetX(); + FX_INT32 fromY = (FX_INT32) from->GetY(); + FX_INT32 toX = (FX_INT32) to->GetX(); + FX_INT32 toY = (FX_INT32) to->GetY(); + FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); + if (steep) { + FX_INT32 temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + FX_INT32 dx = FXSYS_abs(toX - fromX); + FX_INT32 dy = FXSYS_abs(toY - fromY); + FX_INT32 error = -dx >> 1; + FX_INT32 ystep = fromY < toY ? 1 : -1; + FX_INT32 xstep = fromX < toX ? 1 : -1; + FX_INT32 transitions = 0; + FX_BOOL inBlack = m_image->Get(steep ? fromY : fromX, steep ? fromX : fromY); + for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { + FX_BOOL isBlack = m_image->Get(steep ? y : x, steep ? x : y); + if (isBlack != inBlack) { + transitions++; + inBlack = isBlack; + } + error += dy; + if (error > 0) { + if (y == toY) { + break; + } + y += ystep; + error -= dx; + } + } + return FX_NEW CBC_ResultPointsAndTransitions(from, to, transitions); +} +void CBC_DataMatrixDetector::OrderBestPatterns(CFX_PtrArray *patterns) +{ + FX_FLOAT abDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); + FX_FLOAT bcDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); + FX_FLOAT acDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); + CBC_ResultPoint *topLeft, *topRight, *bottomLeft; + if (bcDistance >= abDistance && bcDistance >= acDistance) { + topLeft = (CBC_ResultPoint*)(*patterns)[0]; + topRight = (CBC_ResultPoint*)(*patterns)[1]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; + } else if (acDistance >= bcDistance && acDistance >= abDistance) { + topLeft = (CBC_ResultPoint*)(*patterns)[1]; + topRight = (CBC_ResultPoint*)(*patterns)[0]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; + } else { + topLeft = (CBC_ResultPoint*)(*patterns)[2]; + topRight = (CBC_ResultPoint*)(*patterns)[0]; + bottomLeft = (CBC_ResultPoint*)(*patterns)[1]; + } + if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() + - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { + CBC_ResultPoint *temp = topRight; + topRight = bottomLeft; + bottomLeft = temp; + } + (*patterns)[0] = bottomLeft; + (*patterns)[1] = topLeft; + (*patterns)[2] = topRight; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h new file mode 100644 index 0000000000..2d3ca744fe --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixDetector.h @@ -0,0 +1,78 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXDETECTOR_H_ +#define _BC_DATAMATRIXDETECTOR_H_ +class CBC_CommonBitMatrix; +class CBC_WhiteRectangleDetector; +class CBC_ResultPoint; +class CBC_QRDetectorResult; +class CBC_DataMatrixDetector; +class ResultPointsAndTransitions; +class CBC_ResultPointsAndTransitions : public CFX_Object +{ +public: + CBC_ResultPointsAndTransitions(CBC_ResultPoint *from, CBC_ResultPoint *to, FX_INT32 transitions) + { + m_from = from; + m_to = to; + m_transitions = transitions; + } + ~CBC_ResultPointsAndTransitions() + { + } + CBC_ResultPoint *GetFrom() + { + return m_from; + } + CBC_ResultPoint *GetTo() + { + return m_to; + } + FX_INT32 GetTransitions() + { + return m_transitions; + } +private: + CBC_ResultPoint *m_from; + CBC_ResultPoint *m_to; + FX_INT32 m_transitions; +}; +class CBC_DataMatrixDetector +{ +public: + CBC_DataMatrixDetector(CBC_CommonBitMatrix *image); + virtual ~CBC_DataMatrixDetector(); + CBC_QRDetectorResult *Detect(FX_INT32 &e); + CBC_ResultPoint *CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *topRight, + FX_INT32 dimensionTop, FX_INT32 dimensionRight); + CBC_ResultPoint *CorrectTopRight(CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *topRight, + FX_INT32 dimension); + CBC_CommonBitMatrix *SampleGrid(CBC_CommonBitMatrix *image, + CBC_ResultPoint *topLeft, + CBC_ResultPoint *bottomLeft, + CBC_ResultPoint *bottomRight, + CBC_ResultPoint *topRight, + FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e); + CBC_ResultPointsAndTransitions *TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to); + FX_BOOL IsValid(CBC_ResultPoint *p); + FX_INT32 Distance(CBC_ResultPoint *a, CBC_ResultPoint *b); + void Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key); + FX_INT32 Round(FX_FLOAT d); + void OrderBestPatterns(CFX_PtrArray *patterns); + virtual void Init(FX_INT32 &e); +private: + CBC_CommonBitMatrix *m_image; + CBC_WhiteRectangleDetector *m_rectangleDetector; + const static FX_INT32 INTEGERS[5]; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp new file mode 100644 index 0000000000..cf076cd313 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.cpp @@ -0,0 +1,67 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_BinaryBitmap.h" +#include "../BC_Reader.h" +#include "../qrcode/BC_QRDetectorResult.h" +#include "../common/BC_CommonDecoderResult.h" +#include "BC_DataMatrixDecoder.h" +#include "BC_DataMatrixDetector.h" +#include "BC_DataMatrixReader.h" +CBC_DataMatrixReader::CBC_DataMatrixReader() +{ + m_decoder = NULL; +} +void CBC_DataMatrixReader::Init() +{ + m_decoder = FX_NEW CBC_DataMatrixDecoder; + m_decoder->Init(); +} +CBC_DataMatrixReader::~CBC_DataMatrixReader() +{ + if(m_decoder != NULL) { + delete m_decoder; + } + m_decoder = NULL; +} +CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CBC_CommonBitMatrix *cdr = image->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_DataMatrixDetector detector(cdr); + detector.Init(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_QRDetectorResult* ddr = detector.Detect(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr detectorResult(ddr); + CBC_CommonDecoderResult* ResultTemp = m_decoder->Decode(detectorResult->GetBits(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr decodeResult(ResultTemp); + return decodeResult->GetText(); +} +CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h new file mode 100644 index 0000000000..4301512d70 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixReader.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXREADER_H_ +#define _BC_DATAMATRIXREADER_H_ +class CBC_BinaryBitmap; +class CBC_DataMatrixDecoder; +class CBC_Reader; +class CBC_DataMatrixReader; +class CBC_DataMatrixReader : public CBC_Reader +{ +public: + CBC_DataMatrixReader(); + virtual ~CBC_DataMatrixReader(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, int hints, FX_INT32 &e); + + virtual void Init(); +private: + CBC_DataMatrixDecoder *m_decoder; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp new file mode 100644 index 0000000000..256117883d --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp @@ -0,0 +1,43 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_DataMatrixSymbolInfo144.h" +CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144() : CBC_SymbolInfo(FALSE, 1558, 620, 22, 22, 36) +{ + m_rsBlockData = -1; + m_rsBlockError = 62; +} +CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() +{ +} +FX_INT32 CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() +{ + return 10; +} +FX_INT32 CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(FX_INT32 index) +{ + return (index <= 8) ? 156 : 155; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h new file mode 100644 index 0000000000..e749b27d86 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h @@ -0,0 +1,19 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXSYMBOLINFO144_H_ +#define _BC_DATAMATRIXSYMBOLINFO144_H_ +class CBC_SymbolInfo; +class CBC_DataMatrixSymbolInfo144; +class CBC_DataMatrixSymbolInfo144 : public CBC_SymbolInfo +{ +public: + CBC_DataMatrixSymbolInfo144(); + virtual ~CBC_DataMatrixSymbolInfo144(); + FX_INT32 getInterleavedBlockCount(); + FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp new file mode 100644 index 0000000000..1a4e59864e --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.cpp @@ -0,0 +1,147 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_DataMatrixVersion.h" +CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL; +void CBC_DataMatrixVersion::Initialize() +{ + VERSIONS = FX_NEW CFX_PtrArray(); +} +void CBC_DataMatrixVersion::Finalize() +{ + for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { + delete ( (CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)) ); + } + VERSIONS->RemoveAll(); + delete VERSIONS; +} +CBC_DataMatrixVersion::CBC_DataMatrixVersion(FX_INT32 versionNumber, + FX_INT32 symbolSizeRows, + FX_INT32 symbolSizeColumns, + FX_INT32 dataRegionSizeRows, + FX_INT32 dataRegionSizeColumns, + ECBlocks *ecBlocks) +{ + m_versionNumber = versionNumber; + m_symbolSizeRows = symbolSizeRows; + m_symbolSizeColumns = symbolSizeColumns; + m_dataRegionSizeRows = dataRegionSizeRows; + m_dataRegionSizeColumns = dataRegionSizeColumns; + m_ecBlocks = ecBlocks; + FX_INT32 total = 0; + FX_INT32 ecCodewords = ecBlocks->GetECCodewords(); + const CFX_PtrArray &ecbArray = ecBlocks->GetECBlocks(); + for (FX_INT32 i = 0; i < ecbArray.GetSize(); i++) { + total += ((ECB*)ecbArray[i])->GetCount() * (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords); + } + m_totalCodewords = total; +} +CBC_DataMatrixVersion::~CBC_DataMatrixVersion() +{ + if(m_ecBlocks != NULL) { + delete m_ecBlocks; + } + m_ecBlocks = NULL; +} +FX_INT32 CBC_DataMatrixVersion::GetVersionNumber() +{ + return m_versionNumber; +} +FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeRows() +{ + return m_symbolSizeRows; +} +FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeColumns() +{ + return m_symbolSizeColumns; +} +FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeRows() +{ + return m_dataRegionSizeRows; +} +FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeColumns() +{ + return m_dataRegionSizeColumns; +} +FX_INT32 CBC_DataMatrixVersion::GetTotalCodewords() +{ + return m_totalCodewords; +} +ECBlocks *CBC_DataMatrixVersion::GetECBlocks() +{ + return m_ecBlocks; +} +void CBC_DataMatrixVersion::ReleaseAll() +{ + for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { + delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i); + } + VERSIONS->RemoveAll(); +} +CBC_DataMatrixVersion *CBC_DataMatrixVersion::GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e) +{ + if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { + e = BCExceptionNotFound; + return NULL; + } + if(VERSIONS->GetSize() == 0) { + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(1, 10, 10, 8, 8, FX_NEW ECBlocks(5, FX_NEW ECB(1, 3)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(2, 12, 12, 10, 10, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(3, 14, 14, 12, 12, FX_NEW ECBlocks(10, FX_NEW ECB(1, 8)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(4, 16, 16, 14, 14, FX_NEW ECBlocks(12, FX_NEW ECB(1, 12)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(5, 18, 18, 16, 16, FX_NEW ECBlocks(14, FX_NEW ECB(1, 18)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(6, 20, 20, 18, 18, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(7, 22, 22, 20, 20, FX_NEW ECBlocks(20, FX_NEW ECB(1, 30)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(8, 24, 24, 22, 22, FX_NEW ECBlocks(24, FX_NEW ECB(1, 36)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(9, 26, 26, 24, 24, FX_NEW ECBlocks(28, FX_NEW ECB(1, 44)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(10, 32, 32, 14, 14, FX_NEW ECBlocks(36, FX_NEW ECB(1, 62)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(11, 36, 36, 16, 16, FX_NEW ECBlocks(42, FX_NEW ECB(1, 86)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(12, 40, 40, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(1, 114)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(13, 44, 44, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(1, 144)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(14, 48, 48, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(1, 174)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(15, 52, 52, 24, 24, FX_NEW ECBlocks(42, FX_NEW ECB(2, 102)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(16, 64, 64, 14, 14, FX_NEW ECBlocks(56, FX_NEW ECB(2, 140)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(17, 72, 72, 16, 16, FX_NEW ECBlocks(36, FX_NEW ECB(4, 92)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(18, 80, 80, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(4, 114)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(19, 88, 88, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(4, 144)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(20, 96, 96, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(4, 174)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(21, 104, 104, 24, 24, FX_NEW ECBlocks(56, FX_NEW ECB(6, 136)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(22, 120, 120, 18, 18, FX_NEW ECBlocks(68, FX_NEW ECB(6, 175)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(23, 132, 132, 20, 20, FX_NEW ECBlocks(62, FX_NEW ECB(8, 163)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(24, 144, 144, 22, 22, FX_NEW ECBlocks(62, FX_NEW ECB(8, 156), FX_NEW ECB(2, 155)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(25, 8, 18, 6, 16, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(26, 8, 32, 6, 14, FX_NEW ECBlocks(11, FX_NEW ECB(1, 10)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(27, 12, 26, 10, 24, FX_NEW ECBlocks(14, FX_NEW ECB(1, 16)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(28, 12, 36, 10, 16, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(29, 16, 36, 14, 16, FX_NEW ECBlocks(24, FX_NEW ECB(1, 32)))); + VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(30, 16, 48, 14, 22, FX_NEW ECBlocks(28, FX_NEW ECB(1, 49)))); + } + FX_INT32 numVersions = VERSIONS->GetSize(); + for (FX_INT32 i = 0; i < numVersions; ++i) { + if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows == numRows && ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns == numColumns) { + return (CBC_DataMatrixVersion*)(*VERSIONS)[i]; + } + } + e = BCExceptionNotFound; + return NULL; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h new file mode 100644 index 0000000000..41d2f23db6 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixVersion.h @@ -0,0 +1,101 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXVERSION_H_ +#define _BC_DATAMATRIXVERSION_H_ +class ECB; +class ECBlocks; +class CBC_DataMatrixVersion; +class ECB : public CFX_Object +{ +public: + ECB(FX_INT32 count, FX_INT32 dataCodewords) + { + m_count = count; + m_dataCodewords = dataCodewords; + } + + FX_INT32 GetCount() + { + return m_count; + } + + FX_INT32 GetDataCodewords() + { + return m_dataCodewords; + } +private: + FX_INT32 m_count; + FX_INT32 m_dataCodewords; +}; +class ECBlocks : public CFX_Object +{ +public: + ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks) + { + m_ecCodewords = ecCodewords; + m_ecBlocks.Add(ecBlocks); + } + + ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) + { + m_ecCodewords = ecCodewords; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); + } + ~ECBlocks() + { + for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { + delete (ECB*)m_ecBlocks[i]; + } + m_ecBlocks.RemoveAll(); + } + + FX_INT32 GetECCodewords() + { + return m_ecCodewords; + } + + const CFX_PtrArray &GetECBlocks() + { + return m_ecBlocks; + } +private: + FX_INT32 m_ecCodewords; + CFX_PtrArray m_ecBlocks; +}; +class CBC_DataMatrixVersion : public CFX_Object +{ +public: + CBC_DataMatrixVersion(FX_INT32 versionNumber, + FX_INT32 symbolSizeRows, + FX_INT32 symbolSizeColumns, + FX_INT32 dataRegionSizeRows, + FX_INT32 dataRegionSizeColumns, + ECBlocks *ecBlocks); + virtual ~CBC_DataMatrixVersion(); + static void Initialize(); + static void Finalize(); + FX_INT32 GetVersionNumber(); + FX_INT32 GetSymbolSizeRows(); + FX_INT32 GetSymbolSizeColumns(); + FX_INT32 GetDataRegionSizeRows(); + FX_INT32 GetDataRegionSizeColumns(); + FX_INT32 GetTotalCodewords(); + ECBlocks *GetECBlocks(); + static CBC_DataMatrixVersion *GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e); + static void ReleaseAll(); +private: + FX_INT32 m_versionNumber; + FX_INT32 m_symbolSizeRows; + FX_INT32 m_symbolSizeColumns; + FX_INT32 m_dataRegionSizeRows; + FX_INT32 m_dataRegionSizeColumns; + ECBlocks *m_ecBlocks; + FX_INT32 m_totalCodewords; + static CFX_PtrArray* VERSIONS; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp new file mode 100644 index 0000000000..652758a635 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp @@ -0,0 +1,138 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_TwoDimWriter.h" +#include "../BC_Dimension.h" +#include "../BC_BinaryBitmap.h" +#include "../BC_UtilCodingConvert.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/BC_CommonByteMatrix.h" +#include "BC_Encoder.h" +#include "BC_DefaultPlacement.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_DataMatrixSymbolInfo144.h" +#include "BC_ErrorCorrection.h" +#include "BC_EncoderContext.h" +#include "BC_C40Encoder.h" +#include "BC_TextEncoder.h" +#include "BC_X12Encoder.h" +#include "BC_EdifactEncoder.h" +#include "BC_Base256Encoder.h" +#include "BC_ASCIIEncoder.h" +#include "BC_HighLevelEncoder.h" +#include "BC_DataMatrixWriter.h" +CBC_DataMatrixWriter::CBC_DataMatrixWriter() +{ +} +CBC_DataMatrixWriter::~CBC_DataMatrixWriter() +{ +} +FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel (FX_INT32 level) +{ + m_iCorrectLevel = level; + return TRUE; +} +FX_BYTE* CBC_DataMatrixWriter::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + if (outWidth < 0 || outHeight < 0) { + e = BCExceptionHeightAndWidthMustBeAtLeast1; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_SymbolShapeHint::SymbolShapeHint shape = CBC_SymbolShapeHint::FORCE_SQUARE; + CBC_Dimension* minSize = NULL; + CBC_Dimension* maxSize = NULL; + CFX_WideString ecLevel; + CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(contents, ecLevel, shape, minSize, maxSize, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(encoded.GetLength(), shape, minSize, maxSize, TRUE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_WideString codewords = CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DefaultPlacement* placement = FX_NEW CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e), symbolInfo->getSymbolDataHeight(e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + placement->place(); + CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + outWidth = bytematrix->GetWidth(); + outHeight = bytematrix->GetHeight(); + FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outHeight); + FXSYS_memcpy32(result, bytematrix->GetArray(), outWidth * outHeight); + delete bytematrix; + delete placement; + return result; +} +FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) +{ + FX_INT32 symbolWidth = symbolInfo->getSymbolDataWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 symbolHeight = symbolInfo->getSymbolDataHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_CommonByteMatrix* matrix = FX_NEW CBC_CommonByteMatrix(symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e)); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + matrix->Init(); + FX_INT32 matrixY = 0; + for (FX_INT32 y = 0; y < symbolHeight; y++) { + FX_INT32 matrixX; + if ((y % symbolInfo->m_matrixHeight) == 0) { + matrixX = 0; + for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { + matrix->Set(matrixX, matrixY, (x % 2) == 0); + matrixX++; + } + matrixY++; + } + matrixX = 0; + for (FX_INT32 x = 0; x < symbolWidth; x++) { + if ((x % symbolInfo->m_matrixWidth) == 0) { + matrix->Set(matrixX, matrixY, TRUE); + matrixX++; + } + matrix->Set(matrixX, matrixY, placement->getBit(x, y)); + matrixX++; + if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) { + matrix->Set(matrixX, matrixY, (y % 2) == 0); + matrixX++; + } + } + matrixY++; + if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) { + matrixX = 0; + for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { + matrix->Set(matrixX, matrixY, TRUE); + matrixX++; + } + matrixY++; + } + } + return matrix; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h new file mode 100644 index 0000000000..c8a6bdd823 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DataMatrixWriter.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DATAMATRIXWRITER_H_ +#define _BC_DATAMATRIXWRITER_H_ +class CBC_CommonByteMatrix; +class CBC_CommonBitMatrix; +class CBC_DefaultPlacement; +class CBC_SymbolShapeHint; +class CBC_SymbolInfo; +class CBC_TwoDimWriter; +class CBC_DataMatrixWriter; +class CBC_DataMatrixWriter : public CBC_TwoDimWriter +{ +public: + CBC_DataMatrixWriter(); + virtual ~CBC_DataMatrixWriter(); + FX_BYTE* Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BOOL SetErrorCorrectionLevel (FX_INT32 level); + +private: + static CBC_CommonByteMatrix* encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); + FX_INT32 m_iCorrectLevel; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp new file mode 100644 index 0000000000..e6bab5a65e --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.cpp @@ -0,0 +1,174 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_Encoder.h" +#include "BC_DefaultPlacement.h" +CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows) +{ + m_codewords = codewords; + m_numcols = numcols; + m_numrows = numrows; + m_bits.SetSize(numcols * numrows); + for (FX_INT32 i = 0; i < numcols * numrows; i++) { + m_bits[i] = (FX_BYTE) 2; + } +} +CBC_DefaultPlacement::~CBC_DefaultPlacement() +{ + m_bits.RemoveAll(); +} +FX_INT32 CBC_DefaultPlacement::getNumrows() +{ + return m_numrows; +} +FX_INT32 CBC_DefaultPlacement::getNumcols() +{ + return m_numcols; +} +CFX_ByteArray& CBC_DefaultPlacement::getBits() +{ + return m_bits; +} +FX_BOOL CBC_DefaultPlacement::getBit(FX_INT32 col, FX_INT32 row) +{ + return m_bits[row * m_numcols + col] == 1; +} +void CBC_DefaultPlacement::setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit) +{ + m_bits[row * m_numcols + col] = bit ? (FX_BYTE) 1 : (FX_BYTE) 0; +} +FX_BOOL CBC_DefaultPlacement::hasBit(FX_INT32 col, FX_INT32 row) +{ + return m_bits[row * m_numcols + col] != 2; +} +void CBC_DefaultPlacement::place() +{ + FX_INT32 pos = 0; + FX_INT32 row = 4; + FX_INT32 col = 0; + do { + if ((row == m_numrows) && (col == 0)) { + corner1(pos++); + } + if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) { + corner2(pos++); + } + if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) { + corner3(pos++); + } + if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) { + corner4(pos++); + } + do { + if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) { + utah(row, col, pos++); + } + row -= 2; + col += 2; + } while (row >= 0 && (col < m_numcols)); + row++; + col += 3; + do { + if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) { + utah(row, col, pos++); + } + row += 2; + col -= 2; + } while ((row < m_numrows) && (col >= 0)); + row += 3; + col++; + } while ((row < m_numrows) || (col < m_numcols)); + if (!hasBit(m_numcols - 1, m_numrows - 1)) { + setBit(m_numcols - 1, m_numrows - 1, TRUE); + setBit(m_numcols - 2, m_numrows - 2, TRUE); + } +} +void CBC_DefaultPlacement::module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit) +{ + if (row < 0) { + row += m_numrows; + col += 4 - ((m_numrows + 4) % 8); + } + if (col < 0) { + col += m_numcols; + row += 4 - ((m_numcols + 4) % 8); + } + FX_INT32 v = m_codewords.GetAt(pos); + v &= 1 << (8 - bit); + setBit(col, row, v != 0); +} +void CBC_DefaultPlacement::utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos) +{ + module(row - 2, col - 2, pos, 1); + module(row - 2, col - 1, pos, 2); + module(row - 1, col - 2, pos, 3); + module(row - 1, col - 1, pos, 4); + module(row - 1, col, pos, 5); + module(row, col - 2, pos, 6); + module(row, col - 1, pos, 7); + module(row, col, pos, 8); +} +void CBC_DefaultPlacement::corner1(FX_INT32 pos) +{ + module(m_numrows - 1, 0, pos, 1); + module(m_numrows - 1, 1, pos, 2); + module(m_numrows - 1, 2, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 1, pos, 6); + module(2, m_numcols - 1, pos, 7); + module(3, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner2(FX_INT32 pos) +{ + module(m_numrows - 3, 0, pos, 1); + module(m_numrows - 2, 0, pos, 2); + module(m_numrows - 1, 0, pos, 3); + module(0, m_numcols - 4, pos, 4); + module(0, m_numcols - 3, pos, 5); + module(0, m_numcols - 2, pos, 6); + module(0, m_numcols - 1, pos, 7); + module(1, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner3(FX_INT32 pos) +{ + module(m_numrows - 3, 0, pos, 1); + module(m_numrows - 2, 0, pos, 2); + module(m_numrows - 1, 0, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 1, pos, 6); + module(2, m_numcols - 1, pos, 7); + module(3, m_numcols - 1, pos, 8); +} +void CBC_DefaultPlacement::corner4(FX_INT32 pos) +{ + module(m_numrows - 1, 0, pos, 1); + module(m_numrows - 1, m_numcols - 1, pos, 2); + module(0, m_numcols - 3, pos, 3); + module(0, m_numcols - 2, pos, 4); + module(0, m_numcols - 1, pos, 5); + module(1, m_numcols - 3, pos, 6); + module(1, m_numcols - 2, pos, 7); + module(1, m_numcols - 1, pos, 8); +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h new file mode 100644 index 0000000000..ba2da03408 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_DefaultPlacement.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DEFAULTPLACEMENT_H_ +#define _BC_DEFAULTPLACEMENT_H_ +class CBC_DefaultPlacement; +class CBC_DefaultPlacement : public CFX_Object +{ +public: + CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows); + virtual ~CBC_DefaultPlacement(); + + FX_INT32 getNumrows(); + FX_INT32 getNumcols(); + CFX_ByteArray& getBits(); + FX_BOOL getBit(FX_INT32 col, FX_INT32 row); + void setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit); + FX_BOOL hasBit(FX_INT32 col, FX_INT32 row); + void place(); +private: + CFX_WideString m_codewords; + FX_INT32 m_numrows; + FX_INT32 m_numcols; + CFX_ByteArray m_bits; + void module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit); + void utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos); + void corner1(FX_INT32 pos); + void corner2(FX_INT32 pos); + void corner3(FX_INT32 pos); + void corner4(FX_INT32 pos); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp new file mode 100644 index 0000000000..d1e84af73e --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.cpp @@ -0,0 +1,153 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../BC_Dimension.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_EdifactEncoder.h" +CBC_EdifactEncoder::CBC_EdifactEncoder() +{ +} +CBC_EdifactEncoder::~CBC_EdifactEncoder() +{ +} +FX_INT32 CBC_EdifactEncoder::getEncodingMode() +{ + return EDIFACT_ENCODATION; +} +void CBC_EdifactEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + context.m_pos++; + FX_INT32 count = buffer.GetLength(); + if (count >= 4) { + context.writeCodewords(encodeToCodewords(buffer, 0, e)); + if (e != BCExceptionNO) { + return; + } + buffer.Delete(0, 4); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(ASCII_ENCODATION); + break; + } + } + } + buffer += (FX_WCHAR)31; + handleEOD(context, buffer, e); +} +void CBC_EdifactEncoder::handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e) +{ + FX_INT32 count = buffer.GetLength(); + if (count == 0) { + return; + } + if (count == 1) { + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + FX_INT32 remaining = context.getRemainingCharacters(); + if (remaining == 0 && available <= 2) { + return; + } + } + if (count > 4) { + e = BCExceptionIllegalStateCountMustNotExceed4; + return; + } + FX_INT32 restChars = count - 1; + CFX_WideString encoded = encodeToCodewords(buffer, 0, e); + if (e != BCExceptionNO) { + return; + } + FX_BOOL endOfSymbolReached = !context.hasMoreCharacters(); + FX_BOOL restInAscii = endOfSymbolReached && restChars <= 2; + if (restChars <= 2) { + context.updateSymbolInfo(context.getCodewordCount() + restChars, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + if (available >= 3) { + restInAscii = FALSE; + context.updateSymbolInfo(context.getCodewordCount() + encoded.GetLength(), e); + if (e != BCExceptionNO) { + return; + } + } + } + if (restInAscii) { + context.resetSymbolInfo(); + context.m_pos -= restChars; + } else { + context.writeCodewords(encoded); + } + context.signalEncoderChange(ASCII_ENCODATION); +} +void CBC_EdifactEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c >= ' ' && c <= '?') { + sb += c; + } else if (c >= '@' && c <= '^') { + sb += (FX_WCHAR)(c - 64); + } else { + CBC_HighLevelEncoder::illegalCharacter(c, e); + } +} +CFX_WideString CBC_EdifactEncoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e) +{ + FX_INT32 len = sb.GetLength() - startPos; + if (len == 0) { + e = BCExceptionNoContents; + return (FX_LPWSTR)""; + } + FX_WCHAR c1 = sb.GetAt(startPos); + FX_WCHAR c2 = len >= 2 ? sb.GetAt(startPos + 1) : 0; + FX_WCHAR c3 = len >= 3 ? sb.GetAt(startPos + 2) : 0; + FX_WCHAR c4 = len >= 4 ? sb.GetAt(startPos + 3) : 0; + FX_INT32 v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; + FX_WCHAR cw1 = (FX_WCHAR) ((v >> 16) & 255); + FX_WCHAR cw2 = (FX_WCHAR) ((v >> 8) & 255); + FX_WCHAR cw3 = (FX_WCHAR) (v & 255); + CFX_WideString res; + res += cw1; + if (len >= 2) { + res += cw2; + } + if (len >= 3) { + res += cw3; + } + return res; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h new file mode 100644 index 0000000000..7e2453a71d --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_EdifactEncoder.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_EDIFACTENCODER_H_ +#define _BC_EDIFACTENCODER_H_ +class CBC_EncoderContext; +class CBC_EdifactEncoder; +class CBC_EdifactEncoder : public CBC_Encoder +{ +public: + CBC_EdifactEncoder(); + virtual ~CBC_EdifactEncoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); +private: + static void handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e); + static void encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); + static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp new file mode 100644 index 0000000000..acae555afe --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_Encoder.cpp @@ -0,0 +1,14 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../barcode.h" +#include "BC_Encoder.h" +CBC_Encoder::CBC_Encoder() +{ +} +CBC_Encoder::~CBC_Encoder() +{ +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_Encoder.h new file mode 100644 index 0000000000..10ac8763e5 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_Encoder.h @@ -0,0 +1,19 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ENCODER_H_ +#define _BC_ENCODER_H_ +class CBC_EncoderContext; +class CBC_Encoder; +class CBC_Encoder : public CFX_Object +{ +public: + CBC_Encoder(); + virtual ~CBC_Encoder(); + virtual FX_INT32 getEncodingMode() = 0; + virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e) = 0; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp new file mode 100644 index 0000000000..f65c9f29bc --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.cpp @@ -0,0 +1,127 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "../BC_UtilCodingConvert.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) +{ + CFX_ByteString dststr; + CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr); + CFX_WideString sb; + FX_INT32 c = dststr.GetLength(); + for (FX_INT32 i = 0; i < c; i++) { + FX_WCHAR ch = (FX_WCHAR)(dststr.GetAt(i) & 0xff); + if (ch == '?' && dststr.GetAt(i) != '?') { + e = BCExceptionCharactersOutsideISO88591Encoding; + } + sb += ch; + } + m_msg = sb; + m_shape = FORCE_NONE; + m_newEncoding = -1; + m_pos = 0; + m_symbolInfo = NULL; + m_skipAtEnd = 0; + m_maxSize = NULL; + m_minSize = NULL; +} +CBC_EncoderContext::~CBC_EncoderContext() +{ +} +void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape) +{ + m_shape = shape; +} +void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize) +{ + m_maxSize = maxSize; + m_minSize = minSize; +} +CFX_WideString CBC_EncoderContext::getMessage() +{ + return m_msg; +} +void CBC_EncoderContext::setSkipAtEnd(FX_INT32 count) +{ + m_skipAtEnd = count; +} +FX_WCHAR CBC_EncoderContext::getCurrentChar() +{ + return m_msg.GetAt(m_pos); +} +FX_WCHAR CBC_EncoderContext::getCurrent() +{ + return m_msg.GetAt(m_pos); +} +void CBC_EncoderContext::writeCodewords(CFX_WideString codewords) +{ + m_codewords += codewords; +} +void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword) +{ + m_codewords += codeword; +} +FX_INT32 CBC_EncoderContext::getCodewordCount() +{ + return m_codewords.GetLength(); +} +void CBC_EncoderContext::signalEncoderChange(FX_INT32 encoding) +{ + m_newEncoding = encoding; +} +void CBC_EncoderContext::resetEncoderSignal() +{ + m_newEncoding = -1; +} +FX_BOOL CBC_EncoderContext::hasMoreCharacters() +{ + return m_pos < getTotalMessageCharCount(); +} +FX_INT32 CBC_EncoderContext::getRemainingCharacters() +{ + return getTotalMessageCharCount() - m_pos; +} +void CBC_EncoderContext::updateSymbolInfo(FX_INT32 &e) +{ + updateSymbolInfo(getCodewordCount(), e); +} +void CBC_EncoderContext::updateSymbolInfo(FX_INT32 len, FX_INT32 &e) +{ + if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) { + m_symbolInfo = CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_EncoderContext::resetSymbolInfo() +{ + m_shape = FORCE_NONE; +} +FX_INT32 CBC_EncoderContext::getTotalMessageCharCount() +{ + return m_msg.GetLength() - m_skipAtEnd; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h new file mode 100644 index 0000000000..0099dbc9f0 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_EncoderContext.h @@ -0,0 +1,48 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ENCODERCONTEXT_H_ +#define _BC_ENCODERCONTEXT_H_ +class CBC_SymbolShapeHint; +class CBC_SymbolInfo; +class CBC_Dimension; +class CBC_EncoderContext; +class CBC_EncoderContext : public CBC_SymbolShapeHint +{ +public: + CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); + virtual ~CBC_EncoderContext(); + void setSymbolShape(SymbolShapeHint shape); + void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize); + CFX_WideString getMessage(); + void setSkipAtEnd(FX_INT32 count); + FX_WCHAR getCurrentChar(); + FX_WCHAR getCurrent(); + void writeCodewords(CFX_WideString codewords); + void writeCodeword(FX_WCHAR codeword); + FX_INT32 getCodewordCount(); + void signalEncoderChange(FX_INT32 encoding); + void resetEncoderSignal(); + FX_BOOL hasMoreCharacters(); + FX_INT32 getRemainingCharacters(); + void updateSymbolInfo(FX_INT32 &e); + void updateSymbolInfo(FX_INT32 len, FX_INT32 &e); + void resetSymbolInfo(); +public: + CFX_WideString m_msg; + CFX_WideString m_codewords; + FX_INT32 m_pos; + FX_INT32 m_newEncoding; + CBC_SymbolInfo* m_symbolInfo; +private: + FX_INT32 getTotalMessageCharCount(); +private: + SymbolShapeHint m_shape; + CBC_Dimension* m_minSize; + CBC_Dimension* m_maxSize; + FX_INT32 m_skipAtEnd; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp new file mode 100644 index 0000000000..f346072499 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.cpp @@ -0,0 +1,194 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_ErrorCorrection.h" +FX_INT32 CBC_ErrorCorrection::FACTOR_SETS[] = {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68}; +FX_INT32 CBC_ErrorCorrection::FACTORS[][100] = { + {228, 48, 15, 111, 62}, + {23, 68, 144, 134, 240, 92, 254}, + {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, + {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, + {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, + {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, + {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, + {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, + { + 52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, + 254, 124, 12, 181, 184, 96, 50, 193 + }, + { + 211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, + 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255 + }, + { + 245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, + 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, + 225, 98, 81, 112 + }, + { + 77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, + 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, + 248, 202, 69, 50, 150, 177, 226, 5, 9, 5 + }, + { + 245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, + 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, + 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19 + }, + { + 175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, + 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, + 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, + 155, 43, 203, 107, 233, 53, 143, 46 + }, + { + 242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, + 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, + 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, + 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204 + }, + { + 220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, + 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, + 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, + 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, + 96, 103, 82, 186 + } +}; +FX_INT32 CBC_ErrorCorrection::MODULO_VALUE = 0x12D; +FX_INT32 CBC_ErrorCorrection::LOG[256] = {0}; +FX_INT32 CBC_ErrorCorrection::ALOG[256] = {0}; +void CBC_ErrorCorrection::Initialize() +{ + FX_INT32 p = 1; + for (FX_INT32 i = 0; i < 255; i++) { + ALOG[i] = p; + LOG[p] = i; + p <<= 1; + if (p >= 256) { + p ^= MODULO_VALUE; + } + } +} +void CBC_ErrorCorrection::Finalize() +{ +} +CBC_ErrorCorrection::CBC_ErrorCorrection() +{ +} +CBC_ErrorCorrection::~CBC_ErrorCorrection() +{ +} +CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) +{ + if (codewords.GetLength() != symbolInfo->m_dataCapacity) { + e = BCExceptionIllegalArgument; + return (FX_LPWSTR)""; + } + CFX_WideString sb; + sb += codewords; + FX_INT32 blockCount = symbolInfo->getInterleavedBlockCount(); + if (blockCount == 1) { + CFX_WideString ecc = createECCBlock(codewords, symbolInfo->m_errorCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += ecc; + } else { + CFX_Int32Array dataSizes; + dataSizes.SetSize(blockCount); + CFX_Int32Array errorSizes; + errorSizes.SetSize(blockCount); + CFX_Int32Array startPos; + startPos.SetSize(blockCount); + for (FX_INT32 i = 0; i < blockCount; i++) { + dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1); + errorSizes[i] = symbolInfo->getErrorLengthForInterleavedBlock(i + 1); + startPos[i] = 0; + if (i > 0) { + startPos[i] = startPos[i - 1] + dataSizes[i]; + } + } + for (FX_INT32 block = 0; block < blockCount; block++) { + CFX_WideString temp; + for (FX_INT32 d = block; d < symbolInfo->m_dataCapacity; d += blockCount) { + temp += (FX_WCHAR)codewords.GetAt(d); + } + CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + FX_INT32 pos = 0; + for (FX_INT32 l = block; l < errorSizes[block] * blockCount; l += blockCount) { + sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++)); + } + } + } + return sb; +} +CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e) +{ + return createECCBlock(codewords, 0, codewords.GetLength(), numECWords, e); +} +CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e) +{ + FX_INT32 table = -1; + for (FX_INT32 i = 0; i < sizeof(FACTOR_SETS) / sizeof(FX_INT32); i++) { + if (FACTOR_SETS[i] == numECWords) { + table = i; + break; + } + } + if (table < 0) { + e = BCExceptionIllegalArgument; + return (FX_LPWSTR)""; + } + FX_WORD* ecc = FX_Alloc(FX_WORD, numECWords); + FXSYS_memset32(ecc, 0, numECWords * sizeof(FX_WORD)); + for (FX_INT32 l = start; l < start + len; l++) { + FX_BYTE A = (FX_BYTE)codewords.GetAt(l); + FX_WORD B = ecc[numECWords - 1]; + FX_WORD m = ecc[numECWords - 1] ^ codewords.GetAt(l); + for (FX_INT32 k = numECWords - 1; k > 0; k--) { + if (m != 0 && FACTORS[table][k] != 0) { + FX_INT32 a = LOG[FACTORS[table][k]]; + FX_INT32 b = ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]; + FX_WORD c = ecc[k - 1]; + FX_WORD D = (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); + ecc[k] = (FX_WORD ) (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); + } else { + ecc[k] = ecc[k - 1]; + } + } + if (m != 0 && FACTORS[table][0] != 0) { + ecc[0] = (FX_WORD) ALOG[(LOG[m] + LOG[FACTORS[table][0]]) % 255]; + } else { + ecc[0] = 0; + } + } + CFX_WideString strecc; + for (FX_INT32 j = 0; j < numECWords; j++) { + strecc += (FX_WCHAR)ecc[numECWords - j - 1]; + } + FX_Free(ecc); + return strecc; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h new file mode 100644 index 0000000000..973ff33b8e --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_ErrorCorrection.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ERRORCORRECTION_H_ +#define _BC_ERRORCORRECTION_H_ +class CBC_SymbolInfo; +class CBC_ErrorCorrection; +class CBC_ErrorCorrection : public CFX_Object +{ +public: + CBC_ErrorCorrection(); + virtual ~CBC_ErrorCorrection(); + static void Initialize(); + static void Finalize(); + static CFX_WideString encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); +private: + static FX_INT32 FACTOR_SETS[]; + static FX_INT32 FACTORS[][100]; + static FX_INT32 MODULO_VALUE; + static FX_INT32 LOG[256]; + static FX_INT32 ALOG[256]; +private: + static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e); + static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp new file mode 100644 index 0000000000..5b46612d62 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp @@ -0,0 +1,368 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "../BC_UtilCodingConvert.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_C40Encoder.h" +#include "BC_TextEncoder.h" +#include "BC_X12Encoder.h" +#include "BC_EdifactEncoder.h" +#include "BC_Base256Encoder.h" +#include "BC_ASCIIEncoder.h" +#include "BC_HighLevelEncoder.h" +#define Integer_MAX_VALUE 2147483647 +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; +FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; +FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; +FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; +FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; +FX_WCHAR CBC_HighLevelEncoder::PAD = 129; +FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; +FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; +const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; +const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; +const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; +CBC_HighLevelEncoder::CBC_HighLevelEncoder() +{ +} +CBC_HighLevelEncoder::~CBC_HighLevelEncoder() +{ +} +CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) +{ + CFX_ByteString bytestr; + CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); + for (FX_INT32 i = 0; i < bytestr.GetLength(); i++) { + m_bytearray.Add(bytestr.GetAt(i)); + } + return m_bytearray; +} +CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) +{ + return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e); +} +CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e) +{ + CBC_EncoderContext context(msg, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + context.setSymbolShape(shape); + context.setSizeConstraints(minSize, maxSize); + if ((msg.Mid(0, 6) == MACRO_05_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { + context.writeCodeword(MACRO_05); + context.setSkipAtEnd(2); + context.m_pos += 6; + } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { + context.writeCodeword(MACRO_06); + context.setSkipAtEnd(2); + context.m_pos += 6; + } + CFX_PtrArray encoders; + encoders.Add(FX_NEW CBC_ASCIIEncoder()); + encoders.Add(FX_NEW CBC_C40Encoder()); + encoders.Add(FX_NEW CBC_TextEncoder()); + encoders.Add(FX_NEW CBC_X12Encoder()); + encoders.Add(FX_NEW CBC_EdifactEncoder()); + encoders.Add(FX_NEW CBC_Base256Encoder()); + FX_INT32 encodingMode = ASCII_ENCODATION; + while (context.hasMoreCharacters()) { + ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return (FX_LPWSTR)""; + } + if (context.m_newEncoding >= 0) { + encodingMode = context.m_newEncoding; + context.resetEncoderSignal(); + } + } + FX_INT32 len = context.m_codewords.GetLength(); + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return (FX_LPWSTR)""; + } + FX_INT32 capacity = context.m_symbolInfo->m_dataCapacity; + if (len < capacity) { + if (encodingMode != ASCII_ENCODATION && encodingMode != BASE256_ENCODATION) { + context.writeCodeword(0x00fe); + } + } + CFX_WideString codewords = context.m_codewords; + if (codewords.GetLength() < capacity) { + codewords += PAD; + } + while (codewords.GetLength() < capacity) { + codewords += (randomize253State(PAD, codewords.GetLength() + 1)); + } + for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { + delete (CBC_Encoder*)encoders.GetAt(i); + } + encoders.RemoveAll(); + return codewords; +} +FX_INT32 CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode) +{ + if (startpos >= msg.GetLength()) { + return currentMode; + } + CFX_FloatArray charCounts; + if (currentMode == ASCII_ENCODATION) { + charCounts.Add(0); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1); + charCounts.Add(1.25f); + } else { + charCounts.Add(1); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2); + charCounts.Add(2.25f); + charCounts[currentMode] = 0; + } + FX_INT32 charsProcessed = 0; + while (TRUE) { + if ((startpos + charsProcessed) == msg.GetLength()) { + FX_DWORD min = Integer_MAX_VALUE; + CFX_ByteArray mins; + mins.SetSize(6); + CFX_Int32Array intCharCounts; + intCharCounts.SetSize(6); + min = findMinimums(charCounts, intCharCounts, min, mins); + FX_INT32 minCount = getMinimumCount(mins); + if (intCharCounts[ASCII_ENCODATION] == min) { + return ASCII_ENCODATION; + } + if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { + return BASE256_ENCODATION; + } + if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { + return EDIFACT_ENCODATION; + } + if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { + return TEXT_ENCODATION; + } + if (minCount == 1 && mins[X12_ENCODATION] > 0) { + return X12_ENCODATION; + } + return C40_ENCODATION; + } + FX_WCHAR c = msg.GetAt(startpos + charsProcessed); + charsProcessed++; + if (isDigit(c)) { + charCounts[ASCII_ENCODATION] += 0.5; + } else if (isExtendedASCII(c)) { + charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); + charCounts[ASCII_ENCODATION] += 2; + } else { + charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); + charCounts[ASCII_ENCODATION]++; + } + if (isNativeC40(c)) { + charCounts[C40_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[C40_ENCODATION] += 8.0f / 3.0f; + } else { + charCounts[C40_ENCODATION] += 4.0f / 3.0f; + } + if (isNativeText(c)) { + charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; + } else { + charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; + } + if (isNativeX12(c)) { + charCounts[X12_ENCODATION] += 2.0f / 3.0f; + } else if (isExtendedASCII(c)) { + charCounts[X12_ENCODATION] += 13.0f / 3.0f; + } else { + charCounts[X12_ENCODATION] += 10.0f / 3.0f; + } + if (isNativeEDIFACT(c)) { + charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; + } else if (isExtendedASCII(c)) { + charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; + } else { + charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; + } + if (isSpecialB256(c)) { + charCounts[BASE256_ENCODATION] += 4; + } else { + charCounts[BASE256_ENCODATION]++; + } + if (charsProcessed >= 4) { + CFX_Int32Array intCharCounts; + intCharCounts.SetSize(6); + CFX_ByteArray mins; + mins.SetSize(6); + findMinimums(charCounts, intCharCounts, Integer_MAX_VALUE, mins); + FX_INT32 minCount = getMinimumCount(mins); + if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] + && intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { + return ASCII_ENCODATION; + } + if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] + || (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + mins[EDIFACT_ENCODATION]) == 0) { + return BASE256_ENCODATION; + } + if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { + return EDIFACT_ENCODATION; + } + if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { + return TEXT_ENCODATION; + } + if (minCount == 1 && mins[X12_ENCODATION] > 0) { + return X12_ENCODATION; + } + if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[BASE256_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[EDIFACT_ENCODATION] + && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { + if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { + return C40_ENCODATION; + } + if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { + FX_INT32 p = startpos + charsProcessed + 1; + while (p < msg.GetLength()) { + FX_WCHAR tc = msg.GetAt(p); + if (isX12TermSep(tc)) { + return X12_ENCODATION; + } + if (!isNativeX12(tc)) { + break; + } + p++; + } + return C40_ENCODATION; + } + } + } + } +} +FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) +{ + return ch >= '0' && ch <= '9'; +} +FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) +{ + return ch >= 128 && ch <= 255; +} +FX_INT32 CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 count = 0; + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + if (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + while (isDigit(ch) && idx < len) { + count++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + } + return count; +} +void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, FX_INT32 &e) +{ + e = BCExceptionIllegalArgument; +} +FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition) +{ + FX_INT32 pseudoRandom = ((149 * codewordPosition) % 253) + 1; + FX_INT32 tempVariable = ch + pseudoRandom; + return tempVariable <= 254 ? (FX_WCHAR) tempVariable : (FX_WCHAR) (tempVariable - 254); +} +FX_INT32 CBC_HighLevelEncoder::findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins) +{ + for (FX_INT32 l = 0; l < mins.GetSize(); l++) { + mins[l] = (FX_BYTE)0; + } + for (FX_INT32 i = 0; i < 6; i++) { + intCharCounts[i] = (FX_INT32)ceil(charCounts[i]); + FX_INT32 current = intCharCounts[i]; + if (min > current) { + min = current; + for (FX_INT32 j = 0; j < mins.GetSize(); j++) { + mins[j] = (FX_BYTE)0; + } + } + if (min == current) { + mins[i]++; + } + } + return min; +} +FX_INT32 CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray &mins) +{ + FX_INT32 minCount = 0; + for (FX_INT32 i = 0; i < 6; i++) { + minCount += mins[i]; + } + return minCount; +} +FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) +{ + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) +{ + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) +{ + return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) +{ + return (ch == '\r') || (ch == '*') || (ch == '>'); +} +FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) +{ + return ch >= ' ' && ch <= '^'; +} +FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) +{ + return FALSE; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h new file mode 100644 index 0000000000..170ca9f8fa --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_HIGHLEVALENCODER_H_ +#define _BC_HIGHLEVALENCODER_H_ +class CBC_SymbolShapeHint; +class CBC_HighLevelEncoder; +#define ASCII_ENCODATION 0 +#define C40_ENCODATION 1 +#define TEXT_ENCODATION 2 +#define X12_ENCODATION 3 +#define EDIFACT_ENCODATION 4 +#define BASE256_ENCODATION 5 +class CBC_HighLevelEncoder : public CBC_SymbolShapeHint +{ +public: + CBC_HighLevelEncoder(); + virtual ~CBC_HighLevelEncoder(); + CFX_ByteArray& getBytesForMessage(CFX_WideString msg); + static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); + static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e); + static FX_INT32 lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode); + static FX_BOOL isDigit(FX_WCHAR ch); + static FX_BOOL isExtendedASCII(FX_WCHAR ch); + static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); + static void illegalCharacter(FX_WCHAR c, FX_INT32 &e); + +public: + static FX_WCHAR LATCH_TO_C40; + static FX_WCHAR LATCH_TO_BASE256; + static FX_WCHAR UPPER_SHIFT; + static FX_WCHAR LATCH_TO_ANSIX12; + static FX_WCHAR LATCH_TO_TEXT; + static FX_WCHAR LATCH_TO_EDIFACT; + static FX_WCHAR C40_UNLATCH; + static FX_WCHAR X12_UNLATCH; +private: + static FX_WCHAR PAD; + static FX_WCHAR MACRO_05; + static FX_WCHAR MACRO_06; + static const wchar_t* MACRO_05_HEADER; + static const wchar_t* MACRO_06_HEADER; + static const wchar_t MACRO_TRAILER; + CFX_ByteArray m_bytearray; +private: + static FX_WCHAR randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition); + static FX_INT32 findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins); + static FX_INT32 getMinimumCount(CFX_ByteArray &mins); + static FX_BOOL isNativeC40(FX_WCHAR ch); + static FX_BOOL isNativeText(FX_WCHAR ch); + static FX_BOOL isNativeX12(FX_WCHAR ch); + static FX_BOOL isX12TermSep(FX_WCHAR ch); + static FX_BOOL isNativeEDIFACT(FX_WCHAR ch); + static FX_BOOL isSpecialB256(FX_WCHAR ch); + +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp new file mode 100644 index 0000000000..415cbd6b3c --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.cpp @@ -0,0 +1,242 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Dimension.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_DataMatrixSymbolInfo144.h" +#define SYMBOLS_COUNT 30 +CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +void CBC_SymbolInfo::Initialize() +{ + m_PROD_SYMBOLS[0] = FX_NEW CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1); + m_PROD_SYMBOLS[1] = FX_NEW CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1); + m_PROD_SYMBOLS[2] = FX_NEW CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1); + m_PROD_SYMBOLS[3] = FX_NEW CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1); + m_PROD_SYMBOLS[4] = FX_NEW CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2); + m_PROD_SYMBOLS[5] = FX_NEW CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1); + m_PROD_SYMBOLS[6] = FX_NEW CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1); + m_PROD_SYMBOLS[7] = FX_NEW CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1); + m_PROD_SYMBOLS[8] = FX_NEW CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1); + m_PROD_SYMBOLS[9] = FX_NEW CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2); + m_PROD_SYMBOLS[10] = FX_NEW CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1); + m_PROD_SYMBOLS[11] = FX_NEW CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2); + m_PROD_SYMBOLS[12] = FX_NEW CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1); + m_PROD_SYMBOLS[13] = FX_NEW CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1); + m_PROD_SYMBOLS[14] = FX_NEW CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2); + m_PROD_SYMBOLS[15] = FX_NEW CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4); + m_PROD_SYMBOLS[16] = FX_NEW CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4); + m_PROD_SYMBOLS[17] = FX_NEW CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4); + m_PROD_SYMBOLS[18] = FX_NEW CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4); + m_PROD_SYMBOLS[19] = FX_NEW CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4); + m_PROD_SYMBOLS[20] = FX_NEW CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42); + m_PROD_SYMBOLS[21] = FX_NEW CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56); + m_PROD_SYMBOLS[22] = FX_NEW CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36); + m_PROD_SYMBOLS[23] = FX_NEW CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48); + m_PROD_SYMBOLS[24] = FX_NEW CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56); + m_PROD_SYMBOLS[25] = FX_NEW CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68); + m_PROD_SYMBOLS[26] = FX_NEW CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56); + m_PROD_SYMBOLS[27] = FX_NEW CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68); + m_PROD_SYMBOLS[28] = FX_NEW CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62); + m_PROD_SYMBOLS[29] = FX_NEW CBC_DataMatrixSymbolInfo144(); + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + m_symbols[i] = m_PROD_SYMBOLS[i]; + } +} +void CBC_SymbolInfo::Finalize() +{ + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + delete m_PROD_SYMBOLS[i]; + m_PROD_SYMBOLS[i] = NULL; + m_symbols[i] = NULL; + } +} +CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions) +{ + m_rectangular = rectangular; + m_dataCapacity = dataCapacity; + m_errorCodewords = errorCodewords; + m_matrixWidth = matrixWidth; + m_matrixHeight = matrixHeight; + m_dataRegions = dataRegions; + m_rsBlockData = dataCapacity; + m_rsBlockError = errorCodewords; +} +CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, + FX_INT32 rsBlockData, FX_INT32 rsBlockError) +{ + m_rectangular = rectangular; + m_dataCapacity = dataCapacity; + m_errorCodewords = errorCodewords; + m_matrixWidth = matrixWidth; + m_matrixHeight = matrixHeight; + m_dataRegions = dataRegions; + m_rsBlockData = rsBlockData; + m_rsBlockError = rsBlockError; +} +CBC_SymbolInfo::~CBC_SymbolInfo() +{ +} + +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_INT32 &e) +{ + return lookup(dataCodewords, FORCE_NONE, TRUE, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e) +{ + return lookup(dataCodewords, shape, TRUE, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e) +{ + SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE; + return lookup(dataCodewords, shape, fail, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e) +{ + return lookup(dataCodewords, shape, NULL, NULL, fail, e); +} +CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e) +{ + for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { + CBC_SymbolInfo* symbol = m_symbols[i]; + if (shape == FORCE_SQUARE && symbol->m_rectangular) { + continue; + } + if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) { + continue; + } + if (minSize != NULL && (symbol->getSymbolWidth(e) < minSize->getWidth() || symbol->getSymbolHeight(e) < minSize->getHeight())) { + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + continue; + } + if (maxSize != NULL && (symbol->getSymbolWidth(e) > maxSize->getWidth() || symbol->getSymbolHeight(e) > maxSize->getHeight())) { + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + continue; + } + if (dataCodewords <= symbol->m_dataCapacity) { + return symbol; + } + } + if (fail) { + e = BCExceptionIllegalDataCodewords; + return NULL; + } + return NULL; +} +FX_INT32 CBC_SymbolInfo::getHorizontalDataRegions(FX_INT32 &e) +{ + switch (m_dataRegions) { + case 1: + return 1; + case 2: + return 2; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + e = BCExceptionCannotHandleThisNumberOfDataRegions; + return 0; + } +} +FX_INT32 CBC_SymbolInfo::getVerticalDataRegions(FX_INT32 &e) +{ + switch (m_dataRegions) { + case 1: + return 1; + case 2: + return 1; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + e = BCExceptionCannotHandleThisNumberOfDataRegions; + return 0; + } +} +FX_INT32 CBC_SymbolInfo::getSymbolDataWidth(FX_INT32 &e) +{ + return getHorizontalDataRegions(e) * m_matrixWidth; +} +FX_INT32 CBC_SymbolInfo::getSymbolDataHeight(FX_INT32 &e) +{ + return getVerticalDataRegions(e) * m_matrixHeight; +} +FX_INT32 CBC_SymbolInfo::getSymbolWidth(FX_INT32 &e) +{ + return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2); +} +FX_INT32 CBC_SymbolInfo::getSymbolHeight(FX_INT32 &e) +{ + return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2); +} +FX_INT32 CBC_SymbolInfo::getCodewordCount() +{ + return m_dataCapacity + m_errorCodewords; +} +FX_INT32 CBC_SymbolInfo::getInterleavedBlockCount() +{ + return m_dataCapacity / m_rsBlockData; +} +FX_INT32 CBC_SymbolInfo::getDataLengthForInterleavedBlock(FX_INT32 index) +{ + return m_rsBlockData; +} +FX_INT32 CBC_SymbolInfo::getErrorLengthForInterleavedBlock(FX_INT32 index) +{ + return m_rsBlockError; +} +CFX_WideString CBC_SymbolInfo::toString(FX_INT32 &e) +{ + CFX_WideString sb; + sb += (FX_LPWSTR)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:"); + sb += (FX_LPWSTR)" data region "; + sb += m_matrixWidth; + sb += (FX_WCHAR)'x'; + sb += m_matrixHeight; + sb += (FX_LPWSTR)", symbol size "; + sb += getSymbolWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_WCHAR)'x'; + sb += getSymbolHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_LPWSTR)", symbol data size "; + sb += getSymbolDataWidth(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_WCHAR)'x'; + sb += getSymbolDataHeight(e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); + sb += (FX_LPWSTR)", codewords "; + sb += m_dataCapacity; + sb += (FX_WCHAR)'+'; + sb += m_errorCodewords; + return sb; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h new file mode 100644 index 0000000000..0450a28725 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_SymbolInfo.h @@ -0,0 +1,53 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_SYMBOLINFO_H_ +#define _BC_SYMBOLINFO_H_ +class CBC_SymbolShapeHint; +class CBC_Dimension; +class CBC_SymbolInfo; +class CBC_SymbolInfo : public CBC_SymbolShapeHint +{ +public: + CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, + FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions); + virtual ~CBC_SymbolInfo(); + static void Initialize(); + static void Finalize(); + static void overrideSymbolSet(CBC_SymbolInfo* override); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e); + static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e); + FX_INT32 getHorizontalDataRegions(FX_INT32 &e); + FX_INT32 getVerticalDataRegions(FX_INT32 &e); + FX_INT32 getSymbolDataWidth(FX_INT32 &e); + FX_INT32 getSymbolDataHeight(FX_INT32 &e); + FX_INT32 getSymbolWidth(FX_INT32 &e); + FX_INT32 getSymbolHeight(FX_INT32 &e); + FX_INT32 getCodewordCount(); + FX_INT32 getInterleavedBlockCount(); + FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); + FX_INT32 getErrorLengthForInterleavedBlock(FX_INT32 index); + CFX_WideString toString(FX_INT32 &e); +public: + FX_INT32 m_dataCapacity; + FX_INT32 m_errorCodewords; + FX_INT32 m_matrixWidth; + FX_INT32 m_matrixHeight; + FX_INT32 m_rsBlockData; + FX_INT32 m_rsBlockError; + static CBC_SymbolInfo* m_PROD_SYMBOLS[30]; +private: + static CBC_SymbolInfo* m_symbols[30]; + FX_BOOL m_rectangular; + FX_INT32 m_dataRegions; +private: + CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, + FX_INT32 rsBlockData, FX_INT32 rsBlockError); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp new file mode 100644 index 0000000000..b7b477539c --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_SymbolShapeHint.h" +CBC_SymbolShapeHint::CBC_SymbolShapeHint() +{ +} +CBC_SymbolShapeHint::~CBC_SymbolShapeHint() +{ +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h new file mode 100644 index 0000000000..2b030012a3 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_SymbolShapeHint.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_SYMBOLSHAPEHINT_H_ +#define _BC_SYMBOLSHAPEHINT_H_ +class CBC_SymbolShapeHint; +class CBC_SymbolShapeHint : public CFX_Object +{ +public: + CBC_SymbolShapeHint(); + virtual ~CBC_SymbolShapeHint(); + enum SymbolShapeHint { + FORCE_NONE, + FORCE_SQUARE, + FORCE_RECTANGLE, + }; +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp new file mode 100644 index 0000000000..45abec4d4a --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.cpp @@ -0,0 +1,102 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../BC_Dimension.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_C40Encoder.h" +#include "BC_TextEncoder.h" +CBC_TextEncoder::CBC_TextEncoder() +{ +} +CBC_TextEncoder::~CBC_TextEncoder() +{ +} +FX_INT32 CBC_TextEncoder::getEncodingMode() +{ + return TEXT_ENCODATION; +} +FX_INT32 CBC_TextEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == ' ') { + sb += (FX_WCHAR)'\3'; + return 1; + } + if (c >= '0' && c <= '9') { + sb += (FX_WCHAR) (c - 48 + 4); + return 1; + } + if (c >= 'a' && c <= 'z') { + sb += (FX_WCHAR) (c - 97 + 14); + return 1; + } + if (c >= '\0' && c <= 0x1f) { + sb += (FX_WCHAR)'\0'; + sb += c; + return 2; + } + if (c >= '!' && c <= '/') { + sb += (FX_WCHAR) '\1'; + sb += (FX_WCHAR) (c - 33); + return 2; + } + if (c >= ':' && c <= '@') { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR) (c - 58 + 15); + return 2; + } + if (c >= '[' && c <= '_') { + sb += (FX_WCHAR) '\1'; + sb += (FX_WCHAR) (c - 91 + 22); + return 2; + } + if (c == 0x0060) { + sb += (FX_WCHAR) '\2'; + sb += (FX_WCHAR) (c - 96); + return 2; + } + if (c >= 'A' && c <= 'Z') { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR) (c - 65 + 1); + return 2; + } + if (c >= '{' && c <= 0x007f) { + sb += (FX_WCHAR)'\2'; + sb += (FX_WCHAR) (c - 123 + 27); + return 2; + } + if (c >= 0x0080) { + sb += (FX_WCHAR)'\1'; + sb += (FX_WCHAR)0x001e; + FX_INT32 len = 2; + len += encodeChar((FX_WCHAR) (c - 128), sb, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + return len; + } + CBC_HighLevelEncoder::illegalCharacter(c, e); + return -1; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h new file mode 100644 index 0000000000..f1168679a6 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_TextEncoder.h @@ -0,0 +1,18 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_TEXTENCODER_H_ +#define _BC_TEXTENCODER_H_ +class CBC_TextEncoder; +class CBC_TextEncoder : public CBC_C40Encoder +{ +public: + CBC_TextEncoder(); + virtual ~CBC_TextEncoder(); + FX_INT32 getEncodingMode(); + FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp new file mode 100644 index 0000000000..f6263f6777 --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.cpp @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006-2007 Jeremias Maerki. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../BC_Dimension.h" +#include "BC_Encoder.h" +#include "BC_SymbolShapeHint.h" +#include "BC_SymbolInfo.h" +#include "BC_EncoderContext.h" +#include "BC_HighLevelEncoder.h" +#include "BC_C40Encoder.h" +#include "BC_X12Encoder.h" +CBC_X12Encoder::CBC_X12Encoder() +{ +} +CBC_X12Encoder::~CBC_X12Encoder() +{ +} +FX_INT32 CBC_X12Encoder::getEncodingMode() +{ + return X12_ENCODATION; +} +void CBC_X12Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) +{ + CFX_WideString buffer; + while (context.hasMoreCharacters()) { + FX_WCHAR c = context.getCurrentChar(); + context.m_pos++; + encodeChar(c, buffer, e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 count = buffer.GetLength(); + if ((count % 3) == 0) { + writeNextTriplet(context, buffer); + FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); + if (newMode != getEncodingMode()) { + context.signalEncoderChange(newMode); + break; + } + } + } + handleEOD(context, buffer, e); +} +void CBC_X12Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) +{ + context.updateSymbolInfo(e); + if (e != BCExceptionNO) { + return; + } + FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); + FX_INT32 count = buffer.GetLength(); + if (count == 2) { + context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); + context.m_pos -= 2; + context.signalEncoderChange(ASCII_ENCODATION); + } else if (count == 1) { + context.m_pos--; + if (available > 1) { + context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); + } + context.signalEncoderChange(ASCII_ENCODATION); + } +} +FX_INT32 CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) +{ + if (c == '\r') { + sb += (FX_WCHAR)'\0'; + } else if (c == '*') { + sb += (FX_WCHAR)'\1'; + } else if (c == '>') { + sb += (FX_WCHAR)'\2'; + } else if (c == ' ') { + sb += (FX_WCHAR)'\3'; + } else if (c >= '0' && c <= '9') { + sb += (FX_WCHAR) (c - 48 + 4); + } else if (c >= 'A' && c <= 'Z') { + sb += (FX_WCHAR) (c - 65 + 14); + } else { + CBC_HighLevelEncoder::illegalCharacter(c, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + } + return 1; +} diff --git a/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h new file mode 100644 index 0000000000..21111bc5cc --- /dev/null +++ b/xfa/src/fxbarcode/datamatrix/BC_X12Encoder.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_X12ENCODER_H_ +#define _BC_X12ENCODER_H_ +class CBC_C40Encoder; +class CBC_X12Encoder; +class CBC_X12Encoder : public CBC_C40Encoder +{ +public: + CBC_X12Encoder(); + virtual ~CBC_X12Encoder(); + FX_INT32 getEncodingMode(); + void Encode(CBC_EncoderContext &context, FX_INT32 &e); + void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); + FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OneDReader.cpp b/xfa/src/fxbarcode/oned/BC_OneDReader.cpp new file mode 100644 index 0000000000..1079c348d0 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDReader.cpp @@ -0,0 +1,179 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../BC_BinaryBitmap.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +const FX_INT32 CBC_OneDReader::INTEGER_MATH_SHIFT = 8; +const FX_INT32 CBC_OneDReader::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << 8; +CBC_OneDReader::CBC_OneDReader() +{ +} +CBC_OneDReader::~CBC_OneDReader() +{ +} +CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString strtemp = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return strtemp; +} +CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString strtemp = DeDecode(image, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return strtemp; +} +CFX_ByteString CBC_OneDReader::DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + FX_INT32 width = image->GetWidth(); + FX_INT32 height = image->GetHeight(); + CBC_CommonBitArray *row = NULL; + FX_INT32 middle = height >> 1; + FX_BOOL tryHarder = FALSE; + FX_INT32 rowStep = FX_MAX(1, height >> (tryHarder ? 8 : 5)); + FX_INT32 maxLines; + if (tryHarder) { + maxLines = height; + } else { + maxLines = 15; + } + for (FX_INT32 x = 0; x < maxLines; x++) { + FX_INT32 rowStepsAboveOrBelow = (x + 1) >> 1; + FX_BOOL isAbove = (x & 0x01) == 0; + FX_INT32 rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); + if (rowNumber < 0 || rowNumber >= height) { + break; + } + row = image->GetBlackRow(rowNumber, NULL, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + if(row != NULL) { + delete row; + row = NULL; + } + continue; + } + for (FX_INT32 attempt = 0; attempt < 2; attempt++) { + if (attempt == 1) { + row->Reverse(); + } + CFX_ByteString result = DecodeRow(rowNumber, row, hints, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + continue; + } + if(row != NULL) { + delete row; + row = NULL; + } + return result; + } + if(row != NULL) { + delete row; + row = NULL; + } + } + e = BCExceptionNotFound; + return ""; +} +void CBC_OneDReader::RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) +{ + FX_INT32 numCounters = counters->GetSize(); + for (FX_INT32 i = 0; i < numCounters; i++) { + (*counters)[i] = 0; + } + FX_INT32 end = row->GetSize(); + if (start >= end) { + e = BCExceptionNotFound; + return; + } + FX_BOOL isWhite = !row->Get(start); + FX_INT32 counterPosition = 0; + FX_INT32 j = start; + while (j < end) { + FX_BOOL pixel = row->Get(j); + if (pixel ^ isWhite) { + (*counters)[counterPosition]++; + } else { + counterPosition++; + if (counterPosition == numCounters) { + break; + } else { + (*counters)[counterPosition] = 1; + isWhite = !isWhite; + } + } + j++; + } + if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && j == end))) { + e = BCExceptionNotFound; + return; + } +} +void CBC_OneDReader::RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) +{ + FX_INT32 numTransitionsLeft = counters->GetSize(); + FX_BOOL last = row->Get(start); + while (start > 0 && numTransitionsLeft >= 0) { + if (row->Get(--start) != last) { + numTransitionsLeft--; + last = !last; + } + } + if (numTransitionsLeft >= 0) { + e = BCExceptionNotFound; + return; + } + RecordPattern(row, start + 1, counters, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +FX_INT32 CBC_OneDReader::PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance) +{ + FX_INT32 numCounters = counters->GetSize(); + FX_INT32 total = 0; + FX_INT32 patternLength = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + total += (*counters)[i]; + patternLength += pattern[i]; + } + if (total < patternLength) { +#undef max + return FXSYS_IntMax; + } + FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; + maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; + FX_INT32 totalVariance = 0; + for (FX_INT32 x = 0; x < numCounters; x++) { + FX_INT32 counter = (*counters)[x] << INTEGER_MATH_SHIFT; + FX_INT32 scaledPattern = pattern[x] * unitBarWidth; + FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { +#undef max + return FXSYS_IntMax; + } + totalVariance += variance; + } + return totalVariance / total; +} diff --git a/xfa/src/fxbarcode/oned/BC_OneDReader.h b/xfa/src/fxbarcode/oned/BC_OneDReader.h new file mode 100644 index 0000000000..8645c9edf9 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDReader.h @@ -0,0 +1,34 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDREADER_H_ +#define _BC_ONEDREADER_H_ +class CBC_Reader; +class CBC_BinaryBitmap; +class CBC_CommonBitArray; +class CBC_OneDReader; +class CBC_OneDReader : public CBC_Reader +{ +public: + CBC_OneDReader(); + virtual ~CBC_OneDReader(); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) + { + return ""; + } +private: + CFX_ByteString DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + +protected: + const static FX_INT32 INTEGER_MATH_SHIFT; + const static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; + void RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); + void RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); + FX_INT32 PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp b/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp new file mode 100644 index 0000000000..f1db94a6a1 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDimReader.cpp @@ -0,0 +1,235 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OneDimReader.h" +const FX_INT32 CBC_OneDimReader::MAX_AVG_VARIANCE = (FX_INT32)(256 * 0.48f); +const FX_INT32 CBC_OneDimReader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32)(256 * 0.7f); +const FX_INT32 CBC_OneDimReader::START_END_PATTERN[3] = {1, 1, 1}; +const FX_INT32 CBC_OneDimReader::MIDDLE_PATTERN[5] = {1, 1, 1, 1, 1}; +const FX_INT32 CBC_OneDimReader::L_PATTERNS[10][4] = { + {3, 2, 1, 1}, + {2, 2, 2, 1}, + {2, 1, 2, 2}, + {1, 4, 1, 1}, + {1, 1, 3, 2}, + {1, 2, 3, 1}, + {1, 1, 1, 4}, + {1, 3, 1, 2}, + {1, 2, 1, 3}, + {3, 1, 1, 2} +}; +const FX_INT32 CBC_OneDimReader::L_AND_G_PATTERNS[20][4] = { + {3, 2, 1, 1}, + {2, 2, 2, 1}, + {2, 1, 2, 2}, + {1, 4, 1, 1}, + {1, 1, 3, 2}, + {1, 2, 3, 1}, + {1, 1, 1, 4}, + {1, 3, 1, 2}, + {1, 2, 1, 3}, + {3, 1, 1, 2}, + {1, 1, 2, 3}, + {1, 2, 2, 2}, + {2, 2, 1, 2}, + {1, 1, 4, 1}, + {2, 3, 1, 1}, + {1, 3, 2, 1}, + {4, 1, 1, 1}, + {2, 1, 3, 1}, + {3, 1, 2, 1}, + {2, 1, 1, 3} +}; +CBC_OneDimReader::CBC_OneDimReader() +{ +} +CBC_OneDimReader::~CBC_OneDimReader() +{ +} +CFX_Int32Array *CBC_OneDimReader::FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_BOOL foundStart = FALSE; + CFX_Int32Array *startRange = NULL; + CFX_Int32Array startEndPattern; + startEndPattern.SetSize(3); + startEndPattern[0] = START_END_PATTERN[0]; + startEndPattern[1] = START_END_PATTERN[1]; + startEndPattern[2] = START_END_PATTERN[2]; + FX_INT32 nextStart = 0; + while (!foundStart) { + if(startRange != NULL) { + delete startRange; + startRange = NULL; + } + startRange = FindGuardPattern(row, nextStart, FALSE, &startEndPattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 start = (*startRange)[0]; + nextStart = (*startRange)[1]; + if (start <= 1) { + break; + } + FX_INT32 quietStart = start - (nextStart - start); + if (quietStart >= 0) { + FX_BOOL booT = row->IsRange(quietStart, start, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + foundStart = booT; + } + } + return startRange; +} +CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array* StartPattern = FindStartGuardPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr result(StartPattern); + CFX_ByteString temp = DecodeRow(rowNumber, row, result.get(), hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString result; + FX_INT32 endStart = DecodeMiddle(row, startGuardRange, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_BOOL b = CheckChecksum(result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (!b) { + e = BCExceptionChecksumException; + return ""; + } + return result; +} +FX_BOOL CBC_OneDimReader::CheckChecksum(CFX_ByteString &s, FX_INT32 &e) +{ + FX_BOOL temp = CheckStandardUPCEANChecksum(s, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + return temp; +} +FX_BOOL CBC_OneDimReader::CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e) +{ + FX_INT32 length = s.GetLength(); + if (length == 0) { + return FALSE; + } + FX_INT32 sum = 0; + for (FX_INT32 i = length - 2; i >= 0; i -= 2) { + FX_INT32 digit = (FX_INT32) s[i] - (FX_INT32) '0'; + if (digit < 0 || digit > 9) { + e = BCExceptionFormatException; + return FALSE; + } + sum += digit; + } + sum *= 3; + for (FX_INT32 j = length - 1; j >= 0; j -= 2) { + FX_INT32 digit = (FX_INT32) s[j] - (FX_INT32) '0'; + if (digit < 0 || digit > 9) { + e = BCExceptionFormatException; + return FALSE; + } + sum += digit; + } + return sum % 10 == 0; +} +CFX_Int32Array *CBC_OneDimReader::DecodeEnd(CBC_CommonBitArray* row, FX_INT32 endStart, FX_INT32 &e) +{ + CFX_Int32Array startEndPattern; + startEndPattern.Add(START_END_PATTERN[0]); + startEndPattern.Add(START_END_PATTERN[1]); + startEndPattern.Add(START_END_PATTERN[2]); + CFX_Int32Array* FindGuard = FindGuardPattern(row, endStart, FALSE, &startEndPattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return FindGuard; +} +CFX_Int32Array *CBC_OneDimReader::FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e) +{ + FX_INT32 patternLength = pattern->GetSize(); + CFX_Int32Array counters; + counters.SetSize(patternLength); + FX_INT32 width = row->GetSize(); + FX_BOOL isWhite = FALSE; + while (rowOffset < width) { + isWhite = !row->Get(rowOffset); + if (whiteFirst == isWhite) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + FX_INT32 patternStart = rowOffset; + for (FX_INT32 x = rowOffset; x < width; x++) { + FX_BOOL pixel = row->Get(x); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (PatternMatchVariance(&counters, &(*pattern)[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array(); + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = x; + return result; + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_INT32 CBC_OneDimReader::DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e) +{ + RecordPattern(row, rowOffset, counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + FX_INT32 max = patternLength; + for (FX_INT32 i = 0; i < max; i++) { + FX_INT32 variance = PatternMatchVariance(counters, &patterns[i * 4], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = i; + } + } + if (bestMatch >= 0) { + return bestMatch; + } else { + e = BCExceptionNotFound; + return 0; + } + return 0; +} diff --git a/xfa/src/fxbarcode/oned/BC_OneDimReader.h b/xfa/src/fxbarcode/oned/BC_OneDimReader.h new file mode 100644 index 0000000000..bb10060ba3 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDimReader.h @@ -0,0 +1,39 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDUPCEANREADER_H_ +#define _BC_ONEDUPCEANREADER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OneDimReader; +class CBC_OneDimReader : public CBC_OneDReader +{ +private: + const static FX_INT32 MAX_AVG_VARIANCE; + const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + + FX_BOOL CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e); +public: + const static FX_INT32 START_END_PATTERN[3]; + const static FX_INT32 MIDDLE_PATTERN[5]; + const static FX_INT32 L_PATTERNS[10][4]; + const static FX_INT32 L_AND_G_PATTERNS[20][4]; + CBC_OneDimReader(); + virtual ~CBC_OneDimReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); +protected: + CFX_Int32Array *FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e); + virtual FX_BOOL CheckChecksum(CFX_ByteString &s, FX_INT32 &e); + CFX_Int32Array *FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e); + FX_INT32 DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e); + virtual FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) + { + return 0; + } + virtual CFX_Int32Array *DecodeEnd(CBC_CommonBitArray *row, FX_INT32 endStart, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp b/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp new file mode 100644 index 0000000000..25f3fa5f6c --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDimWriter.cpp @@ -0,0 +1,415 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_OneDimWriter.h" +CBC_OneDimWriter::CBC_OneDimWriter() +{ + m_locTextLoc = BC_TEXT_LOC_BELOWEMBED; + m_bPrintChecksum = TRUE; + m_iDataLenth = 0; + m_bCalcChecksum = FALSE; + m_pFont = NULL; + m_fFontSize = 10; ; + m_iFontStyle = 0; + m_fontColor = 0xff000000; + m_iContentLen = 0; + m_bLeftPadding = FALSE; + m_bRightPadding = FALSE; + m_output = NULL; +} +CBC_OneDimWriter::~CBC_OneDimWriter() +{ + if (m_output != NULL) { + delete m_output; + m_output = NULL; + } +} +void CBC_OneDimWriter::SetPrintChecksum(FX_BOOL checksum) +{ + m_bPrintChecksum = checksum; +} +void CBC_OneDimWriter::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = length; +} +void CBC_OneDimWriter::SetCalcChecksum(FX_INT32 state) +{ + m_bCalcChecksum = state; +} +FX_BOOL CBC_OneDimWriter::SetFont(CFX_Font * cFont) +{ + if (cFont == NULL) { + return FALSE; + } + m_pFont = cFont; + return TRUE; +} +void CBC_OneDimWriter::SetFontSize(FX_FLOAT size) +{ + m_fFontSize = size; +} +void CBC_OneDimWriter::SetFontStyle(FX_INT32 style) +{ + m_iFontStyle = style; +} +void CBC_OneDimWriter::SetFontColor(FX_ARGB color) +{ + m_fontColor = color; +} +FX_WCHAR CBC_OneDimWriter::Upper(FX_WCHAR ch) +{ + if(ch >= 'a' && ch <= 'z') { + ch = ch - ('a' - 'A'); + } + return ch; +} +FX_BYTE* CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + FX_BYTE *ret = NULL; + outHeight = 1; + if (m_Width >= 20) { + ret = Encode(contents, outWidth, e); + } else { + ret = Encode(contents, outWidth, e); + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_INT32 CBC_OneDimWriter::AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern , FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e) +{ + if (startColor != 0 && startColor != 1) { + e = BCExceptionValueMustBeEither0or1; + return 0; + } + FX_BYTE color = (FX_BYTE) startColor; + FX_INT32 numAdded = 0; + for (FX_INT32 i = 0; i < patternLength; i++) { + for (FX_INT32 j = 0; j < pattern[i]; j++) { + target[pos] = color; + pos += 1; + numAdded += 1; + } + color ^= 1; + } + return numAdded; +} +void CBC_OneDimWriter::CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen) +{ +#ifdef FXFM_ENCODING_NONE + IFX_FontEncodingEx* encoding = FX_CreateFontEncodingEx(cFont); +#else + IFX_FontEncoding * encoding = FXGE_CreateUnicodeEncoding(cFont); +#endif + FX_INT32 length = text.GetLength(); + FX_DWORD *pCharCode = FX_Alloc(FX_DWORD, text.GetLength()); + FX_FLOAT charWidth = 0; + for (FX_INT32 j = 0; j < text.GetLength(); j++) { + pCharCode[j] = encoding->CharCodeFromUnicode(text[j]); + FX_INT32 glyp_code = encoding->GlyphFromCharCode(pCharCode[j]); + FX_INT32 glyp_value = cFont->GetGlyphWidth(glyp_code); + FX_FLOAT temp = (FX_FLOAT)((glyp_value) * fontSize / 1000.0); + charWidth += temp; + } + charsLen = charWidth; + FX_FLOAT leftPositon = (FX_FLOAT)(geWidth - charsLen) / 2.0f; + if (leftPositon < 0 && geWidth == 0) { + leftPositon = 0; + } + FX_FLOAT penX = 0.0; + FX_FLOAT penY = (FX_FLOAT)FXSYS_abs(cFont->GetDescent()) * (FX_FLOAT)fontSize / 1000.0f; + FX_FLOAT left = leftPositon; + FX_FLOAT top = 0.0; + charPos[0].m_OriginX = penX + left; + charPos[0].m_OriginY = penY + top; + charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[0]); + charPos[0].m_FontCharWidth = cFont->GetGlyphWidth(charPos[0].m_GlyphIndex); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + charPos[0].m_ExtGID = charPos[0].m_GlyphIndex; +#endif + penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; + for (FX_INT32 i = 1; i < length; i++) { + charPos[i].m_OriginX = penX + left; + charPos[i].m_OriginY = penY + top; + charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[i]); + charPos[i].m_FontCharWidth = cFont->GetGlyphWidth(charPos[i].m_GlyphIndex); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + charPos[i].m_ExtGID = charPos[i].m_GlyphIndex; +#endif + penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; + } + FX_Free (pCharCode); + delete encoding; + encoding = NULL; +} +void CBC_OneDimWriter::ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) +{ + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_FloatRect rect((FX_FLOAT)locX, (FX_FLOAT)locY, (FX_FLOAT)(locX + geWidth), (FX_FLOAT)(locY + iTextHeight)); + if (geWidth != m_Width) { + rect.right -= 1; + } + matrix->TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)locX, (FX_FLOAT)(locY + iFontSize)); + if (matrix != NULL) { + affine_matrix.Concat(*matrix); + } + FX_BOOL ret = device->DrawNormalText(str.GetLength(), + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); +} +void CBC_OneDimWriter::ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) +{ + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_FxgeDevice ge; + ge.Create((int)geWidth, iTextHeight , m_colorSpace); + FX_RECT geRect(0, 0, (int)geWidth, iTextHeight); + ge.FillRect(&geRect, m_backgroundColor); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + FX_BOOL ret = ge.DrawNormalText(str.GetLength(), + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + CFX_FxgeDevice geBitmap; + geBitmap.Attach(pOutBitmap); + geBitmap.SetDIBits(ge.GetBitmap(), (int)locX, (int)locY); +} +void CBC_OneDimWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + if (m_pFont == NULL) { + e = BCExceptionNullPointer; + return; + } + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + FX_FLOAT charsLen = 0; + FX_FLOAT geWidth = 0; + if ( m_locTextLoc == BC_TEXT_LOC_ABOVEEMBED || + m_locTextLoc == BC_TEXT_LOC_BELOWEMBED ) { + geWidth = 0; + } else if ( m_locTextLoc == BC_TEXT_LOC_ABOVE || + m_locTextLoc == BC_TEXT_LOC_BELOW ) { + geWidth = (FX_FLOAT)barWidth; + } + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CalcTextInfo(str, pCharPos, m_pFont, geWidth, iFontSize, charsLen); + if (charsLen < 1) { + return; + } + FX_INT32 locX = 0; + FX_INT32 locY = 0; + switch (m_locTextLoc) { + case BC_TEXT_LOC_ABOVEEMBED: + locX = (FX_INT32)(barWidth - charsLen) / 2; + locY = 0; + geWidth = charsLen; + break; + case BC_TEXT_LOC_ABOVE: + locX = 0; + locY = 0; + geWidth = (FX_FLOAT)barWidth; + break; + case BC_TEXT_LOC_BELOWEMBED: + locX = (FX_INT32)(barWidth - charsLen) / 2; + locY = m_Height - iTextHeight; + geWidth = charsLen; + break; + case BC_TEXT_LOC_BELOW: + default: + locX = 0; + locY = m_Height - iTextHeight; + geWidth = (FX_FLOAT)barWidth; + break; + } + if (device != NULL) { + ShowDeviceChars(device, matrix, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); + } else { + ShowBitmapChars(pOutBitmap, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); + } + FX_Free(pCharPos); +} +void CBC_OneDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e) +{ + if (m_output == NULL) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); + pOutBitmap->Clear(m_backgroundColor); + if (!pOutBitmap) { + e = BCExceptionFailToCreateBitmap; + return; + } + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + if (m_output->Get(x, y)) { + pOutBitmap->SetPixel(x, y, m_barColor); + } + } + } + FX_INT32 i = 0; + for (; i < contents.GetLength(); i++) + if (contents.GetAt(i) != ' ') { + break; + } + if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { + ShowChars(contents, pOutBitmap, NULL, NULL, m_barWidth, m_multiple, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); + if (pOutBitmap) { + delete pOutBitmap; + } + pOutBitmap = pStretchBitmap; +} +void CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e) +{ + if (m_output == NULL) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_GraphStateData stateData; + CFX_PathData path; + path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); + device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); + CFX_Matrix matri(m_outputHScale, 0.0, 0.0, (FX_FLOAT)m_Height, 0.0, 0.0); + matri.Concat(*matrix); + for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { + for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { + CFX_PathData rect; + rect.AppendRect((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)(x + 1), (FX_FLOAT)(y + 1)); + CFX_GraphStateData stateData; + if (m_output->Get(x, y)) { + device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); + } + } + } + FX_INT32 i = 0; + for (; i < contents.GetLength(); i++) + if (contents.GetAt(i) != ' ') { + break; + } + if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { + ShowChars(contents, NULL, device, matrix, m_barWidth, m_multiple, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_OneDimWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + if (codeLength < 1) { + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if (m_ModuleHeight < 20.0) { + m_ModuleHeight = 20; + } + FX_INT32 codeOldLength = codeLength; + FX_INT32 leftPadding = 0; + FX_INT32 rightPadding = 0; + if (m_bLeftPadding) { + leftPadding = 7; + } + if (m_bRightPadding) { + rightPadding = 7; + } + codeLength += leftPadding; + codeLength += rightPadding; + m_outputHScale = 1.0; + if (m_Width > 0) { + m_outputHScale = (FX_FLOAT)m_Width / (FX_FLOAT)codeLength; + } + if (!isDevice) { + m_outputHScale = FX_MAX(m_outputHScale, m_ModuleWidth); + } + FX_FLOAT dataLengthScale = 1.0; + if (m_iDataLenth > 0 && contents.GetLength() != 0) { + dataLengthScale = FX_FLOAT(contents.GetLength()) / FX_FLOAT(m_iDataLenth); + } + if (m_iDataLenth > 0 && contents.GetLength() == 0) { + dataLengthScale = FX_FLOAT(1) / FX_FLOAT(m_iDataLenth); + } + m_multiple = 1; + if (!isDevice) { + m_multiple = (FX_INT32)ceil(m_outputHScale * dataLengthScale); + } + FX_INT32 outputHeight = 1; + if (!isDevice) { + if (m_Height == 0) { + outputHeight = FX_MAX(20, m_ModuleHeight); + } else { + outputHeight = m_Height; + } + } + FX_INT32 outputWidth = codeLength; + if (!isDevice) { + outputWidth = (FX_INT32)(codeLength * m_multiple / dataLengthScale); + } + m_barWidth = m_Width; + if (!isDevice) { + m_barWidth = codeLength * m_multiple; + } + m_output = FX_NEW CBC_CommonBitMatrix; + m_output->Init(outputWidth, outputHeight); + FX_INT32 outputX = leftPadding * m_multiple; + for (FX_INT32 inputX = 0; inputX < codeOldLength; inputX++) { + if (code[inputX] == 1) { + if (outputX >= outputWidth ) { + break; + } + if (outputX + m_multiple > outputWidth && outputWidth - outputX > 0) { + m_output->SetRegion(outputX, 0, outputWidth - outputX , outputHeight, e); + break; + } + m_output->SetRegion(outputX, 0, m_multiple, outputHeight, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + outputX += m_multiple; + } +} diff --git a/xfa/src/fxbarcode/oned/BC_OneDimWriter.h b/xfa/src/fxbarcode/oned/BC_OneDimWriter.h new file mode 100644 index 0000000000..cd5d937aca --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OneDimWriter.h @@ -0,0 +1,70 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDIMWRITER_H_ +#define _BC_ONEDIMWRITER_H_ +class CBC_Writer; +class CBC_CommonBitMatrix; +class CBC_OneDimWriter; +class CBC_OneDimWriter : public CBC_Writer +{ +public: + CBC_OneDimWriter(); + virtual ~CBC_OneDimWriter(); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + virtual FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) + { + return NULL; + }; + virtual void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e); + virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e); + virtual FX_BOOL CheckContentValidity(FX_WSTR contents) + { + return TRUE; + }; + virtual CFX_WideString FilterContents(FX_WSTR contents) + { + return CFX_WideString(); + } + virtual CFX_WideString RenderTextContents(FX_WSTR contents) + { + return CFX_WideString(); + } + virtual void SetPrintChecksum(FX_BOOL checksum); + virtual void SetDataLength(FX_INT32 length); + virtual void SetCalcChecksum(FX_INT32 state); + virtual void SetFontSize(FX_FLOAT size); + virtual void SetFontStyle(FX_INT32 style); + virtual void SetFontColor(FX_ARGB color); + virtual FX_BOOL SetFont(CFX_Font * cFont); +protected: + FX_BOOL m_bPrintChecksum; + FX_INT32 m_iDataLenth; + FX_BOOL m_bCalcChecksum; + CFX_Font* m_pFont; + FX_FLOAT m_fFontSize; + FX_INT32 m_iFontStyle; + FX_DWORD m_fontColor; + BC_TEXT_LOC m_locTextLoc; + FX_INT32 m_iContentLen; + FX_BOOL m_bLeftPadding; + FX_BOOL m_bRightPadding; + CBC_CommonBitMatrix* m_output; + FX_INT32 m_barWidth; + FX_INT32 m_multiple; + FX_FLOAT m_outputHScale; + void CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen); + virtual void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); + virtual void ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); + virtual void ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); + FX_INT32 AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern, FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e); + FX_WCHAR Upper(FX_WCHAR ch); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp new file mode 100644 index 0000000000..5d94d7ac06 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.cpp @@ -0,0 +1,206 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "../oned/BC_OneDReader.h" +#include "../oned/BC_OnedCode39Reader.h" +#include "../oned/BC_OnedCodaBarReader.h" +FX_LPCSTR CBC_OnedCodaBarReader::ALPHABET_STRING = "0123456789-$:/.+ABCDTN"; +const FX_INT32 CBC_OnedCodaBarReader::CHARACTER_ENCODINGS[22] = { + 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, + 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, + 0x01A, 0x029 +}; +const FX_INT32 CBC_OnedCodaBarReader::minCharacterLength = 3; +const FX_CHAR CBC_OnedCodaBarReader::STARTEND_ENCODING[8] = {'E', '*', 'A', 'B', 'C', 'D', 'T', 'N'}; +CBC_OnedCodaBarReader::CBC_OnedCodaBarReader() +{ +} +CBC_OnedCodaBarReader::~CBC_OnedCodaBarReader() +{ +} +CFX_ByteString CBC_OnedCodaBarReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *int32Ptr = FindAsteriskPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr start(int32Ptr); + (*start)[1] = 0; + FX_INT32 nextStart = (*start)[1]; + FX_INT32 end = row->GetSize(); + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + CFX_ByteString result; + CFX_Int32Array counters; + counters.SetSize(7); + FX_CHAR decodedChar; + FX_INT32 lastStart; + do { + RecordPattern(row, nextStart, &counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + decodedChar = ToNarrowWidePattern(&counters); + if (decodedChar == '!') { + e = BCExceptionNotFound; + return ""; + } + result += decodedChar; + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + } while (nextStart < end); + FX_INT32 lastPatternSize = 0; + for (FX_INT32 j = 0; j < counters.GetSize(); j++) { + lastPatternSize += counters[j]; + } + FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; + if (nextStart != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) { + e = BCExceptionNotFound; + return ""; + } + if (result.GetLength() < 2) { + e = BCExceptionNotFound; + return ""; + } + FX_CHAR startchar = result[0]; + if (!ArrayContains(STARTEND_ENCODING, startchar)) { + e = BCExceptionNotFound; + return ""; + } + FX_INT32 len = result.GetLength(); + CFX_ByteString temp = result; + for (FX_INT32 k = 1; k < result.GetLength(); k++) { + if (ArrayContains(STARTEND_ENCODING, result[k])) { + if ((k + 1) != result.GetLength()) { + result.Delete(1, k); + k = 1; + } + } + } + if (result.GetLength() < 5) { + FX_INT32 index = temp.Find(result.Mid(1, result.GetLength() - 1)); + if (index == len - (result.GetLength() - 1)) { + e = BCExceptionNotFound; + return ""; + } + } + if (result.GetLength() > minCharacterLength) { + result = result.Mid(1, result.GetLength() - 2); + } else { + e = BCExceptionNotFound; + return ""; + } + return result; +} +CFX_Int32Array *CBC_OnedCodaBarReader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(7); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (ArrayContains(STARTEND_ENCODING, ToNarrowWidePattern(&counters))) { + FX_BOOL btemp3 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (btemp3) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array(); + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = i; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_BOOL CBC_OnedCodaBarReader::ArrayContains(const FX_CHAR array[], FX_CHAR key) +{ + for(FX_INT32 i = 0; i < 8; i++) { + if(array[i] == key) { + return TRUE; + } + } + return FALSE; +} +FX_CHAR CBC_OnedCodaBarReader::ToNarrowWidePattern(CFX_Int32Array *counter) +{ + FX_INT32 numCounters = counter->GetSize(); + if (numCounters < 1) { + return '!'; + } + FX_INT32 averageCounter = 0; + FX_INT32 totalCounters = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + totalCounters += (*counter)[i]; + } + averageCounter = totalCounters / numCounters; + FX_INT32 pattern = 0; + FX_INT32 wideCounters = 0; + for (FX_INT32 j = 0; j < numCounters; j++) { + if ((*counter)[j] > averageCounter) { + pattern |= 1 << (numCounters - 1 - j); + wideCounters++; + } + } + if ((wideCounters == 2) || (wideCounters == 3)) { + for (FX_INT32 k = 0; k < 22; k++) { + if (CHARACTER_ENCODINGS[k] == pattern) { + return (ALPHABET_STRING)[k]; + } + } + } + return '!'; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h new file mode 100644 index 0000000000..1d03491841 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCodaBarReader.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODABARREADER_H_ +#define _BC_ONEDCODABARREADER_H_ +class CBC_CommonBitArray; +class CBC_OneDReader; +class CBC_OnedCodaBarReader; +class CBC_OnedCodaBarReader : public CBC_OneDReader +{ +public: + CBC_OnedCodaBarReader(); + virtual ~CBC_OnedCodaBarReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_BOOL ArrayContains(const FX_CHAR array[], FX_CHAR key); + FX_CHAR ToNarrowWidePattern(CFX_Int32Array *counter); + static FX_LPCSTR ALPHABET_STRING; + + + const static FX_INT32 CHARACTER_ENCODINGS[22]; + + const static FX_INT32 minCharacterLength; + + const static FX_CHAR STARTEND_ENCODING[8]; +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp new file mode 100644 index 0000000000..059d2d7df5 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.cpp @@ -0,0 +1,222 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OneDimWriter.h" +#include "BC_OnedCodaBarReader.h" +#include "BC_OnedCodaBarWriter.h" +const FX_CHAR CBC_OnedCodaBarWriter::START_END_CHARS[] = {'A', 'B', 'C', 'D', 'T', 'N', '*', 'E', 'a', 'b', 'c', 'd', 't', 'n', 'e'}; +const FX_CHAR CBC_OnedCodaBarWriter::CONTENT_CHARS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '$', '/', ':', '+', '.'}; +CBC_OnedCodaBarWriter::CBC_OnedCodaBarWriter() +{ + m_chStart = 'A'; + m_chEnd = 'B'; + m_iWideNarrRatio = 2; +} +CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() +{ +} +FX_BOOL CBC_OnedCodaBarWriter::SetStartChar(FX_CHAR start) +{ + for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { + if (START_END_CHARS[i] == start) { + m_chStart = start; + return TRUE; + } + } + return FALSE; +} +FX_BOOL CBC_OnedCodaBarWriter::SetEndChar(FX_CHAR end) +{ + for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { + if (START_END_CHARS[i] == end) { + m_chEnd = end; + return TRUE; + } + } + return FALSE; +} +void CBC_OnedCodaBarWriter::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = length + 2; +} +FX_BOOL CBC_OnedCodaBarWriter::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BOOL CBC_OnedCodaBarWriter::SetWideNarrowRatio(FX_INT32 ratio) +{ + if(ratio < 2 || ratio > 3) { + return FALSE; + } + m_iWideNarrRatio = ratio; + return TRUE; +} +FX_BOOL CBC_OnedCodaBarWriter::FindChar(FX_WCHAR ch, FX_BOOL isContent) +{ + if(isContent) { + for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { + if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { + return TRUE; + } + } + for(FX_INT32 j = 0 ; j < sizeof(START_END_CHARS) / sizeof(FX_CHAR) ; j++) { + if(ch == (FX_WCHAR)START_END_CHARS[j]) { + return TRUE; + } + } + return FALSE; + } else { + for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { + if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { + return TRUE; + } + } + return FALSE; + } +} +FX_BOOL CBC_OnedCodaBarWriter::CheckContentValidity(FX_WSTR contents) +{ + FX_WCHAR ch; + FX_INT32 index = 0; + for (index = 0; index < contents.GetLength(); index++) { + ch = contents.GetAt(index); + if (FindChar(ch, FALSE)) { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedCodaBarWriter::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 index = 0; index < contents.GetLength(); index ++) { + ch = contents.GetAt(index); + if(ch > 175) { + index++; + continue; + } + if (FindChar(ch, TRUE)) { + filtercontents += ch; + } else { + continue; + } + } + return filtercontents; +} +FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODABAR) { + e = BCExceptionOnlyEncodeCODEBAR; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + CBC_OnedCodaBarReader CodaBarR; + CFX_ByteString data = m_chStart + contents + m_chEnd; + m_iContentLen = data.GetLength(); + FX_BYTE *result = FX_Alloc(FX_BYTE, m_iWideNarrRatio * 7 * data.GetLength()); + FX_CHAR ch; + FX_INT32 position = 0; + for (FX_INT32 index = 0; index < data.GetLength(); index++) { + ch = data.GetAt(index); + if (((ch >= 'a') && (ch <= 'z'))) { + ch = ch - 32; + } + switch (ch) { + case 'T': + ch = 'A'; + break; + case 'N': + ch = 'B'; + break; + case '*': + ch = 'C'; + break; + case 'E': + ch = 'D'; + break; + default: + break; + } + FX_INT32 code = 0; + FX_INT32 len = (FX_INT32)strlen(CodaBarR.ALPHABET_STRING); + for (FX_INT32 i = 0; i < len; i++) { + if (ch == CodaBarR.ALPHABET_STRING[i]) { + code = CodaBarR.CHARACTER_ENCODINGS[i]; + break; + } + } + FX_BYTE color = 1; + FX_INT32 counter = 0; + FX_INT32 bit = 0; + while (bit < 7) { + result[position] = color; + position++; + if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) { + color = !color; + bit++; + counter = 0; + } else { + counter++; + } + } + if (index < data.GetLength() - 1) { + result[position] = 0; + position ++; + } + } + outLength = position; + return result; +} +CFX_WideString CBC_OnedCodaBarWriter::encodedContents(FX_WSTR contents) +{ + CFX_WideString strStart(m_chStart); + CFX_WideString strEnd(m_chEnd); + return strStart + contents + strEnd; +} +void CBC_OnedCodaBarWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(encodedContents(contents), code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h new file mode 100644 index 0000000000..b81839ca4a --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCodaBarWriter.h @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODABARWRITER_H_ +#define _BC_ONEDCODABARWRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedCodaBarWriter; +class CBC_OnedCodaBarWriter : public CBC_OneDimWriter +{ +public: + CBC_OnedCodaBarWriter(); + virtual ~CBC_OnedCodaBarWriter(); + FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + CFX_WideString encodedContents(FX_WSTR contents); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_BOOL SetStartChar(FX_CHAR start); + FX_BOOL SetEndChar(FX_CHAR end); + void SetDataLength(FX_INT32 length); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); + FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent); +private: + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + const static FX_CHAR START_END_CHARS[]; + const static FX_CHAR CONTENT_CHARS[]; + FX_CHAR m_chStart; + FX_CHAR m_chEnd; + FX_INT32 m_iWideNarrRatio; + +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp new file mode 100644 index 0000000000..9dd9f629cf --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.cpp @@ -0,0 +1,430 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OnedCode128Reader.h" +const FX_INT32 CBC_OnedCode128Reader::CODE_PATTERNS[107][7] = { + {2, 1, 2, 2, 2, 2, 0}, + {2, 2, 2, 1, 2, 2, 0}, + {2, 2, 2, 2, 2, 1, 0}, + {1, 2, 1, 2, 2, 3, 0}, + {1, 2, 1, 3, 2, 2, 0}, + {1, 3, 1, 2, 2, 2, 0}, + {1, 2, 2, 2, 1, 3, 0}, + {1, 2, 2, 3, 1, 2, 0}, + {1, 3, 2, 2, 1, 2, 0}, + {2, 2, 1, 2, 1, 3, 0}, + {2, 2, 1, 3, 1, 2, 0}, + {2, 3, 1, 2, 1, 2, 0}, + {1, 1, 2, 2, 3, 2, 0}, + {1, 2, 2, 1, 3, 2, 0}, + {1, 2, 2, 2, 3, 1, 0}, + {1, 1, 3, 2, 2, 2, 0}, + {1, 2, 3, 1, 2, 2, 0}, + {1, 2, 3, 2, 2, 1, 0}, + {2, 2, 3, 2, 1, 1, 0}, + {2, 2, 1, 1, 3, 2, 0}, + {2, 2, 1, 2, 3, 1, 0}, + {2, 1, 3, 2, 1, 2, 0}, + {2, 2, 3, 1, 1, 2, 0}, + {3, 1, 2, 1, 3, 1, 0}, + {3, 1, 1, 2, 2, 2, 0}, + {3, 2, 1, 1, 2, 2, 0}, + {3, 2, 1, 2, 2, 1, 0}, + {3, 1, 2, 2, 1, 2, 0}, + {3, 2, 2, 1, 1, 2, 0}, + {3, 2, 2, 2, 1, 1, 0}, + {2, 1, 2, 1, 2, 3, 0}, + {2, 1, 2, 3, 2, 1, 0}, + {2, 3, 2, 1, 2, 1, 0}, + {1, 1, 1, 3, 2, 3, 0}, + {1, 3, 1, 1, 2, 3, 0}, + {1, 3, 1, 3, 2, 1, 0}, + {1, 1, 2, 3, 1, 3, 0}, + {1, 3, 2, 1, 1, 3, 0}, + {1, 3, 2, 3, 1, 1, 0}, + {2, 1, 1, 3, 1, 3, 0}, + {2, 3, 1, 1, 1, 3, 0}, + {2, 3, 1, 3, 1, 1, 0}, + {1, 1, 2, 1, 3, 3, 0}, + {1, 1, 2, 3, 3, 1, 0}, + {1, 3, 2, 1, 3, 1, 0}, + {1, 1, 3, 1, 2, 3, 0}, + {1, 1, 3, 3, 2, 1, 0}, + {1, 3, 3, 1, 2, 1, 0}, + {3, 1, 3, 1, 2, 1, 0}, + {2, 1, 1, 3, 3, 1, 0}, + {2, 3, 1, 1, 3, 1, 0}, + {2, 1, 3, 1, 1, 3, 0}, + {2, 1, 3, 3, 1, 1, 0}, + {2, 1, 3, 1, 3, 1, 0}, + {3, 1, 1, 1, 2, 3, 0}, + {3, 1, 1, 3, 2, 1, 0}, + {3, 3, 1, 1, 2, 1, 0}, + {3, 1, 2, 1, 1, 3, 0}, + {3, 1, 2, 3, 1, 1, 0}, + {3, 3, 2, 1, 1, 1, 0}, + {3, 1, 4, 1, 1, 1, 0}, + {2, 2, 1, 4, 1, 1, 0}, + {4, 3, 1, 1, 1, 1, 0}, + {1, 1, 1, 2, 2, 4, 0}, + {1, 1, 1, 4, 2, 2, 0}, + {1, 2, 1, 1, 2, 4, 0}, + {1, 2, 1, 4, 2, 1, 0}, + {1, 4, 1, 1, 2, 2, 0}, + {1, 4, 1, 2, 2, 1, 0}, + {1, 1, 2, 2, 1, 4, 0}, + {1, 1, 2, 4, 1, 2, 0}, + {1, 2, 2, 1, 1, 4, 0}, + {1, 2, 2, 4, 1, 1, 0}, + {1, 4, 2, 1, 1, 2, 0}, + {1, 4, 2, 2, 1, 1, 0}, + {2, 4, 1, 2, 1, 1, 0}, + {2, 2, 1, 1, 1, 4, 0}, + {4, 1, 3, 1, 1, 1, 0}, + {2, 4, 1, 1, 1, 2, 0}, + {1, 3, 4, 1, 1, 1, 0}, + {1, 1, 1, 2, 4, 2, 0}, + {1, 2, 1, 1, 4, 2, 0}, + {1, 2, 1, 2, 4, 1, 0}, + {1, 1, 4, 2, 1, 2, 0}, + {1, 2, 4, 1, 1, 2, 0}, + {1, 2, 4, 2, 1, 1, 0}, + {4, 1, 1, 2, 1, 2, 0}, + {4, 2, 1, 1, 1, 2, 0}, + {4, 2, 1, 2, 1, 1, 0}, + {2, 1, 2, 1, 4, 1, 0}, + {2, 1, 4, 1, 2, 1, 0}, + {4, 1, 2, 1, 2, 1, 0}, + {1, 1, 1, 1, 4, 3, 0}, + {1, 1, 1, 3, 4, 1, 0}, + {1, 3, 1, 1, 4, 1, 0}, + {1, 1, 4, 1, 1, 3, 0}, + {1, 1, 4, 3, 1, 1, 0}, + {4, 1, 1, 1, 1, 3, 0}, + {4, 1, 1, 3, 1, 1, 0}, + {1, 1, 3, 1, 4, 1, 0}, + {1, 1, 4, 1, 3, 1, 0}, + {3, 1, 1, 1, 4, 1, 0}, + {4, 1, 1, 1, 3, 1, 0}, + {2, 1, 1, 4, 1, 2, 0}, + {2, 1, 1, 2, 1, 4, 0}, + {2, 1, 1, 2, 3, 2, 0}, + {2, 3, 3, 1, 1, 1, 2} +}; +const FX_INT32 CBC_OnedCode128Reader::MAX_AVG_VARIANCE = (FX_INT32) (256 * 0.25f); +const FX_INT32 CBC_OnedCode128Reader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (256 * 0.7f); +const FX_INT32 CBC_OnedCode128Reader::CODE_SHIFT = 98; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_C = 99; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_B = 100; +const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_A = 101; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_1 = 102; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_2 = 97; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_3 = 96; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_A = 101; +const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_B = 100; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_A = 103; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_B = 104; +const FX_INT32 CBC_OnedCode128Reader::CODE_START_C = 105; +const FX_INT32 CBC_OnedCode128Reader::CODE_STOP = 106; +CBC_OnedCode128Reader::CBC_OnedCode128Reader() +{ +} +CBC_OnedCode128Reader::~CBC_OnedCode128Reader() +{ +} +CFX_Int32Array *CBC_OnedCode128Reader::FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(6); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + for (FX_INT32 startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) { + FX_INT32 variance = PatternMatchVariance(&counters, &CODE_PATTERNS[startCode][0], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = startCode; + } + } + if (bestMatch >= 0) { + FX_BOOL btemp2 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (btemp2) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array; + result->SetSize(3); + (*result)[0] = patternStart; + (*result)[1] = i; + (*result)[2] = bestMatch; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_INT32 CBC_OnedCode128Reader::DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e) +{ + RecordPattern(row, rowOffset, counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 bestVariance = MAX_AVG_VARIANCE; + FX_INT32 bestMatch = -1; + for (FX_INT32 d = 0; d < 107; d++) { + FX_INT32 variance = PatternMatchVariance(counters, &CODE_PATTERNS[d][0], MAX_INDIVIDUAL_VARIANCE); + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = d; + } + } + if (bestMatch >= 0) { + return bestMatch; + } else { + e = BCExceptionNotFound; + return 0; + } + return 0; +} +CFX_ByteString CBC_OnedCode128Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *startPatternInfo = FindStartPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 startCode = (*startPatternInfo)[2]; + FX_INT32 codeSet; + switch (startCode) { + case 103: + codeSet = CODE_CODE_A; + break; + case 104: + codeSet = CODE_CODE_B; + break; + case 105: + codeSet = CODE_CODE_C; + break; + default: + if(startPatternInfo != NULL) { + startPatternInfo->RemoveAll(); + delete startPatternInfo; + startPatternInfo = NULL; + } + e = BCExceptionFormatException; + return ""; + } + FX_BOOL done = FALSE; + FX_BOOL isNextShifted = FALSE; + CFX_ByteString result; + FX_INT32 lastStart = (*startPatternInfo)[0]; + FX_INT32 nextStart = (*startPatternInfo)[1]; + if(startPatternInfo != NULL) { + startPatternInfo->RemoveAll(); + delete startPatternInfo; + startPatternInfo = NULL; + } + CFX_Int32Array counters; + counters.SetSize(6); + FX_INT32 lastCode = 0; + FX_INT32 code = 0; + FX_INT32 checksumTotal = startCode; + FX_INT32 multiplier = 0; + FX_BOOL lastCharacterWasPrintable = TRUE; + while (!done) { + FX_BOOL unshift = isNextShifted; + isNextShifted = FALSE; + lastCode = code; + code = DecodeCode(row, &counters, nextStart, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (code != CODE_STOP) { + lastCharacterWasPrintable = TRUE; + } + if (code != CODE_STOP) { + multiplier++; + checksumTotal += multiplier * code; + } + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + switch (code) { + case 103: + case 104: + case 105: + e = BCExceptionFormatException; + return ""; + } + switch (codeSet) { + case 101: + if (code < 64) { + result += (FX_CHAR) (' ' + code); + } else if (code < 96) { + result += (FX_CHAR) (code - 64); + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + case 97: + case 96: + case 101: + break; + case 98: + isNextShifted = TRUE; + codeSet = CODE_CODE_B; + break; + case 100: + codeSet = CODE_CODE_B; + break; + case 99: + codeSet = CODE_CODE_C; + break; + case 106: + done = TRUE; + break; + } + } + break; + case 100: + if (code < 96) { + result += (FX_CHAR) (' ' + code); + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + case 97: + case 96: + case 100: + break; + case 98: + isNextShifted = TRUE; + codeSet = CODE_CODE_A; + break; + case 101: + codeSet = CODE_CODE_A; + break; + case 99: + codeSet = CODE_CODE_C; + break; + case 106: + done = TRUE; + break; + } + } + break; + case 99: + if (code < 100) { + if (code < 10) { + result += '0'; + } + FX_CHAR temp[128]; +#if defined(_FX_WINAPI_PARTITION_APP_) + sprintf_s(temp, 128, "%d", code); +#else + sprintf(temp, "%d", code); +#endif + result += temp; + } else { + if (code != CODE_STOP) { + lastCharacterWasPrintable = FALSE; + } + switch (code) { + case 102: + break; + case 101: + codeSet = CODE_CODE_A; + break; + case 100: + codeSet = CODE_CODE_B; + break; + case 106: + done = TRUE; + break; + } + } + break; + } + if (unshift) { + codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; + } + } + FX_INT32 width = row->GetSize(); + while (nextStart < width && row->Get(nextStart)) { + nextStart++; + } + FX_BOOL boolT1 = row->IsRange(nextStart, FX_MIN(width, nextStart + (nextStart - lastStart) / 2), FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + if (!boolT1) { + e = BCExceptionNotFound; + return ""; + } + checksumTotal -= multiplier * lastCode; + if (checksumTotal % 103 != lastCode) { + e = BCExceptionChecksumException; + return ""; + } + FX_INT32 resultLength = result.GetLength(); + if (resultLength > 0 && lastCharacterWasPrintable) { + if (codeSet == CODE_CODE_C) { + result = result.Mid(0, result.GetLength() - 2); + } else { + result = result.Mid(0, result.GetLength() - 1); + } + } + if (result.GetLength() == 0) { + e = BCExceptionFormatException; + return ""; + } + return result; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h new file mode 100644 index 0000000000..94e1a6388b --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode128Reader.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODA128READER_H_ +#define _BC_ONEDCODA128READER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OnedCoda128Reader; +class CBC_OnedCode128Reader : public CBC_OneDReader +{ +public: + CBC_OnedCode128Reader(); + virtual ~CBC_OnedCode128Reader(); + virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + const static FX_INT32 CODE_PATTERNS[107][7]; + const static FX_INT32 MAX_AVG_VARIANCE; + const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + + const static FX_INT32 CODE_SHIFT; + const static FX_INT32 CODE_CODE_C; + const static FX_INT32 CODE_CODE_B; + const static FX_INT32 CODE_CODE_A; + const static FX_INT32 CODE_FNC_1; + const static FX_INT32 CODE_FNC_2; + const static FX_INT32 CODE_FNC_3; + const static FX_INT32 CODE_FNC_4_A; + const static FX_INT32 CODE_FNC_4_B ; + + const static FX_INT32 CODE_START_A; + const static FX_INT32 CODE_START_B; + const static FX_INT32 CODE_START_C; + const static FX_INT32 CODE_STOP; +private: + CFX_Int32Array *FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_INT32 DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp new file mode 100644 index 0000000000..6dd3cbe8a5 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.cpp @@ -0,0 +1,230 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_Reader.h" +#include "BC_OneDReader.h" +#include "BC_OneDimWriter.h" +#include "BC_OnedCode128Reader.h" +#include "BC_OnedCode128Writer.h" +const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_B = 100; +const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_C = 99; +const FX_INT32 CBC_OnedCode128Writer::CODE_START_B = 104; +const FX_INT32 CBC_OnedCode128Writer::CODE_START_C = 105; +const FX_INT32 CBC_OnedCode128Writer::CODE_STOP = 106; +CBC_OnedCode128Writer::CBC_OnedCode128Writer() +{ + m_codeFormat = BC_CODE128_B; +} +CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) +{ + m_codeFormat = type; +} +CBC_OnedCode128Writer::~CBC_OnedCode128Writer() +{ +} +BC_TYPE CBC_OnedCode128Writer::GetType() +{ + return m_codeFormat; +} +FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(FX_WSTR contents) +{ + FX_BOOL ret = TRUE; + FX_INT32 position = 0; + FX_INT32 patternIndex = -1; + if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) { + while (position < contents.GetLength()) { + patternIndex = (FX_INT32)contents.GetAt(position); + if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) { + position++; + continue; + } else { + ret = FALSE; + break; + } + position ++; + } + } else { + ret = FALSE; + } + return ret; +} +CFX_WideString CBC_OnedCode128Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filterChineseChar; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + filterChineseChar += ch; + } + CFX_WideString filtercontents; + if (m_codeFormat == BC_CODE128_B) { + for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { + ch = filterChineseChar.GetAt(i); + if (ch >= 32 && ch <= 126) { + filtercontents += ch; + } else { + continue; + } + } + } else if (m_codeFormat == BC_CODE128_C) { + for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { + ch = filterChineseChar.GetAt(i); + if (ch >= 32 && ch <= 106) { + filtercontents += ch; + } else { + continue; + } + } + } else { + filtercontents = contents; + } + return filtercontents; +} +FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODE_128) { + e = BCExceptionOnlyEncodeCODE_128; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length) +{ + FX_INT32 end = start + length; + for (FX_INT32 i = start; i < end; i++) { + if (contents[i] < '0' || contents[i] > '9') { + return FALSE; + } + } + return TRUE; +} +FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + FX_INT32 length = contents.GetLength(); + if(contents.GetLength() < 1 || contents.GetLength() > 80) { + e = BCExceptionContentsLengthShouldBetween1and80; + return NULL; + } + CFX_PtrArray patterns; + FX_INT32 checkSum = 0; + if (m_codeFormat == BC_CODE128_B) { + checkSum = Encode128B(contents, patterns); + } else if (m_codeFormat == BC_CODE128_C) { + checkSum = Encode128C(contents, patterns); + } else { + e = BCExceptionFormatException; + return NULL; + } + checkSum %= 103; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]); + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]); + m_iContentLen = contents.GetLength() + 3; + FX_INT32 codeWidth = 0; + for(FX_INT32 k = 0; k < patterns.GetSize(); k++) { + FX_INT32 *pattern = (FX_INT32*)patterns[k]; + for(FX_INT32 j = 0; j < 7; j++) { + codeWidth += pattern[j]; + } + } + outLength = codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, outLength); + FX_INT32 pos = 0; + for(FX_INT32 j = 0; j < patterns.GetSize(); j++) { + FX_INT32* pattern = (FX_INT32*)patterns[j]; + pos += AppendPattern(result, pos, pattern, 7, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + return result; +} +FX_INT32 CBC_OnedCode128Writer::Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns) +{ + FX_INT32 checkSum = 0; + FX_INT32 checkWeight = 1; + FX_INT32 position = 0; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]); + checkSum += CODE_START_B * checkWeight; + while (position < contents.GetLength()) { + FX_INT32 patternIndex = 0; + patternIndex = contents[position] - ' '; + position += 1; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); + checkSum += patternIndex * checkWeight; + if (position != 0) { + checkWeight++; + } + } + return checkSum; +} +FX_INT32 CBC_OnedCode128Writer::Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns) +{ + FX_INT32 checkSum = 0; + FX_INT32 checkWeight = 1; + FX_INT32 position = 0; + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]); + checkSum += CODE_START_C * checkWeight; + while (position < contents.GetLength()) { + FX_INT32 patternIndex = 0; + FX_CHAR ch = contents.GetAt(position); + if (ch < '0' || ch > '9') { + patternIndex = (FX_INT32)ch; + position++; + } else { + patternIndex = FXSYS_atoi(contents.Mid(position, 2)); + if (contents.GetAt(position + 1) < '0' || contents.GetAt(position + 1) > '9') { + position += 1; + } else { + position += 2; + } + } + patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); + checkSum += patternIndex * checkWeight; + if (position != 0) { + checkWeight++; + } + } + return checkSum; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h new file mode 100644 index 0000000000..daa48eca51 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode128Writer.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODA128WRITER_H_ +#define _BC_ONEDCODA128WRITER_H_ +class CBC_OneDimWriter; +class CBC_OnedCoda128Writer; +class CBC_OnedCode128Writer : public CBC_OneDimWriter +{ +public: + CBC_OnedCode128Writer(); + CBC_OnedCode128Writer(BC_TYPE type); + virtual ~CBC_OnedCode128Writer(); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + BC_TYPE GetType(); +private: + FX_BOOL IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length); + FX_INT32 Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns); + FX_INT32 Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns); + BC_TYPE m_codeFormat; + const static FX_INT32 CODE_START_B; + const static FX_INT32 CODE_START_C; + const static FX_INT32 CODE_CODE_B; + const static FX_INT32 CODE_CODE_C; + const static FX_INT32 CODE_STOP; +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp new file mode 100644 index 0000000000..b19343943b --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.cpp @@ -0,0 +1,293 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OnedCode39Reader.h" +FX_LPCSTR CBC_OnedCode39Reader::ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; +FX_LPCSTR CBC_OnedCode39Reader::CHECKSUM_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; +const FX_INT32 CBC_OnedCode39Reader::CHARACTER_ENCODINGS[44] = { + 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, + 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, + 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, + 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, + 0x0A8, 0x0A2, 0x08A, 0x02A +}; +const FX_INT32 CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094; +CBC_OnedCode39Reader::CBC_OnedCode39Reader(): m_extendedMode(FALSE), m_usingCheckDigit(FALSE) +{ +} +CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit) +{ + m_usingCheckDigit = usingCheckDigit; + m_extendedMode = FALSE; +} +CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) +{ + m_extendedMode = extendedMode; + m_usingCheckDigit = usingCheckDigit; +} +CBC_OnedCode39Reader::~CBC_OnedCode39Reader() +{ +} +CFX_ByteString CBC_OnedCode39Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_Int32Array *start = FindAsteriskPattern(row, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 nextStart = (*start)[1]; + if(start != NULL) { + delete start; + start = NULL; + } + FX_INT32 end = row->GetSize(); + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + CFX_ByteString result; + CFX_Int32Array counters; + counters.SetSize(9); + FX_CHAR decodedChar; + FX_INT32 lastStart; + do { + RecordPattern(row, nextStart, &counters, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + FX_INT32 pattern = ToNarrowWidePattern(&counters); + if (pattern < 0) { + e = BCExceptionNotFound; + return ""; + } + decodedChar = PatternToChar(pattern, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + result += decodedChar; + lastStart = nextStart; + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + nextStart += counters[i]; + } + while (nextStart < end && !row->Get(nextStart)) { + nextStart++; + } + } while (decodedChar != '*'); + result = result.Mid(0, result.GetLength() - 1); + FX_INT32 lastPatternSize = 0; + for (FX_INT32 j = 0; j < counters.GetSize(); j++) { + lastPatternSize += counters[j]; + } + FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; + if(m_usingCheckDigit) { + FX_INT32 max = result.GetLength() - 1; + FX_INT32 total = 0; + FX_INT32 len = (FX_INT32)strlen(ALPHABET_STRING); + for (FX_INT32 k = 0; k < max; k++) { + for (FX_INT32 j = 0; j < len; j++) + if (ALPHABET_STRING[j] == result[k]) { + total += j; + } + } + if (result[max] != (ALPHABET_STRING)[total % 43]) { + e = BCExceptionChecksumException; + return ""; + } + result = result.Mid(0, result.GetLength() - 1); + } + if (result.GetLength() == 0) { + e = BCExceptionNotFound; + return ""; + } + if(m_extendedMode) { + CFX_ByteString bytestr = DecodeExtended(result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bytestr; + } else { + return result; + } +} +CFX_Int32Array *CBC_OnedCode39Reader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) +{ + FX_INT32 width = row->GetSize(); + FX_INT32 rowOffset = 0; + while (rowOffset < width) { + if (row->Get(rowOffset)) { + break; + } + rowOffset++; + } + FX_INT32 counterPosition = 0; + CFX_Int32Array counters; + counters.SetSize(9); + FX_INT32 patternStart = rowOffset; + FX_BOOL isWhite = FALSE; + FX_INT32 patternLength = counters.GetSize(); + for (FX_INT32 i = rowOffset; i < width; i++) { + FX_BOOL pixel = row->Get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (ToNarrowWidePattern(&counters) == ASTERISK_ENCODING) { + FX_BOOL bT1 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (bT1) { + CFX_Int32Array *result = FX_NEW CFX_Int32Array; + result->SetSize(2); + (*result)[0] = patternStart; + (*result)[1] = i; + return result; + } + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + e = BCExceptionNotFound; + return NULL; +} +FX_INT32 CBC_OnedCode39Reader::ToNarrowWidePattern(CFX_Int32Array *counters) +{ + FX_INT32 numCounters = counters->GetSize(); + FX_INT32 maxNarrowCounter = 0; + FX_INT32 wideCounters; + do { +#undef max + FX_INT32 minCounter = FXSYS_IntMax; + for (FX_INT32 i = 0; i < numCounters; i++) { + FX_INT32 counter = (*counters)[i]; + if (counter < minCounter && counter > maxNarrowCounter) { + minCounter = counter; + } + } + maxNarrowCounter = minCounter; + wideCounters = 0; + FX_INT32 totalWideCountersWidth = 0; + FX_INT32 pattern = 0; + for (FX_INT32 j = 0; j < numCounters; j++) { + FX_INT32 counter = (*counters)[j]; + if ((*counters)[j] > maxNarrowCounter) { + pattern |= 1 << (numCounters - 1 - j); + wideCounters++; + totalWideCountersWidth += counter; + } + } + if (wideCounters == 3) { + for (FX_INT32 k = 0; k < numCounters && wideCounters > 0; k++) { + FX_INT32 counter = (*counters)[k]; + if ((*counters)[k] > maxNarrowCounter) { + wideCounters--; + if ((counter << 1) >= totalWideCountersWidth) { + return -1; + } + } + } + return pattern; + } + } while (wideCounters > 3); + return -1; +} +FX_CHAR CBC_OnedCode39Reader::PatternToChar(FX_INT32 pattern, FX_INT32 &e) +{ + for (FX_INT32 i = 0; i < 44; i++) { + if (CHARACTER_ENCODINGS[i] == pattern) { + return (ALPHABET_STRING)[i]; + } + } + e = BCExceptionNotFound; + return 0; +} +CFX_ByteString CBC_OnedCode39Reader::DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e) +{ + FX_INT32 length = encoded.GetLength(); + CFX_ByteString decoded; + FX_CHAR c, next; + for(FX_INT32 i = 0; i < length; i++) { + c = encoded[i]; + if(c == '+' || c == '$' || c == '%' || c == '/') { + next = encoded[i + 1]; + FX_CHAR decodedChar = '\0'; + switch (c) { + case '+': + if (next >= 'A' && next <= 'Z') { + decodedChar = (FX_CHAR) (next + 32); + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '$': + if (next >= 'A' && next <= 'Z') { + decodedChar = (FX_CHAR) (next - 64); + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '%': + if (next >= 'A' && next <= 'E') { + decodedChar = (FX_CHAR) (next - 38); + } else if (next >= 'F' && next <= 'J') { + decodedChar = (FX_CHAR) (next - 11); + } else if (next >= 'K' && next <= 'O' && next != 'M' && next != 'N') { + decodedChar = (FX_CHAR) (next + 16); + } else if (next >= 'P' && next <= 'S') { + decodedChar = (FX_CHAR) (next + 43); + } else if (next == 'U') { + decodedChar = (FX_CHAR) 0; + } else if (next == 'V') { + decodedChar = (FX_CHAR) 64; + } else if (next == 'W') { + decodedChar = (FX_CHAR) 96; + } else if (next == 'T' || next == 'X' || next == 'Y' || next == 'Z') { + decodedChar = (FX_CHAR) 127; + } else { + e = BCExceptionFormatException; + return ""; + } + break; + case '/': + if (next >= 'A' && next <= 'O') { + decodedChar = (FX_CHAR) (next - 32); + } else if (next == 'Z') { + decodedChar = ':'; + } else { + e = BCExceptionFormatException; + return ""; + } + break; + } + decoded += decodedChar; + i++; + } else { + decoded += c; + } + } + return decoded; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h new file mode 100644 index 0000000000..81fd6b79e9 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode39Reader.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODA39READER_H_ +#define _BC_ONEDCODA39READER_H_ +class CBC_OneDReader; +class CBC_CommonBitArray; +class CBC_OnedCoda39Reader; +class CBC_OnedCode39Reader : public CBC_OneDReader +{ +public: + static FX_LPCSTR ALPHABET_STRING; + static FX_LPCSTR CHECKSUM_STRING; + const static FX_INT32 CHARACTER_ENCODINGS[44]; + const static FX_INT32 ASTERISK_ENCODING; + CBC_OnedCode39Reader(); + CBC_OnedCode39Reader(FX_BOOL usingCheckDigit); + CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode); + virtual ~CBC_OnedCode39Reader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); +private: + FX_BOOL m_usingCheckDigit; + FX_BOOL m_extendedMode; + CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); + FX_INT32 ToNarrowWidePattern(CFX_Int32Array *counters); + FX_CHAR PatternToChar(FX_INT32 pattern, FX_INT32 &e); + CFX_ByteString DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp new file mode 100644 index 0000000000..d9c77460ac --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.cpp @@ -0,0 +1,351 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_OneDReader.h" +#include "BC_OneDimWriter.h" +#include "BC_OnedCode39Reader.h" +#include "BC_OnedCode39Writer.h" +CBC_OnedCode39Writer::CBC_OnedCode39Writer() +{ + m_extendedMode = FALSE; + m_iWideNarrRatio = 3; +} +CBC_OnedCode39Writer::CBC_OnedCode39Writer(FX_BOOL extendedMode) +{ + m_iWideNarrRatio = 3; + m_extendedMode = extendedMode; +} +CBC_OnedCode39Writer::~CBC_OnedCode39Writer() +{ +} +FX_BOOL CBC_OnedCode39Writer::CheckContentValidity(FX_WSTR contents) +{ + if (m_extendedMode) { + return CheckExtendedContentValidity(contents); + } + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' + || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + continue; + } + return FALSE; + } + return TRUE; +} +FX_BOOL CBC_OnedCode39Writer::CheckExtendedContentValidity(FX_WSTR contents) +{ + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if (ch > 127) { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedCode39Writer::FilterContents(FX_WSTR contents) +{ + if (m_extendedMode) { + return FilterExtendedContents(contents); + } + CFX_WideString filtercontents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } else { + ch = Upper(ch); + } + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' + || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + filtercontents += ch; + } + } + return filtercontents; +} +CFX_WideString CBC_OnedCode39Writer::FilterExtendedContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if (ch > 127 && ch < 176) { + continue; + } + if (ch == 0) { + filtercontents += '%'; + filtercontents += 'U'; + } else if(ch >= 1 && ch <= 26) { + filtercontents += '$'; + filtercontents += (ch + 64); + } else if (ch >= 27 && ch <= 31) { + filtercontents += '%'; + filtercontents += (ch + 38); + } else if (ch >= 33 && ch <= 47 && ch != 45 && ch != 46) { + filtercontents += '/'; + filtercontents += (ch + 32); + } else if (ch == 58) { + filtercontents += '/'; + filtercontents += 'Z'; + } else if (ch >= 59 && ch <= 63) { + filtercontents += '%'; + filtercontents += ch + 11; + } else if (ch == 64) { + filtercontents += '%'; + filtercontents += 'V'; + } else if (ch >= 91 && ch <= 95) { + filtercontents += '%'; + filtercontents += ch - 16; + } else if (ch == 96) { + filtercontents += '%'; + filtercontents += 'W'; + } else if (ch >= 97 && ch <= 122) { + filtercontents += '+'; + filtercontents += ch - 32; + } else if (ch >= 123 && ch <= 126) { + filtercontents += '%'; + filtercontents += ch - 43; + } else if (ch == 127) { + filtercontents += '%'; + filtercontents += 'T'; + } else { + filtercontents += ch; + } + } + return filtercontents; +} +CFX_WideString CBC_OnedCode39Writer::RenderTextContents(FX_WSTR contents) +{ + if (m_extendedMode) { + return RenderExtendedTextContents(contents); + } + CFX_WideString renderContents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') + || (ch >= (FX_WCHAR)'a' && ch <= (FX_WCHAR)'z') || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' + || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' + || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { + renderContents += ch; + } + } + return renderContents; +} +CFX_WideString CBC_OnedCode39Writer::RenderExtendedTextContents(FX_WSTR contents) +{ + CFX_WideString renderContents; + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_WCHAR ch = contents.GetAt(i); + if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { + continue; + } + if(ch > 175) { + i++; + continue; + } + if (ch > 127 && ch < 176) { + continue; + } + renderContents += ch; + } + return renderContents; +} +FX_BOOL CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { + return FALSE; + } + m_locTextLoc = location; + return TRUE; +} +FX_BOOL CBC_OnedCode39Writer::SetWideNarrowRatio(FX_INT32 ratio) +{ + if ( ratio < 2 || ratio > 3) { + return FALSE; + } + m_iWideNarrRatio = ratio; + return TRUE; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_CODE_39) { + e = BCExceptionOnlyEncodeCODE_39; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +void CBC_OnedCode39Writer::ToIntArray(FX_INT32 a, FX_INT32 *toReturn) +{ + for(FX_INT32 i = 0; i < 9; i++) { + toReturn[i] = (a & (1 << i) ) == 0 ? 1 : m_iWideNarrRatio; + } +} +FX_CHAR CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e) +{ + FX_INT32 length = contents.GetLength(); + if (length > 80) { + e = BCExceptionContentsLengthShouldBetween1and80; + return '*'; + } + FX_INT32 checksum = 0; + FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); + for(FX_INT32 i = 0; i < contents.GetLength(); i++) { + FX_INT32 j = 0; + for (; j < len; j++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[j] == contents[i]) { + if(contents[i] != '*') { + checksum += j; + break; + } else { + break; + } + } + } + if (j >= len) { + e = BCExceptionUnSupportedString; + return '*'; + } + } + checksum = checksum % 43; + return CBC_OnedCode39Reader::CHECKSUM_STRING[checksum]; +} +FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outlength , FX_INT32 &e) +{ + FX_CHAR checksum = CalcCheckSum(contents, e); + if (checksum == '*') { + return NULL; + } + FX_INT32 widths[9] = {0}; + FX_INT32 wideStrideNum = 3; + FX_INT32 narrStrideNum = 9 - wideStrideNum; + CFX_ByteString encodedContents = contents; + if ( m_bCalcChecksum ) { + encodedContents += checksum; + } + m_iContentLen = encodedContents.GetLength(); + FX_INT32 codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 + 1 + m_iContentLen; + FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); + for (FX_INT32 j = 0; j < m_iContentLen; j++) { + for (FX_INT32 i = 0; i < len; i++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[j]) { + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); + for(FX_INT32 k = 0; k < 9; k++) { + codeWidth += widths[k]; + } + } + } + } + outlength = codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, codeWidth); + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); + FX_INT32 pos = AppendPattern(result, 0, widths, 9, 1 , e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 narrowWhite[] = {1}; + pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for(FX_INT32 l = m_iContentLen - 1; l >= 0; l--) { + for (FX_INT32 i = 0; i < len; i++) { + if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[l]) { + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); + pos += AppendPattern(result, pos, widths, 9, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + } + pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); + pos += AppendPattern(result, pos, widths, 9, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (FX_INT32 i = 0; i < codeWidth / 2; i++) { + result[i] ^= result[codeWidth - 1 - i]; + result[codeWidth - 1 - i] ^= result[i]; + result[i] ^= result[codeWidth - 1 - i]; + } + return result; +} +CFX_WideString CBC_OnedCode39Writer::encodedContents(FX_WSTR contents, FX_INT32 &e) +{ + CFX_WideString encodedContents = contents; + if (m_bCalcChecksum && m_bPrintChecksum) { + CFX_WideString checksumContent = FilterContents(contents); + CFX_ByteString str = checksumContent.UTF8Encode(); + FX_CHAR checksum; + checksum = CalcCheckSum(str, e); + BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); + str += checksum; + encodedContents += checksum; + } + return encodedContents; +} +void CBC_OnedCode39Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CFX_WideString encodedCon = encodedContents(contents, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_OneDimWriter::RenderResult(encodedCon, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h new file mode 100644 index 0000000000..b37d9d8e19 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedCode39Writer.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDCODA39WRITER_H_ +#define _BC_ONEDCODA39WRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedCoda39Writer; +class CBC_OnedCode39Writer : public CBC_OneDimWriter +{ +public: + CBC_OnedCode39Writer(); + CBC_OnedCode39Writer(FX_BOOL extendedMode); + virtual ~CBC_OnedCode39Writer(); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + CFX_WideString encodedContents(FX_WSTR contents, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + FX_BOOL CheckExtendedContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + CFX_WideString FilterExtendedContents(FX_WSTR contents); + CFX_WideString RenderTextContents(FX_WSTR contents); + CFX_WideString RenderExtendedTextContents(FX_WSTR contents); + FX_BOOL SetTextLocation(BC_TEXT_LOC loction); + FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); +private: + void ToIntArray(FX_INT32 a, FX_INT32 *toReturn); + FX_CHAR CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e); + FX_INT32 m_iWideNarrRatio; + FX_BOOL m_extendedMode; +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp new file mode 100644 index 0000000000..ddce736bb8 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.cpp @@ -0,0 +1,94 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OneDimReader.h" +#include "BC_OnedEAN13Reader.h" +const FX_INT32 CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = { + 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A +}; +CBC_OnedEAN13Reader::CBC_OnedEAN13Reader() +{ +} +CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader() +{ +} +void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e) +{ + for (FX_INT32 d = 0; d < 10; d++) { + if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) { + result.Insert(0, (FX_CHAR) ('0' + d)); + return; + } + } + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +FX_INT32 CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) +{ + CFX_Int32Array counters; + counters.Add(0); + counters.Add(0); + counters.Add(0); + counters.Add(0); + FX_INT32 end = row->GetSize(); + FX_INT32 rowOffset = (*startRange)[1]; + FX_INT32 lgPatternFound = 0; + for (FX_INT32 x = 0; x < 6 && rowOffset < end; x++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultString += (FX_CHAR) ('0' + bestMatch % 10); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + if (bestMatch >= 10) { + lgPatternFound |= 1 << (5 - x); + } + } + DetermineFirstDigit(resultString, lgPatternFound, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + CFX_Int32Array result; + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); + CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + rowOffset = (*middleRange)[1]; + if(middleRange != NULL) { + delete middleRange; + middleRange = NULL; + } + for (FX_INT32 Y = 0; Y < 6 && rowOffset < end; Y++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultString += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 k = 0; k < counters.GetSize(); k++) { + rowOffset += counters[k]; + } + } + return rowOffset; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h new file mode 100644 index 0000000000..9afb9b6418 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN13Reader.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDEAN13READER_H_ +#define _BC_ONEDEAN13READER_H_ +class CBC_OneDimReader; +class CBC_CommonBitArray; +class CBC_OnedEAN13Reader; +class CBC_OnedEAN13Reader : public CBC_OneDimReader +{ +public: + const static FX_INT32 FIRST_DIGIT_ENCODINGS[10]; + CBC_OnedEAN13Reader(); + virtual ~CBC_OnedEAN13Reader(); +private: + void DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); + friend class CBC_OnedUPCAReader; +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp new file mode 100644 index 0000000000..788cd8f7da --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.cpp @@ -0,0 +1,294 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_Reader.h" +#include "BC_OneDReader.h" +#include "BC_OneDimReader.h" +#include "BC_OneDimWriter.h" +#include "BC_OnedEAN13Reader.h" +#include "BC_OnedEAN13Writer.h" +CBC_OnedEAN13Writer::CBC_OnedEAN13Writer() +{ + m_bLeftPadding = TRUE; + m_codeWidth = 3 + + (7 * 6) + + 5 + + (7 * 6) + + 3; +} +CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() +{ +} +FX_BOOL CBC_OnedEAN13Writer::CheckContentValidity(FX_WSTR contents) +{ + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedEAN13Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedEAN13Writer::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if(format != BCFORMAT_EAN_13) { + e = BCExceptionOnlyEncodeEAN_13; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) +{ + if (contents.GetLength() != 13) { + e = BCExceptionDigitLengthShould13; + return NULL; + } + m_iDataLenth = 13; + FX_INT32 firstDigit = FXSYS_atoi(contents.Mid(0, 1)); + FX_INT32 parities = CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[firstDigit]; + outLength = m_codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); + FX_INT32 pos = 0; + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 i = 0; + for ( i = 1; i <= 6; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + if ((parities >> (6 - i) & 1) == 1) { + digit += 10; + } + pos += AppendPattern(result, pos, CBC_OneDimReader::L_AND_G_PATTERNS[digit], 4, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (i = 7; i <= 12; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + return result; +} +void CBC_OnedEAN13Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPadding = 7 * multiple; + FX_INT32 leftPosition = 3 * multiple + leftPadding; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + CFX_ByteString tempStr = str.Mid(1, 6); + FX_INT32 strWidth = multiple * 42; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 47 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 47 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + FX_INT32 strWidth1 = multiple * 7; + CFX_Matrix matr2(m_outputHScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); + CFX_FloatRect rect2(0.0f, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 0.5f, (FX_FLOAT)m_Height); + matr2.Concat(*matrix); + matr2.TransformRect(rect2); + re = rect2.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + FX_FLOAT blank = 0.0; + FX_FLOAT charsWidth = 0; + iLen = tempStr.GetLength(); + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos + 1, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if (pOutBitmap != NULL) { + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + FX_RECT rect(0, 0, strWidth, iTextHeight); + ge.FillRect(&rect, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight) + iFontSize); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(7, 6); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 7, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + FX_RECT rect1(0, 0, strWidth, iTextHeight); + ge.FillRect(&rect1, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 7, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 47 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 47 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 7, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(0, 1); + iLen = tempStr.GetLength(); + strWidth = multiple * 7; + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedEAN13Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h new file mode 100644 index 0000000000..2353cfda95 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN13Writer.h @@ -0,0 +1,31 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDEAN13WRITER_H_ +#define _BC_ONEDEAN13WRITER_H_ +class CBC_OneDimWriter; +class CBC_OnedEAN13Writer; +class CBC_OnedEAN13Writer : public CBC_OneDimWriter +{ +private: + FX_INT32 m_codeWidth; +public: + CBC_OnedEAN13Writer(); + virtual ~CBC_OnedEAN13Writer(); + + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); +protected: + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp new file mode 100644 index 0000000000..48e24681df --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.cpp @@ -0,0 +1,81 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_OneDReader.h" +#include "BC_OneDimReader.h" +#include "BC_OnedEAN8Reader.h" +CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() +{ +} +CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() +{ +} +FX_INT32 CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) +{ + CFX_Int32Array counters; + counters.Add(0); + counters.Add(0); + counters.Add(0); + counters.Add(0); + FX_INT32 end = row->GetSize(); + FX_INT32 rowOffset = (*startRange)[1]; + FX_INT32 rowOffsetLeft = rowOffset; + for (FX_INT32 x = 0; x < 4 && rowOffset < end; x++) { + FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultResult += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + } + FX_INT32 RowOffsetLen = (rowOffset - rowOffsetLeft) / 4; + CFX_Int32Array result; + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); + result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); + CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 rowOffsetMid = rowOffset; + rowOffset = (*middleRange)[1]; + if((rowOffset - rowOffsetMid) > RowOffsetLen) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + if(middleRange != NULL) { + delete middleRange; + middleRange = NULL; + } + for (FX_INT32 y = 0; y < 4 && rowOffset < end; y++) { + FX_INT32 bestMatch = DecodeDigit(row, & counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + resultResult += (FX_CHAR) ('0' + bestMatch); + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + rowOffset += counters[i]; + } + } + return rowOffset; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h new file mode 100644 index 0000000000..a32bb63083 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN8Reader.h @@ -0,0 +1,20 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDEAN8READER_H_ +#define _BC_ONEDEAN8READER_H_ +class CBC_OneDimReader; +class CBC_CommonBitArray; +class CBC_OnedEAN8Reader; +class CBC_OnedEAN8Reader : public CBC_OneDimReader +{ +public: + CBC_OnedEAN8Reader(); + virtual ~CBC_OnedEAN8Reader(); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray*, CFX_Int32Array *startRange, CFX_ByteString &result, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp new file mode 100644 index 0000000000..19f7f7cede --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.cpp @@ -0,0 +1,261 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_OneDReader.h" +#include "BC_OneDimWriter.h" +#include "BC_OneDimReader.h" +#include "BC_OnedEAN8Writer.h" +CBC_OnedEAN8Writer::CBC_OnedEAN8Writer() +{ + m_iDataLenth = 8; + m_codeWidth = 3 + + (7 * 4) + + 5 + + (7 * 4) + + 3; +} +CBC_OnedEAN8Writer::~CBC_OnedEAN8Writer() +{ +} +void CBC_OnedEAN8Writer::SetDataLength(FX_INT32 length) +{ + m_iDataLenth = 8; +} +FX_BOOL CBC_OnedEAN8Writer::SetTextLocation(BC_TEXT_LOC location) +{ + if ( location == BC_TEXT_LOC_BELOWEMBED) { + m_locTextLoc = location; + return TRUE; + } + return FALSE; +} +FX_BOOL CBC_OnedEAN8Writer::CheckContentValidity(FX_WSTR contents) +{ + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedEAN8Writer::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedEAN8Writer::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, + FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e) +{ + if (format != BCFORMAT_EAN_8) { + e = BCExceptionOnlyEncodeEAN_8; + return NULL; + } + FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e) +{ + if (contents.GetLength() != 8) { + e = BCExceptionDigitLengthMustBe8; + return NULL; + } + outLength = m_codeWidth; + FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); + FX_INT32 pos = 0; + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + FX_INT32 i = 0; + for (i = 0; i <= 3; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + for (i = 4; i <= 7; i++) { + FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); + pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + } + pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); + if (e != BCExceptionNO) { + FX_Free (result); + return NULL; + } + return result; +} +void CBC_OnedEAN8Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPosition = 3 * multiple; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLength = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLength); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLength); + CFX_ByteString tempStr = str.Mid(0, 4); + FX_INT32 iLen = tempStr.GetLength(); + FX_INT32 strWidth = 7 * multiple * 4; + FX_FLOAT blank = 0.0; + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_FLOAT charsWidth = 0; + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 33 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 33 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + if (pOutBitmap == NULL) { + strWidth = (FX_INT32)(strWidth * m_outputHScale); + } + CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + affine_matrix1.Concat(*matrix); + FX_BOOL ret = device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize, + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(4, 4); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 4, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create(strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 4, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 33 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 33 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + FX_BOOL ret = device->DrawNormalText(iLen, + pCharPos + 4, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedEAN8Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h new file mode 100644 index 0000000000..2b55734538 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedEAN8Writer.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDEAN8WRITER_H_ +#define _BC_ONEDEAN8WRITER_H_ +enum BC_TEXT_LOC; +class CBC_OneDimWriter; +class CBC_OnedEAN8Writer; +class CBC_OnedEAN8Writer : public CBC_OneDimWriter +{ +private: + FX_INT32 m_codeWidth; +public: + CBC_OnedEAN8Writer(); + virtual ~CBC_OnedEAN8Writer(); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + void SetDataLength(FX_INT32 length); + FX_BOOL SetTextLocation(BC_TEXT_LOC location); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); +protected: + + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp new file mode 100644 index 0000000000..44c26acf7e --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.cpp @@ -0,0 +1,93 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "BC_OneDReader.h" +#include "BC_OneDimReader.h" +#include "BC_OnedEAN13Reader.h" +#include "BC_OnedUPCAReader.h" +CBC_OnedUPCAReader::CBC_OnedUPCAReader() +{ + m_ean13Reader = NULL; +} +void CBC_OnedUPCAReader::Init() +{ + m_ean13Reader = FX_NEW CBC_OnedEAN13Reader; +} +CBC_OnedUPCAReader::~CBC_OnedUPCAReader() +{ + if(m_ean13Reader != NULL) { + delete m_ean13Reader; + } + m_ean13Reader = NULL; +} +CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, startGuardRange, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->Decode(image, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bytestring = m_ean13Reader->Decode(image, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CFX_ByteString temp = MaybeReturnResult(bytestring, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return temp; +} +FX_INT32 CBC_OnedUPCAReader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) +{ + FX_INT32 temp = m_ean13Reader->DecodeMiddle(row, startRange, resultString, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return temp; +} +CFX_ByteString CBC_OnedUPCAReader::MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e) +{ + if(result[0] == '0') { + result.Delete(0); + return result; + } else { + e = BCExceptionFormatException; + return ""; + } + return ""; +} diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h new file mode 100644 index 0000000000..5df6c739ff --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedUPCAReader.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDUPCAREADER_H_ +#define _BC_ONEDUPCAREADER_H_ +class CBC_BinaryBitmap; +class CBC_CommonBitArray; +class CBC_OneDimReader; +class CBC_OnedEAN13Reader; +class CBC_OnedUPCAReader; +class CBC_OnedUPCAReader : public CBC_OneDimReader +{ +private: + CBC_OnedEAN13Reader *m_ean13Reader; +public: + CBC_OnedUPCAReader(); + virtual ~CBC_OnedUPCAReader(); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + virtual void Init(); +protected: + FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); + CFX_ByteString MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp new file mode 100644 index 0000000000..612c031c02 --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.cpp @@ -0,0 +1,285 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Writer.h" +#include "BC_OneDimWriter.h" +#include "BC_OnedEAN13Writer.h" +#include "BC_OnedUPCAWriter.h" +CBC_OnedUPCAWriter::CBC_OnedUPCAWriter() +{ + m_subWriter = NULL; + m_bLeftPadding = TRUE; + m_bRightPadding = TRUE; +} +void CBC_OnedUPCAWriter::Init() +{ + m_subWriter = FX_NEW CBC_OnedEAN13Writer; +} +CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() +{ + if(m_subWriter != NULL) { + delete m_subWriter; + } + m_subWriter = NULL; +} +FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(FX_WSTR contents) +{ + FX_INT32 i = 0; + for (i = 0; i < contents.GetLength(); i++) { + if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { + continue; + } else { + return FALSE; + } + } + return TRUE; +} +CFX_WideString CBC_OnedUPCAWriter::FilterContents(FX_WSTR contents) +{ + CFX_WideString filtercontents; + FX_WCHAR ch; + for (FX_INT32 i = 0; i < contents.GetLength(); i++) { + ch = contents.GetAt(i); + if(ch > 175) { + i++; + continue; + } + if (ch >= '0' && ch <= '9') { + filtercontents += ch; + } + } + return filtercontents; +} +FX_INT32 CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString &contents) +{ + FX_INT32 odd = 0; + FX_INT32 even = 0; + FX_INT32 j = 1; + for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { + if(j % 2) { + odd += FXSYS_atoi(contents.Mid(i, 1)); + } else { + even += FXSYS_atoi(contents.Mid(i, 1)); + } + j++; + } + FX_INT32 checksum = (odd * 3 + even) % 10; + checksum = (10 - checksum) % 10; + return (checksum); +} +FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + if (format != BCFORMAT_UPC_A) { + e = BCExceptionOnlyEncodeUPC_A; + return NULL; + } + CFX_ByteString toEAN13String = '0' + contents; + m_iDataLenth = 13; + FX_BYTE *ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth, outHeight, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return ret; +} +void CBC_OnedUPCAWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) +{ + if (device == NULL && pOutBitmap == NULL) { + e = BCExceptionIllegalArgument; + return; + } + FX_INT32 leftPadding = 7 * multiple; + FX_INT32 leftPosition = 10 * multiple + leftPadding; + CFX_ByteString str = FX_UTF8Encode(contents); + FX_INT32 iLen = str.GetLength(); + FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); + if (!pCharPos) { + return; + } + FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); + CFX_ByteString tempStr = str.Mid(1, 5); + FX_FLOAT strWidth = (FX_FLOAT)35 * multiple; + FX_FLOAT blank = 0.0; + CFX_FxgeDevice geBitmap; + if (pOutBitmap != NULL) { + geBitmap.Attach(pOutBitmap); + } + FX_FLOAT charsWidth = 0; + iLen = tempStr.GetLength(); + FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); + FX_INT32 iTextHeight = iFontSize + 1; + if (pOutBitmap == NULL) { + CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); + matr.Concat(*matrix); + matr.TransformRect(rect); + FX_RECT re = rect.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 40 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5), (FX_FLOAT)m_Height); + matr1.Concat(*matrix); + matr1.TransformRect(rect1); + re = rect1.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7; + CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height); + matr2.Concat(*matrix); + matr2.TransformRect(rect2); + re = rect2.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); + CFX_FloatRect rect3((FX_FLOAT)(leftPosition + 85 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5), (FX_FLOAT)m_Height); + matr3.Concat(*matrix); + matr3.TransformRect(rect3); + re = rect3.GetOutterRect(); + device->FillRect(&re, m_backgroundColor); + } + if (pOutBitmap == NULL) { + strWidth = strWidth * m_outputHScale; + } + CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank); + CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); + CFX_FxgeDevice ge; + if(pOutBitmap != NULL) { + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 1, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(6, 5); + iLen = tempStr.GetLength(); + charsWidth = 0.0f; + CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + FX_RECT rect2(0, 0, (int)strWidth, iTextHeight); + ge.FillRect(&rect2, m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 6, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 6, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(0, 1); + iLen = tempStr.GetLength(); + strWidth = (FX_FLOAT)multiple * 7; + if (pOutBitmap == NULL) { + strWidth = strWidth * m_outputHScale; + } + CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank); + if(pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + tempStr = str.Mid(11, 1); + iLen = tempStr.GetLength(); + CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank); + if (pOutBitmap != NULL) { + delete ge.GetBitmap(); + ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); + ge.GetBitmap()->Clear(m_backgroundColor); + ge.DrawNormalText(iLen, + pCharPos + 11, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix, + m_fontColor, FXTEXT_CLEARTYPE); + geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple, m_Height - iTextHeight); + } else { + CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); + if (matrix != NULL) { + affine_matrix1.Concat(*matrix); + } + device->DrawNormalText(iLen, + pCharPos + 11, + m_pFont, + CFX_GEModule::Get()->GetFontCache(), + (FX_FLOAT)iFontSize , + (CFX_AffineMatrix *) &affine_matrix1, + m_fontColor, FXTEXT_CLEARTYPE); + } + FX_Free(pCharPos); +} +void CBC_OnedUPCAWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) +{ + CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); +} + diff --git a/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h new file mode 100644 index 0000000000..4174ceb36e --- /dev/null +++ b/xfa/src/fxbarcode/oned/BC_OnedUPCAWriter.h @@ -0,0 +1,31 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_ONEDUPCAWRITER_H_ +#define _BC_ONEDUPCAWRITER_H_ +class CBC_Writer; +class CBC_OnedEAN13Writer; +class CBC_OnedUPCAWriter; +class CBC_OnedUPCAWriter : public CBC_OneDimWriter +{ +private: + CBC_OnedEAN13Writer *m_subWriter; +public: + CBC_OnedUPCAWriter(); + virtual ~CBC_OnedUPCAWriter(); + virtual void Init(); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); + FX_BOOL CheckContentValidity(FX_WSTR contents); + CFX_WideString FilterContents(FX_WSTR contents); + FX_INT32 CalcChecksum(const CFX_ByteString &contents); + +protected: + + void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp new file mode 100644 index 0000000000..96d3a3b655 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417.cpp @@ -0,0 +1,692 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Compaction.h" +#include "BC_PDF417BarcodeRow.h" +#include "BC_PDF417BarcodeMatrix.h" +#include "BC_PDF417ErrorCorrection.h" +#include "BC_PDF417HighLevelEncoder.h" +#include "BC_PDF417.h" +FX_INT32 CBC_PDF417::START_PATTERN = 0x1fea8; +FX_INT32 CBC_PDF417::STOP_PATTERN = 0x3fa29; +FX_INT32 CBC_PDF417::CODEWORD_TABLE[][1000] = { + { + 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, + 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, + 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, + 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, + 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, + 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, + 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, + 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, + 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, + 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, + 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, + 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, + 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, + 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, + 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, + 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, + 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, + 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, + 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, + 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, + 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, + 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, + 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, + 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, + 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, + 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, + 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, + 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, + 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, + 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, + 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, + 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, + 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, + 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, + 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, + 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, + 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, + 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, + 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, + 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, + 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, + 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, + 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, + 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, + 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, + 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, + 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, + 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, + 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, + 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, + 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, + 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, + 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, + 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, + 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, + 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, + 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, + 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, + 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, + 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, + 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, + 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, + 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, + 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, + 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, + 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, + 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, + 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, + 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, + 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, + 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, + 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, + 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, + 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, + 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, + 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, + 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, + 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, + 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, + 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, + 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, + 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, + 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, + 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, + 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, + 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, + 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, + 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, + 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, + 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, + 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, + 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, + 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, + 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, + 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, + 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, + 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, + 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, + 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, + 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, + 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, + 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, + 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, + 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, + 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, + 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, + 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, + 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, + 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, + 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, + 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, + 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, + 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, + 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, + 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, + 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, + 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, + 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, + 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, + 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, + 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, + 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, + 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, + 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, + 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, + 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, + 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, + 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, + 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, + 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, + 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, + 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, + 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, + 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, + 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, + 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, + 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, + 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, + 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, + 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, + 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, + 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, + 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, + 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, + 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, + 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, + 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, + 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, + 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, + 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, + 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, + 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, + 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, + 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, + 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4 + }, + { + 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, + 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, + 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, + 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, + 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, + 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, + 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, + 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, + 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, + 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, + 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, + 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, + 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, + 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, + 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, + 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, + 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, + 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, + 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, + 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, + 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, + 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, + 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, + 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, + 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, + 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, + 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, + 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, + 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, + 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, + 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, + 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, + 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, + 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, + 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, + 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, + 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, + 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, + 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, + 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, + 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, + 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, + 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, + 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, + 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, + 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, + 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, + 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, + 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, + 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, + 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, + 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, + 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, + 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, + 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, + 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, + 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, + 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, + 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, + 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, + 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, + 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, + 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, + 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, + 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, + 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, + 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, + 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, + 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, + 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, + 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, + 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, + 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, + 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, + 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, + 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, + 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, + 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, + 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, + 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, + 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, + 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, + 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, + 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, + 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, + 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, + 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, + 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, + 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, + 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, + 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, + 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, + 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, + 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, + 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, + 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, + 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, + 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, + 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, + 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, + 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, + 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, + 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, + 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, + 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, + 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, + 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, + 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, + 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, + 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, + 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, + 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, + 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, + 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, + 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, + 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, + 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, + 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, + 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, + 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, + 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, + 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, + 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, + 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, + 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, + 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, + 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, + 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, + 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, + 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, + 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, + 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, + 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, + 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, + 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, + 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, + 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, + 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, + 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, + 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, + 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, + 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, + 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, + 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, + 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, + 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, + 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, + 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, + 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, + 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, + 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, + 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, + 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, + 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, + 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26 + }, + { + 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, + 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, + 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, + 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, + 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, + 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, + 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, + 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, + 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, + 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, + 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, + 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, + 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, + 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, + 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, + 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, + 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, + 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, + 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, + 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, + 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, + 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, + 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, + 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, + 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, + 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, + 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, + 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, + 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, + 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, + 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, + 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, + 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, + 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, + 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, + 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, + 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, + 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, + 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, + 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, + 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, + 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, + 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, + 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, + 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, + 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, + 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, + 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, + 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, + 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, + 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, + 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, + 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, + 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, + 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, + 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, + 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, + 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, + 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, + 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, + 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, + 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, + 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, + 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, + 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, + 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, + 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, + 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, + 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, + 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, + 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, + 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, + 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, + 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, + 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, + 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, + 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, + 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, + 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, + 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, + 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, + 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, + 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, + 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, + 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, + 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, + 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, + 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, + 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, + 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, + 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, + 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, + 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, + 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, + 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, + 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, + 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, + 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, + 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, + 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, + 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, + 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, + 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, + 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, + 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, + 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, + 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, + 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, + 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, + 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, + 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, + 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, + 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, + 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, + 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, + 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, + 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, + 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, + 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, + 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, + 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, + 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, + 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, + 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, + 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, + 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, + 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, + 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, + 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, + 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, + 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, + 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, + 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, + 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, + 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, + 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, + 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, + 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, + 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, + 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, + 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, + 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, + 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, + 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, + 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, + 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, + 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, + 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, + 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, + 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, + 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, + 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, + 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, + 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, + 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea + } +}; +FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f; +FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f; +FX_FLOAT CBC_PDF417::HEIGHT = 2.0f; +CBC_PDF417::CBC_PDF417() +{ + m_compact = FALSE; + m_compaction = AUTO; + m_minCols = 1; + m_maxCols = 30; + m_maxRows = 90; + m_minRows = 3; + m_barcodeMatrix = NULL; +} +CBC_PDF417::CBC_PDF417(FX_BOOL compact) +{ + m_compact = compact; + m_compaction = AUTO; + m_minCols = 1; + m_maxCols = 30; + m_maxRows = 90; + m_minRows = 3; + m_barcodeMatrix = NULL; +} +CBC_PDF417::~CBC_PDF417() +{ + if (m_barcodeMatrix) { + delete m_barcodeMatrix; + } +} +CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() +{ + return m_barcodeMatrix; +} +void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + FX_INT32 errorCorrectionCodeWords = CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_WideString highLevel = CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 sourceCodeWords = highLevel.GetLength(); + CFX_Int32Array* dimension = determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 cols = dimension->GetAt(0); + FX_INT32 rows = dimension->GetAt(1); + delete dimension; + FX_INT32 pad = getNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows); + if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { + e = BCExceptionEncodedMessageContainsTooManyCodeWords; + return; + } + FX_INT32 n = sourceCodeWords + pad + 1; + CFX_WideString sb; + sb += (FX_WCHAR) n; + sb += highLevel; + for (FX_INT32 i = 0; i < pad; i++) { + sb += (FX_WCHAR) 900; + } + CFX_WideString dataCodewords(sb); + CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(dataCodewords, errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CFX_WideString fullCodewords = dataCodewords + ec; + m_barcodeMatrix = FX_NEW CBC_BarcodeMatrix(rows, cols); + encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel, m_barcodeMatrix); +} +void CBC_PDF417::setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows) +{ + m_maxCols = maxCols; + m_minCols = minCols; + m_maxRows = maxRows; + m_minRows = minRows; +} +void CBC_PDF417::setCompaction(Compaction compaction) +{ + m_compaction = compaction; +} +void CBC_PDF417::setCompact(FX_BOOL compact) +{ + m_compact = compact; +} +FX_INT32 CBC_PDF417::calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c) +{ + FX_INT32 r = ((m + 1 + k) / c) + 1; + if (c * r >= (m + 1 + k + c)) { + r--; + } + return r; +} +FX_INT32 CBC_PDF417::getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r) +{ + FX_INT32 n = c * r - k; + return n > m + 1 ? n - m - 1 : 0; +} +void CBC_PDF417::encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic) +{ + FX_INT32 map = 1 << (len - 1); + FX_BOOL last = ((pattern & map) != 0); + FX_INT32 width = 0; + for (FX_INT32 i = 0; i < len; i++) { + FX_BOOL black = ((pattern & map) != 0); + if (last == black) { + width++; + } else { + logic->addBar(last, width); + last = black; + width = 1; + } + map >>= 1; + } + logic->addBar(last, width); +} +void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic) +{ + FX_INT32 idx = 0; + for (FX_INT32 y = 0; y < r; y++) { + FX_INT32 cluster = y % 3; + logic->startRow(); + FX_INT32 a = START_PATTERN; + encodeChar(START_PATTERN, 17, logic->getCurrentRow()); + FX_INT32 left; + FX_INT32 right; + if (cluster == 0) { + left = (30 * (y / 3)) + ((r - 1) / 3); + right = (30 * (y / 3)) + (c - 1); + } else if (cluster == 1) { + left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + right = (30 * (y / 3)) + ((r - 1) / 3); + } else { + left = (30 * (y / 3)) + (c - 1); + right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + } + FX_INT32 pattern = CODEWORD_TABLE[cluster][left]; + encodeChar(pattern, 17, logic->getCurrentRow()); + for (FX_INT32 x = 0; x < c; x++) { + pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)]; + encodeChar(pattern, 17, logic->getCurrentRow()); + idx++; + } + if (m_compact) { + encodeChar(STOP_PATTERN, 1, logic->getCurrentRow()); + } else { + pattern = CODEWORD_TABLE[cluster][right]; + encodeChar(pattern, 17, logic->getCurrentRow()); + encodeChar(STOP_PATTERN, 18, logic->getCurrentRow()); + } + } +} +CFX_Int32Array* CBC_PDF417::determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e) +{ + FX_FLOAT ratio = 0.0f; + CFX_Int32Array* dimension = NULL; + for (FX_INT32 cols = m_minCols; cols <= m_maxCols; cols++) { + FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); + if (rows < m_minRows) { + break; + } + if (rows > m_maxRows) { + continue; + } + FX_FLOAT newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); + if (dimension != NULL && fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) { + continue; + } + ratio = newRatio; + if (dimension) { + delete dimension; + } + dimension = FX_NEW CFX_Int32Array; + dimension->Add(cols); + dimension->Add(rows); + } + if (dimension == NULL) { + FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, m_minCols); + if (rows < m_minRows) { + dimension = FX_NEW CFX_Int32Array; + dimension->Add(m_minCols); + dimension->Add(m_minRows); + } else if (rows >= 3 && rows <= 90) { + dimension = FX_NEW CFX_Int32Array; + dimension->Add(m_minCols); + dimension->Add(rows); + } + } + if (dimension == NULL) { + e = BCExceptionUnableToFitMessageInColumns; + return NULL; + } + return dimension; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417.h b/xfa/src/fxbarcode/pdf417/BC_PDF417.h new file mode 100644 index 0000000000..ab31244add --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417_H_ +#define _BC_PDF417_H_ +class CBC_Compaction; +class CBC_BarcodeRow; +class CBC_BarcodeMatrix; +class CBC_PDF417; +class CBC_PDF417 : public CFX_Object +{ +public: + CBC_PDF417(); + CBC_PDF417(FX_BOOL compact); + virtual ~CBC_PDF417(); + CBC_BarcodeMatrix* getBarcodeMatrix(); + void generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e); + void setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows); + void setCompaction(Compaction compaction); + void setCompact(FX_BOOL compact); +private: + static FX_INT32 START_PATTERN; + static FX_INT32 STOP_PATTERN; + static FX_INT32 CODEWORD_TABLE[][1000]; + static FX_FLOAT PREFERRED_RATIO; + static FX_FLOAT DEFAULT_MODULE_WIDTH; + static FX_FLOAT HEIGHT; + CBC_BarcodeMatrix* m_barcodeMatrix; + FX_BOOL m_compact; + Compaction m_compaction; + FX_INT32 m_minCols; + FX_INT32 m_maxCols; + FX_INT32 m_maxRows; + FX_INT32 m_minRows; +private: + static FX_INT32 calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c); + static FX_INT32 getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r); + static void encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic); + void encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic); + CFX_Int32Array* determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp new file mode 100644 index 0000000000..e45562ba79 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp @@ -0,0 +1,98 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417BarcodeRow.h" +#include "BC_PDF417BarcodeMatrix.h" +CBC_BarcodeMatrix::CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width) +{ + m_matrix.SetSize(height + 2); + for (FX_INT32 i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength; i++) { + m_matrix[i] = FX_NEW CBC_BarcodeRow((width + 4) * 17 + 1); + } + m_width = width * 17; + m_height = height + 2; + m_currentRow = 0; + m_outHeight = 0; + m_outWidth = 0; +} +CBC_BarcodeMatrix::~CBC_BarcodeMatrix() +{ + for (FX_INT32 i = 0; i < m_matrix.GetSize(); i++) { + delete (CBC_BarcodeRow*)m_matrix.GetAt(i); + } + m_matrix.RemoveAll(); + m_matrixOut.RemoveAll(); +} +void CBC_BarcodeMatrix::set(FX_INT32 x, FX_INT32 y, FX_BYTE value) +{ + ((CBC_BarcodeRow*)m_matrix[y])->set(x, value); +} +void CBC_BarcodeMatrix::setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black) +{ + set(x, y, (FX_BYTE) (black ? 1 : 0)); +} +void CBC_BarcodeMatrix::startRow() +{ + ++m_currentRow; +} +CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow() +{ + return (CBC_BarcodeRow*)m_matrix[m_currentRow]; +} +FX_INT32 CBC_BarcodeMatrix::getWidth() +{ + return m_outWidth; +} +FX_INT32 CBC_BarcodeMatrix::getHeight() +{ + return m_outHeight; +} +CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() +{ + return getScaledMatrix(1, 1); +} +CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 scale) +{ + return getScaledMatrix(scale, scale); +} +CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale) +{ + FX_INT32 yMax = m_height * yScale; + CFX_ByteArray bytearray; + bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale)); + FX_INT32 xMax = bytearray.GetSize(); + m_matrixOut.SetSize(xMax * yMax); + m_outWidth = xMax; + m_outHeight = yMax; + FX_INT32 k = 0; + for (FX_INT32 i = 0; i < yMax; i++) { + if (i != 0) { + bytearray.Copy(((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale)); + } + k = i * xMax; + for (FX_INT32 l = 0; l < xMax; l++) { + m_matrixOut[k + l] = bytearray.GetAt(l); + } + } + return m_matrixOut; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h new file mode 100644 index 0000000000..d8a0c5d0ae --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BARCODEMATRIX_H_ +#define _BC_BARCODEMATRIX_H_ +class CBC_BarcodeRow; +class CBC_BarcodeMatrix; +class CBC_BarcodeMatrix : public CFX_Object +{ +public: + CBC_BarcodeMatrix(); + CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width); + virtual ~CBC_BarcodeMatrix(); + void set(FX_INT32 x, FX_INT32 y, FX_BYTE value); + void setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black); + void startRow(); + CBC_BarcodeRow* getCurrentRow(); + CFX_ByteArray& getMatrix(); + CFX_ByteArray& getScaledMatrix(FX_INT32 scale); + CFX_ByteArray& getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale); + FX_INT32 getWidth(); + FX_INT32 getHeight(); +private: + CFX_PtrArray m_matrix; + CFX_ByteArray m_matrixOut; + FX_INT32 m_currentRow; + FX_INT32 m_height; + FX_INT32 m_width; + FX_INT32 m_outWidth; + FX_INT32 m_outHeight; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp new file mode 100644 index 0000000000..456c0e6f2e --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.cpp @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417BarcodeMetadata.h" +CBC_BarcodeMetadata::CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel) +{ + m_columnCount = columnCount; + m_rowCountUpperPart = rowCountUpperPart; + m_rowCountLowerPart = rowCountLowerPart; + m_errorCorrectionLevel = errorCorrectionLevel; + m_rowCount = m_rowCountUpperPart + m_rowCountLowerPart; +} +CBC_BarcodeMetadata::~CBC_BarcodeMetadata() +{ +} +FX_INT32 CBC_BarcodeMetadata::getColumnCount() +{ + return m_columnCount; +} +FX_INT32 CBC_BarcodeMetadata::getErrorCorrectionLevel() +{ + return m_errorCorrectionLevel; +} +FX_INT32 CBC_BarcodeMetadata::getRowCount() +{ + return m_rowCount; +} +FX_INT32 CBC_BarcodeMetadata::getRowCountUpperPart() +{ + return m_rowCountUpperPart; +} +FX_INT32 CBC_BarcodeMetadata::getRowCountLowerPart() +{ + return m_rowCountLowerPart; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h new file mode 100644 index 0000000000..62b1282827 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BARCODEMETADATA_H_ +#define _BC_BARCODEMETADATA_H_ +class CBC_BarcodeMetadata; +class CBC_BarcodeMetadata : public CFX_Object +{ +public: + CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel); + virtual ~CBC_BarcodeMetadata(); + FX_INT32 getColumnCount(); + FX_INT32 getErrorCorrectionLevel(); + FX_INT32 getRowCount(); + FX_INT32 getRowCountUpperPart(); + FX_INT32 getRowCountLowerPart(); +private: + FX_INT32 m_columnCount; + FX_INT32 m_errorCorrectionLevel; + FX_INT32 m_rowCountUpperPart; + FX_INT32 m_rowCountLowerPart; + FX_INT32 m_rowCount; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp new file mode 100644 index 0000000000..02bc0f5574 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417BarcodeRow.h" +CBC_BarcodeRow::CBC_BarcodeRow(FX_INT32 width) +{ + m_row.SetSize(width); + m_currentLocation = 0; +} +CBC_BarcodeRow::~CBC_BarcodeRow() +{ + m_output.RemoveAll(); + m_row.RemoveAll(); +} +void CBC_BarcodeRow::set(FX_INT32 x, FX_BYTE value) +{ + m_row.SetAt(x, value); +} +void CBC_BarcodeRow::set(FX_INT32 x, FX_BOOL black) +{ + m_row.SetAt(x, (FX_BYTE) (black ? 1 : 0)); +} +void CBC_BarcodeRow::addBar(FX_BOOL black, FX_INT32 width) +{ + for (FX_INT32 ii = 0; ii < width; ii++) { + set(m_currentLocation++, black); + } +} +CFX_ByteArray& CBC_BarcodeRow::getRow() +{ + return m_row; +} +CFX_ByteArray& CBC_BarcodeRow::getScaledRow(FX_INT32 scale) +{ + m_output.SetSize(m_row.GetSize() * scale); + for (FX_INT32 i = 0; i < m_output.GetSize(); i++) { + m_output[i] = (m_row[i / scale]); + } + return m_output; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h new file mode 100644 index 0000000000..75fd15b653 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeRow.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BARCODEROW_H_ +#define _BC_BARCODEROW_H_ +class CBC_BarcodeRow; +class CBC_BarcodeRow : public CFX_Object +{ +public: + CBC_BarcodeRow(FX_INT32 width); + virtual ~CBC_BarcodeRow(); + void set(FX_INT32 x, FX_BYTE value); + void set(FX_INT32 x, FX_BOOL black); + void addBar(FX_BOOL black, FX_INT32 width); + CFX_ByteArray& getRow(); + CFX_ByteArray& getScaledRow(FX_INT32 scale); +private: + CFX_ByteArray m_row; + CFX_ByteArray m_output; + FX_INT32 m_currentLocation; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp new file mode 100644 index 0000000000..446ef58a48 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.cpp @@ -0,0 +1,68 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417BarcodeValue.h" +CBC_BarcodeValue::CBC_BarcodeValue() +{ +} +CBC_BarcodeValue::~CBC_BarcodeValue() +{ +} +void CBC_BarcodeValue::setValue(FX_INT32 value) +{ + FX_INT32 confidence = 0; + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { + if (m_keys.GetAt(i) == value) { + confidence = m_values.GetAt(i); + m_values.SetAt(i, confidence + 1); + return; + } + } + confidence = 1; + m_keys.Add(value); + m_values.Add(confidence); +} +CFX_Int32Array* CBC_BarcodeValue::getValue() +{ + FX_INT32 maxConfidence = -1; + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { + if (m_values.GetAt(i) > maxConfidence) { + maxConfidence = m_values.GetAt(i); + result->RemoveAll(); + result->Add(m_keys.GetAt(i)); + } else if (m_values.GetAt(i) == maxConfidence) { + result->Add(m_keys.GetAt(i)); + } + } + return result; +} +FX_INT32 CBC_BarcodeValue::getConfidence(FX_INT32 value) +{ + for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) + if (m_keys.GetAt(i) == value) { + return m_values.GetAt(i); + } + return -1; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h new file mode 100644 index 0000000000..1695c8ac5a --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeValue.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BARCODEVALUE_H_ +#define _BC_BARCODEVALUE_H_ +class CBC_BarcodeValue; +class CBC_BarcodeValue : public CFX_Object +{ +public: + CBC_BarcodeValue(); + virtual ~CBC_BarcodeValue(); + void setValue(FX_INT32 value); + CFX_Int32Array* getValue(); + FX_INT32 getConfidence(FX_INT32 value); +private: + CFX_Int32Array m_keys; + CFX_Int32Array m_values; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp new file mode 100644 index 0000000000..55f4cb4510 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.cpp @@ -0,0 +1,194 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_PDF417BoundingBox.h" +CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e) +{ + if ((topLeft == NULL && topRight == NULL) || + (bottomLeft == NULL && bottomRight == NULL) || + (topLeft != NULL && bottomLeft == NULL) || + (topRight != NULL && bottomRight == NULL)) { + e = BCExceptionNotFoundInstance; + } + init(image, topLeft, bottomLeft, topRight, bottomRight); +} +CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) +{ + init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft, boundingBox->m_topRight, boundingBox->m_bottomRight); +} +CBC_BoundingBox::~CBC_BoundingBox() +{ + if (m_topLeft) { + delete m_topLeft; + } + if (m_bottomLeft) { + delete m_bottomLeft; + } + if (m_topRight) { + delete m_topRight; + } + if (m_bottomRight) { + delete m_bottomRight; + } +} +CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e) +{ + CBC_BoundingBox* boundingBox = NULL; + if (leftBox == NULL) { + boundingBox = FX_NEW CBC_BoundingBox(rightBox); + return boundingBox; + } + if (rightBox == NULL) { + boundingBox = FX_NEW CBC_BoundingBox(leftBox); + return boundingBox; + } + boundingBox = FX_NEW CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft, leftBox->m_bottomLeft, rightBox->m_topRight, rightBox->m_bottomRight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +CBC_BoundingBox* CBC_BoundingBox::addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e) +{ + CBC_ResultPoint* newTopLeft = m_topLeft; + CBC_ResultPoint* newBottomLeft = m_bottomLeft; + CBC_ResultPoint* newTopRight = m_topRight; + CBC_ResultPoint* newBottomRight = m_bottomRight; + CBC_ResultPoint* newTop = NULL; + CBC_ResultPoint* newBottom = NULL; + if (missingStartRows > 0) { + CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight; + FX_INT32 newMinY = (FX_INT32) top->GetY() - missingStartRows; + if (newMinY < 0) { + newMinY = 0; + } + newTop = FX_NEW CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY); + if (isLeft) { + newTopLeft = newTop; + } else { + newTopRight = newTop; + } + } + if (missingEndRows > 0) { + CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight; + FX_INT32 newMaxY = (FX_INT32) bottom->GetY() + missingEndRows; + if (newMaxY >= m_image->GetHeight()) { + newMaxY = m_image->GetHeight() - 1; + } + newBottom = FX_NEW CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY); + if (isLeft) { + newBottomLeft = newBottom; + } else { + newBottomRight = newBottom; + } + } + calculateMinMaxValues(); + CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e); + delete newTop; + delete newBottom; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) +{ + if (m_topRight) { + delete m_topRight; + } + m_topRight = FX_NEW CBC_ResultPoint(topRight.GetX(), topRight.GetY()); + calculateMinMaxValues(); +} +void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) +{ + if (m_bottomRight) { + delete m_bottomRight; + } + m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY()); + calculateMinMaxValues(); +} +FX_INT32 CBC_BoundingBox::getMinX() +{ + return m_minX; +} +FX_INT32 CBC_BoundingBox::getMaxX() +{ + return m_maxX; +} +FX_INT32 CBC_BoundingBox::getMinY() +{ + return m_minY; +} +FX_INT32 CBC_BoundingBox::getMaxY() +{ + return m_maxY; +} +CBC_ResultPoint* CBC_BoundingBox::getTopLeft() +{ + return m_topLeft; +} +CBC_ResultPoint* CBC_BoundingBox::getTopRight() +{ + return m_topRight; +} +CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() +{ + return m_bottomLeft; +} +CBC_ResultPoint* CBC_BoundingBox::getBottomRight() +{ + return m_bottomRight; +} +void CBC_BoundingBox::init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight) +{ + m_topLeft = NULL; + m_bottomLeft = NULL; + m_topRight = NULL; + m_bottomRight = NULL; + m_image = image; + if (topLeft) { + m_topLeft = FX_NEW CBC_ResultPoint(topLeft->GetX(), topLeft->GetY()); + } + if (bottomLeft) { + m_bottomLeft = FX_NEW CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY()); + } + if (topRight) { + m_topRight = FX_NEW CBC_ResultPoint(topRight->GetX(), topRight->GetY()); + } + if (bottomRight) { + m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY()); + } + calculateMinMaxValues(); +} +void CBC_BoundingBox::calculateMinMaxValues() +{ + if (m_topLeft == NULL) { + m_topLeft = FX_NEW CBC_ResultPoint(0, m_topRight->GetY()); + m_bottomLeft = FX_NEW CBC_ResultPoint(0, m_bottomRight->GetY()); + } else if (m_topRight == NULL) { + m_topRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_topLeft->GetY()); + m_bottomRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_bottomLeft->GetY()); + } + m_minX = (FX_INT32) (m_topLeft->GetX() < m_bottomLeft->GetX() ? m_topLeft->GetX() : m_bottomLeft->GetX()); + m_maxX = (FX_INT32) (m_topRight->GetX() > m_bottomRight->GetX() ? m_topRight->GetX() : m_bottomRight->GetX()); + m_minY = (FX_INT32) (m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY() : m_topRight->GetY()); + m_maxY = (FX_INT32) (m_bottomLeft->GetY() > m_bottomRight->GetY() ? m_bottomLeft->GetY() : m_bottomRight->GetY()); +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h new file mode 100644 index 0000000000..efae2b706f --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h @@ -0,0 +1,43 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_BOUNDINGBOX_H_ +#define _BC_BOUNDINGBOX_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_BoundingBox; +class CBC_BoundingBox : public CFX_Object +{ +public: + CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e); + CBC_BoundingBox(CBC_BoundingBox* boundingBox); + virtual ~CBC_BoundingBox(); + static CBC_BoundingBox* merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e); + CBC_BoundingBox* addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e); + void setTopRight(CBC_ResultPoint topRight); + void setBottomRight(CBC_ResultPoint bottomRight); + FX_INT32 getMinX(); + FX_INT32 getMaxX(); + FX_INT32 getMinY(); + FX_INT32 getMaxY(); + CBC_ResultPoint* getTopLeft(); + CBC_ResultPoint* getTopRight(); + CBC_ResultPoint* getBottomLeft(); + CBC_ResultPoint* getBottomRight(); +private: + CBC_CommonBitMatrix* m_image; + CBC_ResultPoint* m_topLeft; + CBC_ResultPoint* m_bottomLeft; + CBC_ResultPoint* m_topRight; + CBC_ResultPoint* m_bottomRight; + FX_INT32 m_minX; + FX_INT32 m_maxX; + FX_INT32 m_minY; + FX_INT32 m_maxY; + void init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight); + void calculateMinMaxValues(); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp new file mode 100644 index 0000000000..9ac65ab7bc --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.cpp @@ -0,0 +1,80 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Codeword.h" +FX_INT32 CBC_Codeword::BARCODE_ROW_UNKNOWN = -1; +CBC_Codeword::CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 cvalue) +{ + m_startX = startX; + m_endX = endX; + m_bucket = bucket; + m_value = cvalue; + m_rowNumber = BARCODE_ROW_UNKNOWN; +} +CBC_Codeword::~CBC_Codeword() +{ +} +FX_BOOL CBC_Codeword::hasValidRowNumber() +{ + return isValidRowNumber(m_rowNumber); +} +FX_BOOL CBC_Codeword::isValidRowNumber(FX_INT32 rowNumber) +{ + return m_rowNumber != BARCODE_ROW_UNKNOWN && m_bucket == (m_rowNumber % 3) * 3; +} +void CBC_Codeword::setRowNumberAsRowIndicatorColumn() +{ + m_rowNumber = (m_value / 30) * 3 + m_bucket / 3; +} +FX_INT32 CBC_Codeword::getWidth() +{ + return m_endX - m_startX; +} +FX_INT32 CBC_Codeword::getStartX() +{ + return m_startX; +} +FX_INT32 CBC_Codeword::getEndX() +{ + return m_endX; +} +FX_INT32 CBC_Codeword::getBucket() +{ + return m_bucket; +} +FX_INT32 CBC_Codeword::getValue() +{ + return m_value; +} +FX_INT32 CBC_Codeword::getRowNumber() +{ + return m_rowNumber; +} +void CBC_Codeword::setRowNumber(FX_INT32 rowNumber) +{ + m_rowNumber = rowNumber; +} +CFX_ByteString CBC_Codeword::toString() +{ + return m_rowNumber + (FX_CHAR)'|' + m_value; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h new file mode 100644 index 0000000000..93b3cf6bb3 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Codeword.h @@ -0,0 +1,34 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_CODEWORD_H_ +#define _BC_CODEWORD_H_ +class CBC_Codeword; +class CBC_Codeword : public CFX_Object +{ +public: + CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 value); + virtual ~CBC_Codeword(); + FX_BOOL hasValidRowNumber() ; + FX_BOOL isValidRowNumber(FX_INT32 rowNumber); + void setRowNumberAsRowIndicatorColumn(); + FX_INT32 getWidth(); + FX_INT32 getStartX(); + FX_INT32 getEndX(); + FX_INT32 getBucket(); + FX_INT32 getValue(); + FX_INT32 getRowNumber(); + void setRowNumber(FX_INT32 rowNumber); + CFX_ByteString toString(); +private: + static FX_INT32 BARCODE_ROW_UNKNOWN; + FX_INT32 m_startX; + FX_INT32 m_endX; + FX_INT32 m_bucket; + FX_INT32 m_value; + FX_INT32 m_rowNumber; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp new file mode 100644 index 0000000000..bf16bc25e0 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.cpp @@ -0,0 +1,118 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417CodewordDecoder.h" +#define SYMBOL_TABLE_Length 2787 +#define Float_MAX_VALUE 2147483647 +FX_FLOAT CBC_PDF417CodewordDecoder::RATIOS_TABLE[2787][8] = {0}; +CBC_PDF417CodewordDecoder::CBC_PDF417CodewordDecoder() +{ +} +CBC_PDF417CodewordDecoder::~CBC_PDF417CodewordDecoder() +{ +} +void CBC_PDF417CodewordDecoder::Initialize() +{ + for (FX_INT32 i = 0; i < SYMBOL_TABLE_Length; i++) { + FX_INT32 currentSymbol = CBC_PDF417Common::SYMBOL_TABLE[i]; + FX_INT32 currentBit = currentSymbol & 0x1; + for (FX_INT32 j = 0; j < CBC_PDF417Common::BARS_IN_MODULE; j++) { + FX_FLOAT size = 0.0f; + while ((currentSymbol & 0x1) == currentBit) { + size += 1.0f; + currentSymbol >>= 1; + } + currentBit = currentSymbol & 0x1; + RATIOS_TABLE[i][CBC_PDF417Common::BARS_IN_MODULE - j - 1] = size / CBC_PDF417Common::MODULES_IN_CODEWORD; + } + } +} +void CBC_PDF417CodewordDecoder::Finalize() +{ +} +FX_INT32 CBC_PDF417CodewordDecoder::getDecodedValue(CFX_Int32Array& moduleBitCount) +{ + CFX_Int32Array* array = sampleBitCounts(moduleBitCount); + FX_INT32 decodedValue = getDecodedCodewordValue(*array); + delete array; + if (decodedValue != -1) { + return decodedValue; + } + return getClosestDecodedValue(moduleBitCount); +} +CFX_Int32Array* CBC_PDF417CodewordDecoder::sampleBitCounts(CFX_Int32Array& moduleBitCount) +{ + FX_FLOAT bitCountSum = (FX_FLOAT)CBC_PDF417Common::getBitCountSum(moduleBitCount); + CFX_Int32Array* bitCount = FX_NEW CFX_Int32Array(); + bitCount->SetSize(CBC_PDF417Common::BARS_IN_MODULE); + FX_INT32 bitCountIndex = 0; + FX_INT32 sumPreviousBits = 0; + for (FX_INT32 i = 0; i < CBC_PDF417Common::MODULES_IN_CODEWORD; i++) { + FX_FLOAT sampleIndex = bitCountSum / (2 * CBC_PDF417Common::MODULES_IN_CODEWORD) + (i * bitCountSum) / CBC_PDF417Common::MODULES_IN_CODEWORD; + if (sumPreviousBits + moduleBitCount.GetAt(bitCountIndex) <= sampleIndex) { + sumPreviousBits += moduleBitCount.GetAt(bitCountIndex); + bitCountIndex++; + } + bitCount->SetAt(bitCountIndex, bitCount->GetAt(bitCountIndex) + 1); + } + return bitCount; +} +FX_INT32 CBC_PDF417CodewordDecoder::getDecodedCodewordValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 decodedValue = getBitValue(moduleBitCount); + return CBC_PDF417Common::getCodeword(decodedValue) == -1 ? -1 : decodedValue; +} +FX_INT32 CBC_PDF417CodewordDecoder::getBitValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT64 result = 0; + for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { + for (FX_INT32 bit = 0; bit < moduleBitCount.GetAt(i); bit++) { + result = (result << 1) | (i % 2 == 0 ? 1 : 0); + } + } + return (FX_INT32) result; +} +FX_INT32 CBC_PDF417CodewordDecoder::getClosestDecodedValue(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 bitCountSum = CBC_PDF417Common::getBitCountSum(moduleBitCount); + CFX_FloatArray bitCountRatios; + bitCountRatios.SetSize(CBC_PDF417Common::BARS_IN_MODULE); + for (FX_INT32 i = 0; i < bitCountRatios.GetSize(); i++) { + bitCountRatios[i] = moduleBitCount.GetAt(i) / (FX_FLOAT) bitCountSum; + } + FX_FLOAT bestMatchError = (FX_FLOAT)Float_MAX_VALUE; + FX_INT32 bestMatch = -1; + for (FX_INT32 j = 0; j < SYMBOL_TABLE_Length; j++) { + FX_FLOAT error = 0.0f; + for (FX_INT32 k = 0; k < CBC_PDF417Common::BARS_IN_MODULE; k++) { + FX_FLOAT diff = RATIOS_TABLE[j][k] - bitCountRatios[k]; + error += diff * diff; + } + if (error < bestMatchError) { + bestMatchError = error; + bestMatch = CBC_PDF417Common::SYMBOL_TABLE[j]; + } + } + return bestMatch; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h new file mode 100644 index 0000000000..da22683bfa --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417CODEWORDDECODER_H_ +#define _BC_PDF417CODEWORDDECODER_H_ +class CBC_PDF417Common; +class CBC_PDF417CodewordDecoder; +#define column 8 +class CBC_PDF417CodewordDecoder : public CFX_Object +{ +public: + CBC_PDF417CodewordDecoder(); + virtual ~CBC_PDF417CodewordDecoder(); + static void Initialize(); + static void Finalize(); + static FX_INT32 getDecodedValue(CFX_Int32Array& moduleBitCount); +private: + static FX_FLOAT RATIOS_TABLE[][8]; + static CFX_Int32Array* sampleBitCounts(CFX_Int32Array& moduleBitCount); + static FX_INT32 getDecodedCodewordValue(CFX_Int32Array& moduleBitCount); + static FX_INT32 getBitValue(CFX_Int32Array& moduleBitCount); + static FX_INT32 getClosestDecodedValue(CFX_Int32Array& moduleBitCount); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp new file mode 100644 index 0000000000..1f192e63a7 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.cpp @@ -0,0 +1,450 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +FX_INT32 CBC_PDF417Common::NUMBER_OF_CODEWORDS = 929; +FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1; +FX_INT32 CBC_PDF417Common::MIN_ROWS_IN_BARCODE = 3; +FX_INT32 CBC_PDF417Common::MAX_ROWS_IN_BARCODE = 90; +FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_ROW = 32; +FX_INT32 CBC_PDF417Common::MODULES_IN_CODEWORD = 17; +FX_INT32 CBC_PDF417Common::MODULES_IN_STOP_PATTERN = 18; +FX_INT32 CBC_PDF417Common::BARS_IN_MODULE = 8; +CFX_Int32Array* CBC_PDF417Common::EMPTY_INT_ARRAY = NULL; +FX_INT32 CBC_PDF417Common::SYMBOL_TABLE[] = { + 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, + 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, + 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, + 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, + 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, + 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, + 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, + 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, + 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, + 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, + 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, + 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, + 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, + 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, + 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, + 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, + 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, + 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, + 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, + 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, + 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, + 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, + 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, + 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, + 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, + 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, + 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, + 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, + 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, + 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, + 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, + 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, + 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, + 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, + 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, + 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, + 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, + 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, + 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, + 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, + 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, + 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, + 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, + 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, + 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, + 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, + 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, + 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, + 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, + 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, + 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, + 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, + 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, + 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, + 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, + 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, + 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, + 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, + 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, + 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, + 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, + 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, + 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, + 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, + 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, + 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, + 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, + 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, + 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, + 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, + 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, + 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, + 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, + 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, + 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, + 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, + 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, + 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, + 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, + 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, + 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, + 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, + 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, + 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, + 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, + 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, + 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, + 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, + 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, + 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, + 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, + 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, + 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, + 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, + 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, + 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, + 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, + 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, + 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, + 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, + 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, + 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, + 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, + 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, + 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, + 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, + 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, + 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, + 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, + 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, + 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, + 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, + 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, + 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, + 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, + 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, + 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, + 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, + 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, + 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, + 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, + 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, + 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, + 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, + 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, + 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, + 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, + 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, + 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, + 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, + 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, + 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, + 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, + 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, + 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, + 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, + 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, + 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, + 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, + 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, + 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, + 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, + 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, + 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, + 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, + 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, + 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, + 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, + 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, + 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, + 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, + 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, + 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, + 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, + 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, + 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, + 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, + 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, + 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, + 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, + 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, + 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, + 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, + 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, + 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, + 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, + 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, + 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, + 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, + 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, + 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, + 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, + 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, + 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, + 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, + 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, + 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, + 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, + 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, + 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, + 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, + 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, + 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, + 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, + 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, + 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, + 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, + 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, + 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, + 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, + 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, + 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, + 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, + 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, + 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, + 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, + 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, + 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, + 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, + 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, + 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, + 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, + 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, + 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, + 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, + 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, + 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, + 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, + 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, + 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, + 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, + 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, + 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, + 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, + 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, + 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, + 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, + 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, + 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, + 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, + 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, + 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, + 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, + 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, + 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, + 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, + 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, + 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, + 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, + 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, + 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, + 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, + 0x1fba8, 0x1fbb6, 0x1fbda +}; +FX_INT32 CBC_PDF417Common::CODEWORD_TABLE[] = { + 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, + 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, + 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, + 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, + 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, + 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, + 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, + 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, + 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, + 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, + 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, + 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, + 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, + 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, + 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, + 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, + 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, + 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, + 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, + 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, + 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, + 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, + 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, + 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, + 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, + 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, + 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, + 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, + 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, + 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, + 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, + 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, + 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, + 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, + 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, + 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, + 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, + 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, + 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, + 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, + 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, + 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, + 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, + 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, + 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, + 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, + 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, + 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, + 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, + 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, + 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, + 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, + 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, + 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, + 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, + 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, + 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, + 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, + 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, + 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, + 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, + 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, + 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, + 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, + 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, + 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, + 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, + 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, + 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, + 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, + 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, + 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, + 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, + 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, + 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, + 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, + 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, + 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, + 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, + 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, + 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, + 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, + 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, + 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, + 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, + 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, + 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, + 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, + 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, + 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, + 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, + 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, + 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, + 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, + 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, + 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, + 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, + 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, + 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, + 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, + 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, + 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, + 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, + 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, + 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, + 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, + 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, + 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, + 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, + 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, + 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, + 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, + 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, + 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, + 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, + 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, + 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, + 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, + 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, + 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, + 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, + 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, + 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, + 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, + 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, + 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, + 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, + 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, + 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, + 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, + 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, + 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, + 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, + 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, + 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, + 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, + 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, + 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, + 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, + 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700 +}; +CBC_PDF417Common::CBC_PDF417Common() +{ +} +CBC_PDF417Common::~CBC_PDF417Common() +{ +} +FX_INT32 CBC_PDF417Common::getBitCountSum(CFX_Int32Array& moduleBitCount) +{ + FX_INT32 bitCountSum = 0; + for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { + FX_INT32 count = moduleBitCount.GetAt(i); + bitCountSum += count; + } + return bitCountSum; +} +FX_INT32 CBC_PDF417Common::getCodeword(FX_DWORD symbol) +{ + FX_DWORD sym = symbol & 0x3FFFF; + FX_INT32 i = findCodewordIndex(sym); + if (i == -1) { + return -1; + } + return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS; +} +FX_INT32 CBC_PDF417Common::findCodewordIndex(FX_DWORD symbol) +{ + FX_INT32 first = 0; + FX_INT32 upto = sizeof(SYMBOL_TABLE) / sizeof(SYMBOL_TABLE[0]); + while (first < upto) { + FX_INT32 mid = ((FX_DWORD)(first + upto)) >> 1; + if (symbol < (FX_DWORD)SYMBOL_TABLE[mid]) { + upto = mid; + } else if (symbol > (FX_DWORD)SYMBOL_TABLE[mid]) { + first = mid + 1; + } else { + return mid; + } + } + return -1; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h new file mode 100644 index 0000000000..19e3fe57da --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Common.h @@ -0,0 +1,31 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417COMMON_H_ +#define _BC_PDF417COMMON_H_ +class CBC_PDF417Common; +class CBC_PDF417Common : public CFX_Object +{ +public: + CBC_PDF417Common(); + virtual ~CBC_PDF417Common(); + static FX_INT32 getBitCountSum(CFX_Int32Array& moduleBitCount); + static FX_INT32 getCodeword(FX_DWORD symbol); + static FX_INT32 NUMBER_OF_CODEWORDS; + static FX_INT32 MAX_CODEWORDS_IN_BARCODE; + static FX_INT32 MIN_ROWS_IN_BARCODE; + static FX_INT32 MAX_ROWS_IN_BARCODE; + static FX_INT32 MAX_CODEWORDS_IN_ROW; + static FX_INT32 MODULES_IN_CODEWORD; + static FX_INT32 MODULES_IN_STOP_PATTERN; + static FX_INT32 BARS_IN_MODULE; + static FX_INT32 SYMBOL_TABLE[]; + static FX_INT32 CODEWORD_TABLE[]; +private: + static CFX_Int32Array* EMPTY_INT_ARRAY; + static FX_INT32 findCodewordIndex(FX_DWORD symbol); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp new file mode 100644 index 0000000000..6ad8c1321f --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.cpp @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Compaction.h" +CBC_Compaction::CBC_Compaction() +{ +} +CBC_Compaction::~CBC_Compaction() +{ +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h new file mode 100644 index 0000000000..774a23fbdf --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_COMPACTION_H_ +#define _BC_COMPACTION_H_ +class CBC_Compaction; +enum Compaction { + AUTO, + TEXT, + BYTES, + NUMERIC +}; +class CBC_Compaction : public CFX_Object +{ +public: + CBC_Compaction(); + virtual ~CBC_Compaction(); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp new file mode 100644 index 0000000000..ae26057c3e --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.cpp @@ -0,0 +1,485 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "../barcode.h" +#include "../BC_DecoderResult.h" +#include "../common/BC_CommonDecoderResult.h" +#include "../../../../third_party/bigint/BigIntegerLibrary.hh" +#include "BC_PDF417ResultMetadata.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#define TEXT_COMPACTION_MODE_LATCH 900 +#define BYTE_COMPACTION_MODE_LATCH 901 +#define NUMERIC_COMPACTION_MODE_LATCH 902 +#define BYTE_COMPACTION_MODE_LATCH_6 924 +#define BEGIN_MACRO_PDF417_CONTROL_BLOCK 928 +#define BEGIN_MACRO_PDF417_OPTIONAL_FIELD 923 +#define MACRO_PDF417_TERMINATOR 922 +#define MODE_SHIFT_TO_BYTE_COMPACTION_MODE 913 + +FX_INT32 CBC_DecodedBitStreamPaser::MAX_NUMERIC_CODEWORDS = 15; +FX_INT32 CBC_DecodedBitStreamPaser::NUMBER_OF_SEQUENCE_CODEWORDS = 2; +FX_INT32 CBC_DecodedBitStreamPaser::PL = 25; +FX_INT32 CBC_DecodedBitStreamPaser::LL = 27; +FX_INT32 CBC_DecodedBitStreamPaser::AS = 27; +FX_INT32 CBC_DecodedBitStreamPaser::ML = 28; +FX_INT32 CBC_DecodedBitStreamPaser::AL = 28; +FX_INT32 CBC_DecodedBitStreamPaser::PS = 29; +FX_INT32 CBC_DecodedBitStreamPaser::PAL = 29; +FX_CHAR CBC_DecodedBitStreamPaser::PUNCT_CHARS[29] = { + ';', '<', '>', '@', '[', '\\', '}', '_', '`', '~', '!', + '\r', '\t', ',', ':', '\n', '-', '.', '$', '/', '"', '|', '*', + '(', ')', '?', '{', '}', '\'' +}; +FX_CHAR CBC_DecodedBitStreamPaser::MIXED_CHARS[30] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', + '\r', '\t', ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', + '=', '^' +}; +void CBC_DecodedBitStreamPaser::Initialize() +{ +} +void CBC_DecodedBitStreamPaser::Finalize() +{ +} +CBC_DecodedBitStreamPaser::CBC_DecodedBitStreamPaser() +{ +} +CBC_DecodedBitStreamPaser::~CBC_DecodedBitStreamPaser() +{ +} +CBC_CommonDecoderResult* CBC_DecodedBitStreamPaser::decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e) +{ + CFX_ByteString result; + FX_INT32 codeIndex = 1; + FX_INT32 code = codewords.GetAt(codeIndex); + codeIndex++; + CBC_PDF417ResultMetadata* resultMetadata = FX_NEW CBC_PDF417ResultMetadata; + while (codeIndex < codewords[0]) { + switch (code) { + case TEXT_COMPACTION_MODE_LATCH: + codeIndex = textCompaction(codewords, codeIndex, result); + break; + case BYTE_COMPACTION_MODE_LATCH: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case NUMERIC_COMPACTION_MODE_LATCH: + codeIndex = numericCompaction(codewords, codeIndex, result, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + break; + case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case BYTE_COMPACTION_MODE_LATCH_6: + codeIndex = byteCompaction(code, codewords, codeIndex, result); + break; + case BEGIN_MACRO_PDF417_CONTROL_BLOCK: + codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata, e); + if (e != BCExceptionNO) { + delete resultMetadata; + return NULL; + } + break; + default: + codeIndex--; + codeIndex = textCompaction(codewords, codeIndex, result); + break; + } + if (codeIndex < codewords.GetSize()) { + code = codewords[codeIndex++]; + } else { + e = BCExceptionFormatInstance; + delete resultMetadata; + return NULL; + } + } + if (result.GetLength() == 0) { + e = BCExceptionFormatInstance; + delete resultMetadata; + return NULL; + } + CFX_ByteArray rawBytes; + CFX_PtrArray byteSegments; + CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); + tempCd->Init(rawBytes, result, byteSegments, ecLevel, e); + if (e != BCExceptionNO) { + delete resultMetadata; + return NULL; + } + tempCd->setOther(resultMetadata); + return tempCd; +} +FX_INT32 CBC_DecodedBitStreamPaser::decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e) +{ + if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { + e = BCExceptionFormatInstance; + return -1; + } + CFX_Int32Array segmentIndexArray; + segmentIndexArray.SetSize(NUMBER_OF_SEQUENCE_CODEWORDS); + for (FX_INT32 i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { + segmentIndexArray.SetAt(i, codewords[codeIndex]); + } + CFX_ByteString str = decodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + resultMetadata->setSegmentIndex(atoi(str.GetBuffer(str.GetLength()))); + CFX_ByteString fileId; + codeIndex = textCompaction(codewords, codeIndex, fileId); + resultMetadata->setFileId(fileId); + if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { + codeIndex++; + CFX_Int32Array additionalOptionCodeWords; + additionalOptionCodeWords.SetSize(codewords[0] - codeIndex); + FX_INT32 additionalOptionCodeWordsIndex = 0; + FX_BOOL end = FALSE; + while ((codeIndex < codewords[0]) && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code; + } else { + switch (code) { + case MACRO_PDF417_TERMINATOR: + resultMetadata->setLastSegment(TRUE); + codeIndex++; + end = TRUE; + break; + default: + e = BCExceptionFormatInstance; + return -1; + } + } + } + CFX_Int32Array array; + array.SetSize(additionalOptionCodeWordsIndex); + array.Copy(additionalOptionCodeWords); + resultMetadata->setOptionalData(array); + } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) { + resultMetadata->setLastSegment(TRUE); + codeIndex++; + } + return codeIndex; +} +FX_INT32 CBC_DecodedBitStreamPaser::textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) +{ + CFX_Int32Array textCompactionData; + textCompactionData.SetSize((codewords[0] - codeIndex) << 1); + CFX_Int32Array byteCompactionData; + byteCompactionData.SetSize((codewords[0] - codeIndex) << 1); + FX_INT32 index = 0; + FX_BOOL end = FALSE; + while ((codeIndex < codewords[0]) && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + textCompactionData[index] = code / 30; + textCompactionData[index + 1] = code % 30; + index += 2; + } else { + switch (code) { + case TEXT_COMPACTION_MODE_LATCH: + textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; + break; + case BYTE_COMPACTION_MODE_LATCH: + codeIndex--; + end = TRUE; + break; + case NUMERIC_COMPACTION_MODE_LATCH: + codeIndex--; + end = TRUE; + break; + case BEGIN_MACRO_PDF417_CONTROL_BLOCK: + codeIndex--; + end = TRUE; + break; + case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: + codeIndex--; + end = TRUE; + break; + case MACRO_PDF417_TERMINATOR: + codeIndex--; + end = TRUE; + break; + case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; + code = codewords[codeIndex++]; + byteCompactionData[index] = code; + index++; + break; + case BYTE_COMPACTION_MODE_LATCH_6: + codeIndex--; + end = TRUE; + break; + } + } + } + decodeTextCompaction(textCompactionData, byteCompactionData, index, result); + return codeIndex; +} +void CBC_DecodedBitStreamPaser::decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result) +{ + Mode subMode = ALPHA; + Mode priorToShiftMode = ALPHA; + FX_INT32 i = 0; + while (i < length) { + FX_INT32 subModeCh = textCompactionData[i]; + FX_CHAR ch = 0; + switch (subMode) { + case ALPHA: + if (subModeCh < 26) { + ch = (FX_CHAR) ('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == LL) { + subMode = LOWER; + } else if (subModeCh == ML) { + subMode = MIXED; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case LOWER: + if (subModeCh < 26) { + ch = (FX_CHAR) ('a' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == AS) { + priorToShiftMode = subMode; + subMode = ALPHA_SHIFT; + } else if (subModeCh == ML) { + subMode = MIXED; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case MIXED: + if (subModeCh < PL) { + ch = MIXED_CHARS[subModeCh]; + } else { + if (subModeCh == PL) { + subMode = PUNCT; + } else if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == LL) { + subMode = LOWER; + } else if (subModeCh == AL) { + subMode = ALPHA; + } else if (subModeCh == PS) { + priorToShiftMode = subMode; + subMode = PUNCT_SHIFT; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case PUNCT: + if (subModeCh < PAL) { + ch = PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == PAL) { + subMode = ALPHA; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case ALPHA_SHIFT: + subMode = priorToShiftMode; + if (subModeCh < 26) { + ch = (FX_CHAR) ('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + case PUNCT_SHIFT: + subMode = priorToShiftMode; + if (subModeCh < PAL) { + ch = PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == PAL) { + subMode = ALPHA; + } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + result += (FX_CHAR) byteCompactionData[i]; + } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { + subMode = ALPHA; + } + } + break; + } + if (ch != 0) { + result += ch; + } + i++; + } +} +FX_INT32 CBC_DecodedBitStreamPaser::byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) +{ + if (mode == BYTE_COMPACTION_MODE_LATCH) { + FX_INT32 count = 0; + FX_INT64 value = 0; + FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); + CFX_Int32Array byteCompactedCodewords; + byteCompactedCodewords.SetSize(6); + FX_BOOL end = FALSE; + FX_INT32 nextCode = codewords[codeIndex++]; + while ((codeIndex < codewords[0]) && !end) { + byteCompactedCodewords[count++] = nextCode; + value = 900 * value + nextCode; + nextCode = codewords[codeIndex++]; + if (nextCode == TEXT_COMPACTION_MODE_LATCH || + nextCode == BYTE_COMPACTION_MODE_LATCH || + nextCode == NUMERIC_COMPACTION_MODE_LATCH || + nextCode == BYTE_COMPACTION_MODE_LATCH_6 || + nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + nextCode == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } else { + if ((count % 5 == 0) && (count > 0)) { + FX_INT32 j = 0; + for (; j < 6; ++j) { + decodedData[5 - j] = (FX_WORD) (value % 256); + value >>= 8; + } + for (j = 0; j < 6; ++j) { + result += (FX_CHAR)decodedData[j]; + } + count = 0; + } + } + } + FX_Free(decodedData); + if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) { + byteCompactedCodewords[count++] = nextCode; + } + for (FX_INT32 i = 0; i < count; i++) { + result += (FX_CHAR)(FX_WORD) byteCompactedCodewords[i]; + } + } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { + FX_INT32 count = 0; + FX_INT64 value = 0; + FX_BOOL end = FALSE; + while (codeIndex < codewords[0] && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (code < TEXT_COMPACTION_MODE_LATCH) { + count++; + value = 900 * value + code; + } else { + if (code == TEXT_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH || + code == NUMERIC_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH_6 || + code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } + } + if ((count % 5 == 0) && (count > 0)) { + FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); + FX_INT32 j = 0; + for (; j < 6; ++j) { + decodedData[5 - j] = (FX_WORD) (value & 0xFF); + value >>= 8; + } + for (j = 0; j < 6; ++j) { + result += (FX_CHAR)decodedData[j]; + } + count = 0; + FX_Free(decodedData); + } + } + } + return codeIndex; +} +FX_INT32 CBC_DecodedBitStreamPaser::numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e) +{ + FX_INT32 count = 0; + FX_BOOL end = FALSE; + CFX_Int32Array numericCodewords; + numericCodewords.SetSize(MAX_NUMERIC_CODEWORDS); + while (codeIndex < codewords[0] && !end) { + FX_INT32 code = codewords[codeIndex++]; + if (codeIndex == codewords[0]) { + end = TRUE; + } + if (code < TEXT_COMPACTION_MODE_LATCH) { + numericCodewords[count] = code; + count++; + } else { + if (code == TEXT_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH || + code == BYTE_COMPACTION_MODE_LATCH_6 || + code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = TRUE; + } + } + if (count % MAX_NUMERIC_CODEWORDS == 0 || + code == NUMERIC_COMPACTION_MODE_LATCH || + end) { + CFX_ByteString s = decodeBase900toBase10(numericCodewords, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + result += s; + count = 0; + } + } + return codeIndex; +} +CFX_ByteString CBC_DecodedBitStreamPaser::decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e) +{ + BigInteger result = 0; + BigInteger nineHundred(900); + for (FX_INT32 i = 0; i < count; i++) { + result = result * nineHundred + BigInteger(codewords[i]); + } + CFX_ByteString resultString(bigIntegerToString(result).c_str()); + if (resultString.GetAt(0) != '1') { + e = BCExceptionFormatInstance; + return ' '; + } + return resultString.Mid(1, resultString.GetLength() - 1); +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h new file mode 100644 index 0000000000..64ae2aee53 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h @@ -0,0 +1,48 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DECODEDBITSTREAMPARSER_H_ +#define _BC_DECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_PDF417ResultMetadata; +class CBC_DecodedBitStreamPaser; +class CBC_DecodedBitStreamPaser : public CFX_Object +{ +public: + CBC_DecodedBitStreamPaser(); + virtual ~CBC_DecodedBitStreamPaser(); + static void Initialize(); + static void Finalize(); + static CBC_CommonDecoderResult* decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e); + +private: + enum Mode { + ALPHA, + LOWER, + MIXED, + PUNCT, + ALPHA_SHIFT, + PUNCT_SHIFT + }; + static FX_INT32 MAX_NUMERIC_CODEWORDS; + static FX_INT32 PL; + static FX_INT32 LL; + static FX_INT32 AS; + static FX_INT32 ML; + static FX_INT32 AL; + static FX_INT32 PS; + static FX_INT32 PAL; + static FX_CHAR PUNCT_CHARS[29]; + static FX_CHAR MIXED_CHARS[30]; + static FX_INT32 NUMBER_OF_SEQUENCE_CODEWORDS; + static FX_INT32 decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e); + static FX_INT32 textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); + static void decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result); + static FX_INT32 byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); + static FX_INT32 numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e); + static CFX_ByteString decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp new file mode 100644 index 0000000000..af316f7660 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.cpp @@ -0,0 +1,283 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Codeword.h" +#include "BC_PDF417BarcodeMetadata.h" +#include "BC_PDF417BoundingBox.h" +#include "BC_PDF417DetectionResultColumn.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "BC_PDF417DetectionResult.h" +FX_INT32 CBC_DetectionResult::ADJUST_ROW_NUMBER_SKIP = 2; +CBC_DetectionResult::CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox) +{ + m_barcodeMetadata = barcodeMetadata; + m_barcodeColumnCount = barcodeMetadata->getColumnCount(); + m_boundingBox = boundingBox; + m_detectionResultColumns.SetSize(m_barcodeColumnCount + 2); + for (FX_INT32 i = 0; i < m_barcodeColumnCount + 2; i++) { + m_detectionResultColumns[i] = NULL; + } +} +CBC_DetectionResult::~CBC_DetectionResult() +{ + delete m_boundingBox; + delete m_barcodeMetadata; + m_detectionResultColumns.RemoveAll(); +} +CFX_PtrArray& CBC_DetectionResult::getDetectionResultColumns() +{ + adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0)); + adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1)); + FX_INT32 unadjustedCodewordCount = CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE; + FX_INT32 previousUnadjustedCount; + do { + previousUnadjustedCount = unadjustedCodewordCount; + unadjustedCodewordCount = adjustRowNumbers(); + } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); + return m_detectionResultColumns; +} +void CBC_DetectionResult::setBoundingBox(CBC_BoundingBox* boundingBox) +{ + m_boundingBox = boundingBox; +} +CBC_BoundingBox* CBC_DetectionResult::getBoundingBox() +{ + return m_boundingBox; +} +void CBC_DetectionResult::setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn) +{ + m_detectionResultColumns[barcodeColumn] = detectionResultColumn; +} +CBC_DetectionResultColumn* CBC_DetectionResult::getDetectionResultColumn(FX_INT32 barcodeColumn) +{ + return (CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn]; +} +CFX_ByteString CBC_DetectionResult::toString() +{ + CBC_DetectionResultColumn* rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[0]; + if (rowIndicatorColumn == NULL) { + rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1]; + } + CFX_ByteString result; + for (FX_INT32 codewordsRow = 0; codewordsRow < rowIndicatorColumn->getCodewords()->GetSize(); codewordsRow++) { + result += (FX_CHAR) codewordsRow; + for (FX_INT32 barcodeColumn = 0; barcodeColumn < m_barcodeColumnCount + 2; barcodeColumn++) { + if (m_detectionResultColumns[barcodeColumn] == NULL) { + result += " | "; + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword == NULL) { + result += " | "; + continue; + } + result += codeword->getRowNumber(); + result += codeword->getValue(); + } + } + return result; +} +void CBC_DetectionResult::adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn) +{ + if (detectionResultColumn != NULL) { + ((CBC_DetectionResultRowIndicatorColumn*)detectionResultColumn)->adjustCompleteIndicatorColumnRowNumbers(*m_barcodeMetadata); + } +} +FX_INT32 CBC_DetectionResult::adjustRowNumbers() +{ + FX_INT32 unadjustedCount = adjustRowNumbersByRow(); + if (unadjustedCount == 0) { + return 0; + } + for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1; barcodeColumn++) { + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + if (!((CBC_Codeword*)codewords->GetAt(codewordsRow))->hasValidRowNumber()) { + adjustRowNumbers(barcodeColumn, codewordsRow, codewords); + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersByRow() +{ + adjustRowNumbersFromBothRI(); + FX_INT32 unadjustedCount = adjustRowNumbersFromLRI(); + return unadjustedCount + adjustRowNumbersFromRRI(); +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromBothRI() +{ + if (m_detectionResultColumns[0] == NULL || m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { + return 0; + } + CFX_PtrArray* LRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[0])->getCodewords(); + CFX_PtrArray* RRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1])->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < LRIcodewords->GetSize(); codewordsRow++) { + if (LRIcodewords->GetAt(codewordsRow) != NULL && + RRIcodewords->GetAt(codewordsRow) != NULL && + ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber() == ((CBC_Codeword*)RRIcodewords->GetAt(codewordsRow))->getRowNumber()) { + for (FX_INT32 barcodeColumn = 1; barcodeColumn <= m_barcodeColumnCount; barcodeColumn++) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword == NULL) { + continue; + } + codeword->setRowNumber(((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber()); + if (!codeword->hasValidRowNumber()) { + ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->SetAt(codewordsRow, NULL); + } + } + } + } + return 0; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromRRI() +{ + if (m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { + return 0; + } + FX_INT32 unadjustedCount = 0; + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*) m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1))->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); + FX_INT32 invalidRowCounts = 0; + for (FX_INT32 barcodeColumn = m_barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn))->getCodewords()->GetAt(codewordsRow); + if (codeword != NULL) { + invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); + if (!codeword->hasValidRowNumber()) { + unadjustedCount++; + } + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumbersFromLRI() +{ + if (m_detectionResultColumns[0] == NULL) { + return 0; + } + FX_INT32 unadjustedCount = 0; + CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0))->getCodewords(); + for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); + FX_INT32 invalidRowCounts = 0; + for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { + CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); + if (codeword != NULL) { + invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); + if (!codeword->hasValidRowNumber()) { + unadjustedCount++; + } + } + } + } + return unadjustedCount; +} +FX_INT32 CBC_DetectionResult::adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword) +{ + if (codeword == NULL) { + return invalidRowCounts; + } + if (!codeword->hasValidRowNumber()) { + if (codeword->isValidRowNumber(rowIndicatorRowNumber)) { + codeword->setRowNumber(rowIndicatorRowNumber); + invalidRowCounts = 0; + } else { + ++invalidRowCounts; + } + } + return invalidRowCounts; +} +void CBC_DetectionResult::adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords) +{ + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + CFX_PtrArray* previousColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn - 1))->getCodewords(); + CFX_PtrArray* nextColumnCodewords = previousColumnCodewords; + if (m_detectionResultColumns[barcodeColumn + 1] != NULL) { + nextColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn + 1])->getCodewords(); + } + CFX_PtrArray otherCodewords; + otherCodewords.SetSize(14); + otherCodewords[2] = previousColumnCodewords->GetAt(codewordsRow); + otherCodewords[3] = nextColumnCodewords->GetAt(codewordsRow); + if (codewordsRow > 0) { + otherCodewords[0] = codewords->GetAt(codewordsRow - 1); + otherCodewords[4] = previousColumnCodewords->GetAt(codewordsRow - 1); + otherCodewords[5] = nextColumnCodewords->GetAt(codewordsRow - 1); + } + if (codewordsRow > 1) { + otherCodewords[8] = codewords->GetAt(codewordsRow - 2); + otherCodewords[10] = previousColumnCodewords->GetAt(codewordsRow - 2); + otherCodewords[11] = nextColumnCodewords->GetAt(codewordsRow - 2); + } + if (codewordsRow < codewords->GetSize() - 1) { + otherCodewords[1] = codewords->GetAt(codewordsRow + 1); + otherCodewords[6] = previousColumnCodewords->GetAt(codewordsRow + 1); + otherCodewords[7] = nextColumnCodewords->GetAt(codewordsRow + 1); + } + if (codewordsRow < codewords->GetSize() - 2) { + otherCodewords[9] = codewords->GetAt(codewordsRow + 2); + otherCodewords[12] = previousColumnCodewords->GetAt(codewordsRow + 2); + otherCodewords[13] = nextColumnCodewords->GetAt(codewordsRow + 2); + } + for (FX_INT32 i = 0; i < otherCodewords.GetSize(); i++) { + CBC_Codeword* otherCodeword = (CBC_Codeword*)otherCodewords.GetAt(i); + if (adjustRowNumber(codeword, otherCodeword)) { + return; + } + } +} +FX_BOOL CBC_DetectionResult::adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword) +{ + if (otherCodeword == NULL) { + return FALSE; + } + if (otherCodeword->hasValidRowNumber() && otherCodeword->getBucket() == codeword->getBucket()) { + codeword->setRowNumber(otherCodeword->getRowNumber()); + return TRUE; + } + return FALSE; +} +FX_INT32 CBC_DetectionResult::getBarcodeColumnCount() +{ + return m_barcodeColumnCount; +} +FX_INT32 CBC_DetectionResult::getBarcodeRowCount() +{ + return m_barcodeMetadata->getRowCount(); +} +FX_INT32 CBC_DetectionResult::getBarcodeECLevel() +{ + return m_barcodeMetadata->getErrorCorrectionLevel(); +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h new file mode 100644 index 0000000000..9c3401459b --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResult.h @@ -0,0 +1,48 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_EDTECTIONRESULT_H_ +#define _BC_EDTECTIONRESULT_H_ +class CBC_BarcodeMetadata; +class CBC_BoundingBox; +class CBC_Codeword; +class CBC_DetectionResultColumn; +class CBC_DetectionResult; +class CBC_DetectionResult : public CFX_Object +{ +public: + CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox); + virtual ~CBC_DetectionResult(); + CFX_PtrArray& getDetectionResultColumns(); + void setBoundingBox(CBC_BoundingBox* boundingBox); + CBC_BoundingBox* getBoundingBox(); + void setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn); + CBC_DetectionResultColumn* getDetectionResultColumn(FX_INT32 barcodeColumn); + CFX_ByteString toString(); + + FX_INT32 getBarcodeColumnCount(); + FX_INT32 getBarcodeRowCount(); + FX_INT32 getBarcodeECLevel(); +private: + static FX_INT32 ADJUST_ROW_NUMBER_SKIP; + CBC_BarcodeMetadata* m_barcodeMetadata; + CFX_PtrArray m_detectionResultColumns; + CBC_BoundingBox* m_boundingBox; + FX_INT32 m_barcodeColumnCount; +private: + void adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn); + FX_INT32 adjustRowNumbers(); + FX_INT32 adjustRowNumbersByRow(); + FX_INT32 adjustRowNumbersFromBothRI(); + FX_INT32 adjustRowNumbersFromRRI(); + FX_INT32 adjustRowNumbersFromLRI(); + static FX_INT32 adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword); + void adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords); + static FX_BOOL adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword); + + +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp new file mode 100644 index 0000000000..6d949b7640 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp @@ -0,0 +1,107 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Codeword.h" +#include "BC_PDF417BoundingBox.h" +#include "BC_PDF417DetectionResultColumn.h" +FX_INT32 CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5; +CBC_DetectionResultColumn::CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox) +{ + m_boundingBox = boundingBox; + m_codewords = FX_NEW CFX_PtrArray; + m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1); +} +CBC_DetectionResultColumn::~CBC_DetectionResultColumn() +{ + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + delete (CBC_Codeword*)m_codewords->GetAt(i); + } + m_codewords->RemoveAll(); + delete m_codewords; +} +CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(FX_INT32 imageRow) +{ + CBC_Codeword* codeword = getCodeword(imageRow); + if (codeword != NULL) { + return codeword; + } + for (FX_INT32 i = 1; i < MAX_NEARBY_DISTANCE; i++) { + FX_INT32 nearImageRow = imageRowToCodewordIndex(imageRow) - i; + if (nearImageRow >= 0) { + codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); + if (codeword != NULL) { + return codeword; + } + } + nearImageRow = imageRowToCodewordIndex(imageRow) + i; + if (nearImageRow < m_codewords->GetSize()) { + codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); + if (codeword != NULL) { + return codeword; + } + } + } + return NULL; +} +FX_INT32 CBC_DetectionResultColumn::imageRowToCodewordIndex(FX_INT32 imageRow) +{ + return imageRow - m_boundingBox->getMinY(); +} +FX_INT32 CBC_DetectionResultColumn::codewordIndexToImageRow(FX_INT32 codewordIndex) +{ + return m_boundingBox->getMinY() + codewordIndex; +} +void CBC_DetectionResultColumn::setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword) +{ + m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword); +} +CBC_Codeword* CBC_DetectionResultColumn::getCodeword(FX_INT32 imageRow) +{ + return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow)); +} +CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() +{ + return m_boundingBox; +} +CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() +{ + return m_codewords; +} +CFX_ByteString CBC_DetectionResultColumn::toString() +{ + CFX_ByteString result; + FX_INT32 row = 0; + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i); + if (codeword == NULL) { + result += (FX_CHAR) row; + row++; + continue; + } + result += (FX_CHAR) row; + result += codeword->getRowNumber(); + result += codeword->getValue(); + row++; + } + return result; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h new file mode 100644 index 0000000000..eddc3bce6d --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h @@ -0,0 +1,31 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DETECTIONRESULTCOLUMN_H_ +#define _BC_DETECTIONRESULTCOLUMN_H_ +class CBC_Codeword; +class CBC_BoundingBox; +class CBC_DetectionResultColumn; +class CBC_DetectionResultColumn : public CFX_Object +{ +public: + CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox); + virtual ~CBC_DetectionResultColumn(); + CBC_Codeword* getCodewordNearby(FX_INT32 imageRow); + FX_INT32 imageRowToCodewordIndex(FX_INT32 imageRow); + FX_INT32 codewordIndexToImageRow(FX_INT32 codewordIndex); + void setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword); + CBC_Codeword* getCodeword(FX_INT32 imageRow); + CBC_BoundingBox* getBoundingBox(); + CFX_PtrArray* getCodewords(); + CFX_ByteString toString(); +public: + CBC_BoundingBox* m_boundingBox; + CFX_PtrArray* m_codewords; +private: + static FX_INT32 MAX_NEARBY_DISTANCE; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp new file mode 100644 index 0000000000..89e46a74cd --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp @@ -0,0 +1,241 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "BC_PDF417BarcodeMetadata.h" +#include "BC_PDF417BoundingBox.h" +#include "BC_PDF417Codeword.h" +#include "BC_PDF417BarcodeValue.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417DetectionResultColumn.h" +#include "BC_PDF417DetectionResultRowIndicatorColumn.h" +CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft) + : CBC_DetectionResultColumn(boundingBox) +{ + m_isLeft = isLeft; +} +CBC_DetectionResultRowIndicatorColumn::~CBC_DetectionResultRowIndicatorColumn() +{ +} +void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() +{ + for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { + CBC_Codeword * codeword = (CBC_Codeword*)m_codewords->GetAt(i); + if (codeword != NULL) { + codeword->setRowNumberAsRowIndicatorColumn(); + } + } +} +FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) +{ + CFX_PtrArray* codewords = getCodewords(); + setRowNumbers(); + removeIncorrectCodewords(codewords, barcodeMetadata); + CBC_BoundingBox* boundingBox = getBoundingBox(); + CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); + CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); + FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); + FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); + FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); + FX_INT32 barcodeRow = -1; + FX_INT32 maxRowHeight = 1; + FX_INT32 currentRowHeight = 0; + for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; + currentRowHeight = 1; + barcodeRow = codeword->getRowNumber(); + } else if (rowDifference < 0) { + codewords->SetAt(codewordsRow, NULL); + } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordsRow, NULL); + } else if (rowDifference > codewordsRow) { + codewords->SetAt(codewordsRow, NULL); + } else { + FX_INT32 checkedRows; + if (maxRowHeight > 2) { + checkedRows = (maxRowHeight - 2) * rowDifference; + } else { + checkedRows = rowDifference; + } + FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; + for (FX_INT32 i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { + closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL; + } + if (closePreviousCodewordFound) { + codewords->SetAt(codewordsRow, NULL); + } else { + barcodeRow = codeword->getRowNumber(); + currentRowHeight = 1; + } + } + } + return (FX_INT32) (averageRowHeight + 0.5); +} +CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights(FX_INT32 &e) +{ + CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(); + if (barcodeMetadata == NULL) { + e = BCExceptionCannotMetadata; + return NULL; + } + adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(barcodeMetadata->getRowCount()); + for (FX_INT32 i = 0; i < getCodewords()->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i); + if (codeword != NULL) { + result->SetAt(codeword->getRowNumber(), result->GetAt(codeword->getRowNumber()) + 1); + } + } + return result; +} +FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) +{ + CBC_BoundingBox* boundingBox = getBoundingBox(); + CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); + CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); + FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); + FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); + FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); + CFX_PtrArray* codewords = getCodewords(); + FX_INT32 barcodeRow = -1; + FX_INT32 maxRowHeight = 1; + FX_INT32 currentRowHeight = 0; + for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (codewords->GetAt(codewordsRow) == NULL) { + continue; + } + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); + codeword->setRowNumberAsRowIndicatorColumn(); + FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; + currentRowHeight = 1; + barcodeRow = codeword->getRowNumber(); + } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordsRow, NULL); + } else { + barcodeRow = codeword->getRowNumber(); + currentRowHeight = 1; + } + } + return (FX_INT32) (averageRowHeight + 0.5); +} +CBC_BarcodeMetadata* CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() +{ + CFX_PtrArray* codewords = getCodewords(); + CBC_BarcodeValue barcodeColumnCount; + CBC_BarcodeValue barcodeRowCountUpperPart; + CBC_BarcodeValue barcodeRowCountLowerPart; + CBC_BarcodeValue barcodeECLevel; + for (FX_INT32 i = 0; i < codewords->GetSize(); i++) { + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i); + if (codeword == NULL) { + continue; + } + codeword->setRowNumberAsRowIndicatorColumn(); + FX_INT32 rowIndicatorValue = codeword->getValue() % 30; + FX_INT32 codewordRowNumber = codeword->getRowNumber(); + if (!m_isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); + break; + case 1: + barcodeECLevel.setValue(rowIndicatorValue / 3); + barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); + break; + case 2: + barcodeColumnCount.setValue(rowIndicatorValue + 1); + break; + } + } + if ((barcodeColumnCount.getValue()->GetSize() == 0) || + (barcodeRowCountUpperPart.getValue()->GetSize() == 0) || + (barcodeRowCountLowerPart.getValue()->GetSize() == 0) || + (barcodeECLevel.getValue()->GetSize() == 0) || + barcodeColumnCount.getValue()->GetAt(0) < 1 || + barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) < CBC_PDF417Common::MIN_ROWS_IN_BARCODE || + barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) > CBC_PDF417Common::MAX_ROWS_IN_BARCODE) { + return NULL; + } + CBC_BarcodeMetadata* barcodeMetadata = FX_NEW CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0), barcodeRowCountUpperPart.getValue()->GetAt(0), barcodeRowCountLowerPart.getValue()->GetAt(0), barcodeECLevel.getValue()->GetAt(0)); + removeIncorrectCodewords(codewords, *barcodeMetadata); + return barcodeMetadata; +} +FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() +{ + return m_isLeft; +} +CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() +{ + return (CFX_ByteString)"IsLeft: " + (CFX_ByteString)m_isLeft + '\n' + CBC_DetectionResultColumn::toString(); +} +void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata) +{ + for (FX_INT32 codewordRow = 0; codewordRow < codewords->GetSize(); codewordRow++) { + CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow); + if (codeword == NULL) { + continue; + } + FX_INT32 rowIndicatorValue = codeword->getValue() % 30; + FX_INT32 codewordRowNumber = codeword->getRowNumber(); + if (codewordRowNumber > barcodeMetadata.getRowCount()) { + codewords->SetAt(codewordRow, NULL); + continue; + } + if (!m_isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + if (rowIndicatorValue * 3 + 1 != barcodeMetadata.getRowCountUpperPart()) { + codewords->SetAt(codewordRow, NULL); + } + break; + case 1: + if (rowIndicatorValue / 3 != barcodeMetadata.getErrorCorrectionLevel() || + rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { + codewords->SetAt(codewordRow, NULL); + } + break; + case 2: + if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { + codewords->SetAt(codewordRow, NULL); + } + break; + } + } +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h new file mode 100644 index 0000000000..fbdd0f0ec4 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h @@ -0,0 +1,28 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ +#define _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ +class CBC_BarcodeMetadata; +class CBC_BoundingBox; +class CBC_DetectionResultRowIndicatorColumn; +class CBC_DetectionResultRowIndicatorColumn : public CBC_DetectionResultColumn +{ +public: + CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft); + virtual ~CBC_DetectionResultRowIndicatorColumn(); + void setRowNumbers(); + FX_INT32 adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); + CFX_Int32Array* getRowHeights(FX_INT32 &e); + FX_INT32 adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); + CBC_BarcodeMetadata* getBarcodeMetadata(); + FX_BOOL isLeft(); + CFX_ByteString toString(); +private: + FX_BOOL m_isLeft; + void removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp new file mode 100644 index 0000000000..8d1a86ec92 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.cpp @@ -0,0 +1,311 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../BC_BinaryBitmap.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/BC_CommonBitArray.h" +#include "BC_PDF417DetectorResult.h" +#include "BC_PDF417Detector.h" +#define INTERGER_MAX 2147483647 +FX_INT32 CBC_Detector::INDEXES_START_PATTERN[] = {0, 4, 1, 5}; +FX_INT32 CBC_Detector::INDEXES_STOP_PATTERN[] = {6, 2, 7, 3}; +FX_INT32 CBC_Detector::INTEGER_MATH_SHIFT = 8; +FX_INT32 CBC_Detector::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; +FX_INT32 CBC_Detector::MAX_AVG_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f); +FX_INT32 CBC_Detector::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f); +FX_INT32 CBC_Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3}; +FX_INT32 CBC_Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1}; +FX_INT32 CBC_Detector::MAX_PIXEL_DRIFT = 3; +FX_INT32 CBC_Detector::MAX_PATTERN_DRIFT = 5; +FX_INT32 CBC_Detector::SKIPPED_ROW_COUNT_MAX = 25; +FX_INT32 CBC_Detector::ROW_STEP = 5; +FX_INT32 CBC_Detector::BARCODE_MIN_HEIGHT = 10; +CBC_Detector::CBC_Detector() +{ +} +CBC_Detector::~CBC_Detector() +{ +} +CBC_PDF417DetectorResult* CBC_Detector::detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e) +{ + CBC_CommonBitMatrix* bitMatrix = image->GetBlackMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray* barcodeCoordinates = detect(multiple, bitMatrix); + if (barcodeCoordinates->GetSize() == 0) { + rotate180(bitMatrix); + barcodeCoordinates = detect(multiple, bitMatrix); + } + if (barcodeCoordinates->GetSize() == 0) { + e = BCExceptionUnSupportedBarcode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_PDF417DetectorResult* detectorResult = FX_NEW CBC_PDF417DetectorResult(bitMatrix, barcodeCoordinates); + return detectorResult; +} +void CBC_Detector::rotate180(CBC_CommonBitMatrix* bitMatrix) +{ + FX_INT32 width = bitMatrix->GetWidth(); + FX_INT32 height = bitMatrix->GetHeight(); + CBC_CommonBitArray* firstRowBitArray = FX_NEW CBC_CommonBitArray(width); + CBC_CommonBitArray* secondRowBitArray = FX_NEW CBC_CommonBitArray(width); + CBC_CommonBitArray* tmpBitArray = FX_NEW CBC_CommonBitArray(width); + for (FX_INT32 y = 0; y < (height + 1) >> 1; y++) { + CBC_CommonBitArray* temp = bitMatrix->GetRow(height - 1 - y, secondRowBitArray); + CBC_CommonBitArray* tempfirstRow = firstRowBitArray; + firstRowBitArray = bitMatrix->GetRow(y, tempfirstRow); + delete tempfirstRow; + CBC_CommonBitArray* row = mirror(temp, tmpBitArray); + delete temp; + bitMatrix->SetRow(y, row); + delete row; + CBC_CommonBitArray* rowfirstRow = mirror(firstRowBitArray, tmpBitArray); + bitMatrix->SetRow(height - 1 - y, rowfirstRow); + delete rowfirstRow; + } + delete tmpBitArray; + delete firstRowBitArray; + delete secondRowBitArray; +} +CBC_CommonBitArray* CBC_Detector::mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result) +{ + CBC_CommonBitArray* array = FX_NEW CBC_CommonBitArray(result->GetSize()); + array->Clear(); + FX_INT32 size = input->GetSize(); + for (FX_INT32 i = 0; i < size; i++) { + if (input->Get(i)) { + array->Set(size - 1 - i); + } + } + return array; +} +CFX_PtrArray* CBC_Detector::detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix) +{ + CFX_PtrArray* barcodeCoordinates = FX_NEW CFX_PtrArray; + FX_INT32 row = 0; + FX_INT32 column = 0; + FX_BOOL foundBarcodeInRow = FALSE; + while (row < bitMatrix->GetHeight()) { + CFX_PtrArray* vertices = findVertices(bitMatrix, row, column); + if (vertices->GetAt(0) == NULL && vertices->GetAt(3) == NULL) { + if (!foundBarcodeInRow) { + if (vertices) { + delete(vertices); + } + break; + } + foundBarcodeInRow = FALSE; + column = 0; + for (FX_INT32 i = 0; i < barcodeCoordinates->GetSize(); i++) { + CFX_PtrArray* barcodeCoordinate = (CFX_PtrArray*)barcodeCoordinates->GetAt(i); + if (barcodeCoordinate->GetAt(1) != NULL) { + row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY(); + } + if (barcodeCoordinate->GetAt(3) != NULL) { + row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY(); + } + } + row += ROW_STEP; + if (vertices) { + delete(vertices); + } + continue; + } + foundBarcodeInRow = TRUE; + barcodeCoordinates->Add(vertices); + if (!multiple) { + break; + } + if (vertices->GetAt(2) != NULL) { + column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetX(); + row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetY(); + } else { + column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetX(); + row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetY(); + } + } + return barcodeCoordinates; +} +CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn) +{ + FX_INT32 height = matrix->GetHeight(); + FX_INT32 width = matrix->GetWidth(); + CFX_PtrArray* result = FX_NEW CFX_PtrArray; + result->SetSize(8); + CFX_PtrArray* startptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN, sizeof(START_PATTERN) / sizeof(START_PATTERN[0])); + copyToResult(result, startptr, INDEXES_START_PATTERN, sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0])); + startptr->RemoveAll(); + delete startptr; + if (result->GetAt(4) != NULL) { + startColumn = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetX(); + startRow = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetY(); + } + CFX_PtrArray* stopptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN, sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0])); + copyToResult(result, stopptr, INDEXES_STOP_PATTERN, sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0])); + stopptr->RemoveAll(); + delete stopptr; + return result; +} +void CBC_Detector::copyToResult(CFX_PtrArray *result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength) +{ + for (FX_INT32 i = 0; i < destinationLength; i++) { + result->SetAt(destinationIndexes[i], tmpResult->GetAt(i)); + } +} +CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength) +{ + CFX_PtrArray* result = FX_NEW CFX_PtrArray; + result->SetSize(4); + FX_BOOL found = FALSE; + CFX_Int32Array counters; + counters.SetSize(patternLength); + for (; startRow < height; startRow += ROW_STEP) { + CFX_Int32Array* loc = findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, patternLength, counters); + if (loc != NULL) { + while (startRow > 0) { + CFX_Int32Array* previousRowLoc = findGuardPattern(matrix, startColumn, --startRow, width, FALSE, pattern, patternLength, counters); + if (previousRowLoc != NULL) { + delete loc; + loc = previousRowLoc; + } else { + startRow++; + break; + } + } + result->SetAt(0, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); + result->SetAt(1, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); + found = TRUE; + delete loc; + break; + } + } + FX_INT32 stopRow = startRow + 1; + if (found) { + FX_INT32 skippedRowCount = 0; + CFX_Int32Array previousRowLoc; + previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(0))->GetX()); + previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(1))->GetX()); + for (; stopRow < height; stopRow++) { + CFX_Int32Array* loc = findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, pattern, patternLength, counters); + if (loc != NULL && + abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && + abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { + previousRowLoc.Copy(*loc); + skippedRowCount = 0; + } else { + if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { + delete loc; + break; + } else { + skippedRowCount++; + } + } + delete loc; + } + stopRow -= skippedRowCount + 1; + result->SetAt(2, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0), (FX_FLOAT)stopRow)); + result->SetAt(3, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1), (FX_FLOAT)stopRow)); + } + if (stopRow - startRow < BARCODE_MIN_HEIGHT) { + for (FX_INT32 i = 0; i < result->GetSize(); i++) { + result->SetAt(i, NULL); + } + } + return result; +} +CFX_Int32Array* CBC_Detector::findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters) +{ + for (FX_INT32 i = 0; i < counters.GetSize(); i++) { + counters.SetAt(i, 0); + } + FX_BOOL isWhite = whiteFirst; + FX_INT32 patternStart = column; + FX_INT32 pixelDrift = 0; + CFX_Int32Array* intarray = FX_NEW CFX_Int32Array; + while (matrix->Get(patternStart, row) && patternStart > 0 && pixelDrift++ < MAX_PIXEL_DRIFT) { + patternStart--; + } + FX_INT32 x = patternStart; + FX_INT32 counterPosition = 0; + for (; x < width; x++) { + FX_BOOL pixel = matrix->Get(x, row); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + intarray->Add(patternStart); + intarray->Add(x); + return intarray; + } + patternStart += counters[0] + counters[1]; + for (FX_INT32 l = 2, k = 0; l < patternLength; l++, k++) { + counters.SetAt(k, counters.GetAt(l)); + } + counters.SetAt(patternLength - 2, 0); + counters.SetAt(patternLength - 1, 0); + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + if (counterPosition == patternLength - 1) { + if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { + intarray->Add(patternStart); + intarray->Add(x - 1); + return intarray; + } + } + delete intarray; + return NULL; +} +FX_INT32 CBC_Detector::patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance) +{ + FX_INT32 numCounters = counters.GetSize(); + FX_INT32 total = 0; + FX_INT32 patternLength = 0; + for (FX_INT32 i = 0; i < numCounters; i++) { + total += counters[i]; + patternLength += pattern[i]; + } + if (total < patternLength) { + return INTERGER_MAX; + } + FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; + maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; + FX_INT32 totalVariance = 0; + for (FX_INT32 x = 0; x < numCounters; x++) { + FX_INT32 counter = counters[x] << INTEGER_MATH_SHIFT; + FX_INT32 scaledPattern = pattern[x] * unitBarWidth; + FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { + return INTERGER_MAX; + } + totalVariance += variance; + } + return totalVariance / total; +} + diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h new file mode 100644 index 0000000000..557559e1f7 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Detector.h @@ -0,0 +1,43 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DETECTOR_H_ +#define _BC_DETECTOR_H_ +class CBC_PDF417DetectorResult; +class CBC_BinaryBitmap; +class CBC_CommonBitMatrix; +class CBC_CommonBitArray; +class CBC_Detector; +class CBC_Detector : public CFX_Object +{ +public: + CBC_Detector(); + virtual ~CBC_Detector(); + static CBC_PDF417DetectorResult* detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e); + static void rotate180(CBC_CommonBitMatrix* bitMatrix); + static CBC_CommonBitArray* mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result); +private: + static FX_INT32 INDEXES_START_PATTERN[]; + static FX_INT32 INDEXES_STOP_PATTERN[]; + static FX_INT32 INTEGER_MATH_SHIFT; + static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; + static FX_INT32 MAX_AVG_VARIANCE; + static FX_INT32 MAX_INDIVIDUAL_VARIANCE; + static FX_INT32 START_PATTERN[]; + static FX_INT32 STOP_PATTERN[]; + static FX_INT32 MAX_PIXEL_DRIFT; + static FX_INT32 MAX_PATTERN_DRIFT; + static FX_INT32 SKIPPED_ROW_COUNT_MAX; + static FX_INT32 ROW_STEP; + static FX_INT32 BARCODE_MIN_HEIGHT; + static CFX_PtrArray* detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix); + static CFX_PtrArray* findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn); + static void copyToResult(CFX_PtrArray* result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength); + static CFX_PtrArray* findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength); + static CFX_Int32Array* findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters); + static FX_INT32 patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp new file mode 100644 index 0000000000..e082290011 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.cpp @@ -0,0 +1,53 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../BC_ResultPoint.h" +#include "BC_PDF417DetectorResult.h" +CBC_PDF417DetectorResult::CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points) +{ + m_bits = bits; + m_points = points; +} +CBC_PDF417DetectorResult::~CBC_PDF417DetectorResult() +{ + for (FX_INT32 i = 0; i < m_points->GetSize(); i++) { + CFX_PtrArray* temp = (CFX_PtrArray*)m_points->GetAt(i); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_ResultPoint*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + m_points->RemoveAll(); + delete m_points; +} +CBC_CommonBitMatrix* CBC_PDF417DetectorResult::getBits() +{ + return m_bits; +} + +CFX_PtrArray* CBC_PDF417DetectorResult::getPoints() +{ + return m_points; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h new file mode 100644 index 0000000000..ba557f1541 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectorResult.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417DETECTORRESULT_H_ +#define _BC_PDF417DETECTORRESULT_H_ +class CBC_CommonBitMatrix; +class CBC_PDF417DetectorResult; +class CBC_PDF417DetectorResult : public CFX_Object +{ +public: + CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points); + virtual ~CBC_PDF417DetectorResult(); + CBC_CommonBitMatrix* getBits() ; + CFX_PtrArray* getPoints(); +private: + CBC_CommonBitMatrix* m_bits; + CFX_PtrArray* m_points; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp new file mode 100644 index 0000000000..76d2e7bf88 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.cpp @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "../barcode.h" +#include "BC_PDF417Dimensions.h" +CBC_Dimensions::CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows) +{ + m_minCols = minCols; + m_maxCols = maxCols; + m_minRows = minRows; + m_maxRows = maxRows; +} +CBC_Dimensions::~CBC_Dimensions() +{ +} +FX_INT32 CBC_Dimensions::getMinCols() +{ + return m_minCols; +} +FX_INT32 CBC_Dimensions::getMaxCols() +{ + return m_maxCols; +} +FX_INT32 CBC_Dimensions::getMinRows() +{ + return m_minRows; +} +FX_INT32 CBC_Dimensions::getMaxRows() +{ + return m_maxRows; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h new file mode 100644 index 0000000000..6f8eaffed7 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Dimensions.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_DIMENSIONS_H_ +#define _BC_DIMENSIONS_H_ +class CBC_Dimensions; +class CBC_Dimensions : public CFX_Object +{ +public: + CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows); + virtual ~CBC_Dimensions(); + FX_INT32 getMinCols(); + FX_INT32 getMaxCols(); + FX_INT32 getMinRows(); + FX_INT32 getMaxRows(); +private: + FX_INT32 m_minCols; + FX_INT32 m_maxCols; + FX_INT32 m_minRows; + FX_INT32 m_maxRows; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp new file mode 100644 index 0000000000..23207ef959 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp @@ -0,0 +1,369 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417ECModulusPoly.h" +#include "BC_PDF417ECModulusGF.h" +#include "BC_PDF417ECErrorCorrection.h" +CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL; +void CBC_PDF417ECErrorCorrection::Initialize(FX_INT32 &e) +{ + m_field = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); +} +void CBC_PDF417ECErrorCorrection::Finalize() +{ + delete m_field; +} +CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() +{ +} +CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() +{ +} +FX_INT32 CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly poly(m_field, received, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CFX_Int32Array S; + S.SetSize(numECCodewords); + FX_BOOL error = FALSE; + for (FX_INT32 l = numECCodewords; l > 0; l--) { + FX_INT32 eval = poly.evaluateAt(m_field->exp(l)); + S[numECCodewords - l] = eval; + if (eval != 0) { + error = TRUE; + } + } + if (!error) { + return 0; + } + CBC_PDF417ECModulusPoly* syndrome = FX_NEW CBC_PDF417ECModulusPoly(m_field, S, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(numECCodewords, 1, e); + if (e != BCExceptionNO) { + delete syndrome; + return -1; + } + CFX_PtrArray* sigmaOmega = runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e); + delete buildmonomial; + delete syndrome; + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + CBC_PDF417ECModulusPoly* sigma = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0); + CBC_PDF417ECModulusPoly* omega = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1); + CFX_Int32Array* errorLocations = findErrorLocations(sigma, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + CFX_Int32Array* errorMagnitudes = findErrorMagnitudes(omega, sigma, *errorLocations, e); + if (e != BCExceptionNO) { + delete errorLocations; + for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + for (FX_INT32 i = 0; i < errorLocations->GetSize(); i++) { + FX_INT32 log = m_field->log(errorLocations->GetAt(i), e);; + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + FX_INT32 position = received.GetSize() - 1 - log; + if (position < 0) { + e = BCExceptionChecksumException; + delete errorLocations; + delete errorMagnitudes; + for (FX_INT32 j = 0; j < sigmaOmega->GetSize(); j++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return -1; + } + received[position] = m_field->subtract(received[position], errorMagnitudes->GetAt(i)); + } + FX_INT32 result = errorLocations->GetSize(); + delete errorLocations; + delete errorMagnitudes; + for (FX_INT32 k = 0; k < sigmaOmega->GetSize(); k++) { + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k); + } + sigmaOmega->RemoveAll(); + delete sigmaOmega; + return result; +} +CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e) +{ + if (a->getDegree() < b->getDegree()) { + CBC_PDF417ECModulusPoly* temp = a; + a = b; + b = temp; + } + CBC_PDF417ECModulusPoly* rLast = a; + CBC_PDF417ECModulusPoly* r = b; + CBC_PDF417ECModulusPoly* tLast = m_field->getZero(); + CBC_PDF417ECModulusPoly* t = m_field->getOne(); + CBC_PDF417ECModulusPoly* qtemp = NULL; + CBC_PDF417ECModulusPoly* rtemp = NULL; + CBC_PDF417ECModulusPoly* ttemp = NULL; + FX_INT32 i = 0; + FX_INT32 j = 0; + FX_INT32 m = 0; + FX_INT32 n = 0; + while (r->getDegree() >= R / 2) { + CBC_PDF417ECModulusPoly* rLastLast = rLast; + CBC_PDF417ECModulusPoly* tLastLast = tLast; + rLast = r; + tLast = t; + m = i; + n = j; + if (rLast->isZero()) { + e = BCExceptionChecksumException; + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + r = rLastLast; + CBC_PDF417ECModulusPoly* q = m_field->getZero(); + FX_INT32 denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree()); + FX_INT32 dltInverse = m_field->inverse(denominatorLeadingTerm, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + while (r->getDegree() >= rLast->getDegree() && !r->isZero()) { + FX_INT32 degreeDiff = r->getDegree() - rLast->getDegree(); + FX_INT32 scale = m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse); + CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(degreeDiff, scale, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + q = q->add(buildmonomial, e); + delete buildmonomial; + if (qtemp) { + delete qtemp; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + qtemp = q; + CBC_PDF417ECModulusPoly* multiply = rLast->multiplyByMonomial(degreeDiff, scale, e); + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* temp = r; + r = temp->subtract(multiply, e); + delete multiply; + if (m > 1 && i > m) { + delete temp; + temp = NULL; + } + if (e != BCExceptionNO) { + if (qtemp) { + delete qtemp; + } + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + rtemp = r; + i = m + 1; + } + ttemp = q->multiply(tLast, e); + if (qtemp) { + delete qtemp; + qtemp = NULL; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + t = ttemp->subtract(tLastLast, e); + if (n > 1 && j > n) { + delete tLastLast; + } + delete ttemp; + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + ttemp = t; + t = ttemp->negative(e); + delete ttemp; + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + ttemp = t; + j++; + } + FX_INT32 aa = t->getCoefficient(1); + FX_INT32 sigmaTildeAtZero = t->getCoefficient(0); + if (sigmaTildeAtZero == 0) { + e = BCExceptionChecksumException; + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + FX_INT32 inverse = m_field->inverse(sigmaTildeAtZero, e); + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + if (ttemp) { + delete ttemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e); + if (ttemp) { + delete ttemp; + } + if (e != BCExceptionNO) { + if (rtemp) { + delete rtemp; + } + return NULL; + } + CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e); + if (rtemp) { + delete rtemp; + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; + modulusPoly->Add(sigma); + modulusPoly->Add(omega); + return modulusPoly; +} +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e) +{ + FX_INT32 numErrors = errorLocator->getDegree(); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(numErrors); + FX_INT32 ee = 0; + for (FX_INT32 i = 1; i < m_field->getSize() && ee < numErrors; i++) { + if (errorLocator->evaluateAt(i) == 0) { + result->SetAt(ee, m_field->inverse(i, e)); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + ee++; + } + } + if (ee != numErrors) { + e = BCExceptionChecksumException; + delete result; + return NULL; + } + return result; +} +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e) +{ + FX_INT32 errorLocatorDegree = errorLocator->getDegree(); + CFX_Int32Array formalDerivativeCoefficients; + formalDerivativeCoefficients.SetSize(errorLocatorDegree); + for (FX_INT32 l = 1; l <= errorLocatorDegree; l++) { + formalDerivativeCoefficients[errorLocatorDegree - l] = m_field->multiply(l, errorLocator->getCoefficient(l)); + } + CBC_PDF417ECModulusPoly formalDerivative(m_field, formalDerivativeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 s = errorLocations.GetSize(); + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(s); + for (FX_INT32 i = 0; i < s; i++) { + FX_INT32 xiInverse = m_field->inverse(errorLocations[i], e); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + FX_INT32 numerator = m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse)); + FX_INT32 denominator = m_field->inverse(formalDerivative.evaluateAt(xiInverse), e); + if (e != BCExceptionNO) { + delete result; + return NULL; + } + result->SetAt(i, m_field->multiply(numerator, denominator)); + } + return result; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h new file mode 100644 index 0000000000..4ce8eda7d6 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h @@ -0,0 +1,26 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417ECERRORCORRECTION_H_ +#define _BC_PDF417ECERRORCORRECTION_H_ +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusPoly; +class CBC_PDF417ECErrorCorrection; +class CBC_PDF417ECErrorCorrection : public CFX_Object +{ +public: + CBC_PDF417ECErrorCorrection(); + virtual ~CBC_PDF417ECErrorCorrection(); + static void Initialize(FX_INT32 &e); + static void Finalize(); + static FX_INT32 decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e); +private: + static CBC_PDF417ECModulusGF* m_field; + static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e); + static CFX_Int32Array* findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e); + static CFX_Int32Array* findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp new file mode 100644 index 0000000000..7619854bcb --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.cpp @@ -0,0 +1,126 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417ECModulusPoly.h" +#include "BC_PDF417ECModulusGF.h" +CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL; +void CBC_PDF417ECModulusGF::Initialize(FX_INT32 &e) +{ + PDF417_GF = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); +} +void CBC_PDF417ECModulusGF::Finalize() +{ + delete PDF417_GF; +} +CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e) +{ + m_modulus = modulus; + m_expTable.SetSize(modulus); + m_logTable.SetSize(modulus); + FX_INT32 x = 1; + for (FX_INT32 i = 0; i < modulus; i++) { + m_expTable[i] = x; + x = (x * generator) % modulus; + } + for (FX_INT32 j = 0; j < modulus - 1; j++) { + m_logTable[m_expTable[j]] = j; + } + CFX_Int32Array zero; + zero.Add(0); + m_zero = FX_NEW CBC_PDF417ECModulusPoly(this, zero, e); + CFX_Int32Array one; + one.Add(1); + m_one = FX_NEW CBC_PDF417ECModulusPoly(this, one, e); +} +CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() +{ + delete m_zero; + delete m_one; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() +{ + return m_zero; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() +{ + return m_one; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if (degree < 0) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (coefficient == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_zero->getField(), m_zero->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array coefficients; + coefficients.SetSize(degree + 1); + coefficients[0] = coefficient; + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(this, coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +FX_INT32 CBC_PDF417ECModulusGF::add(FX_INT32 a, FX_INT32 b) +{ + return (a + b) % m_modulus; +} +FX_INT32 CBC_PDF417ECModulusGF::subtract(FX_INT32 a, FX_INT32 b) +{ + return (m_modulus + a - b) % m_modulus; +} +FX_INT32 CBC_PDF417ECModulusGF::exp(FX_INT32 a) +{ + return m_expTable[a]; +} +FX_INT32 CBC_PDF417ECModulusGF::log(FX_INT32 a, FX_INT32 &e) +{ + if (a == 0) { + e = BCExceptionIllegalArgument; + return -1; + } + return m_logTable[a]; +} +FX_INT32 CBC_PDF417ECModulusGF::inverse(FX_INT32 a, FX_INT32 &e) +{ + if (a == 0) { + e = BCExceptionIllegalArgument; + return -1; + } + return m_expTable[m_modulus - m_logTable[a] - 1]; +} +FX_INT32 CBC_PDF417ECModulusGF::multiply(FX_INT32 a, FX_INT32 b) +{ + if (a == 0 || b == 0) { + return 0; + } + return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)]; +} +FX_INT32 CBC_PDF417ECModulusGF::getSize() +{ + return m_modulus; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h new file mode 100644 index 0000000000..7ebe33ecfd --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusGF.h @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417ECMODULUSGF_H_ +#define _BC_PDF417ECMODULUSGF_H_ +class CBC_PDF417ECModulusPoly; +class CBC_PDF417Common; +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusGF : public CFX_Object +{ +public: + CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e); + virtual ~CBC_PDF417ECModulusGF(); + static void Initialize(FX_INT32 &e); + static void Finalize(); + CBC_PDF417ECModulusPoly* getZero(); + CBC_PDF417ECModulusPoly* getOne(); + CBC_PDF417ECModulusPoly* buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + FX_INT32 add(FX_INT32 a, FX_INT32 b); + FX_INT32 subtract(FX_INT32 a, FX_INT32 b); + FX_INT32 exp(FX_INT32 a); + FX_INT32 log(FX_INT32 a, FX_INT32 &e); + FX_INT32 inverse(FX_INT32 a, FX_INT32 &e); + FX_INT32 multiply(FX_INT32 a, FX_INT32 b); + FX_INT32 getSize(); + static CBC_PDF417ECModulusGF* PDF417_GF; +private: + CFX_Int32Array m_expTable; + CFX_Int32Array m_logTable; + CBC_PDF417ECModulusPoly* m_zero; + CBC_PDF417ECModulusPoly* m_one; + FX_INT32 m_modulus; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp new file mode 100644 index 0000000000..39d3fd8056 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.cpp @@ -0,0 +1,316 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417ECModulusGF.h" +#include "BC_PDF417ECModulusPoly.h" +CBC_PDF417ECModulusPoly::CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e) +{ + if (coefficients.GetSize() == 0) { + e = BCExceptionIllegalArgument; + } + m_field = field; + FX_INT32 coefficientsLength = coefficients.GetSize(); + if (coefficientsLength > 1 && coefficients[0] == 0) { + FX_INT32 firstNonZero = 1; + while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { + firstNonZero++; + } + if (firstNonZero == coefficientsLength) { + m_coefficients = field->getZero()->m_coefficients; + } else { + m_coefficients.SetSize(coefficientsLength - firstNonZero); + FX_INT32 l = 0; + for (FX_INT32 i = firstNonZero; i < firstNonZero + m_coefficients.GetSize(); i++) { + m_coefficients.SetAt(l, coefficients.GetAt(i)); + l++; + } + } + } else { + m_coefficients.Copy(coefficients); + } +} +CBC_PDF417ECModulusPoly::~CBC_PDF417ECModulusPoly() +{ +} +CFX_Int32Array& CBC_PDF417ECModulusPoly::getCoefficients() +{ + return m_coefficients; +} +CBC_PDF417ECModulusGF* CBC_PDF417ECModulusPoly::getField() +{ + return m_field; +} +FX_INT32 CBC_PDF417ECModulusPoly::getDegree() +{ + return m_coefficients.GetSize() - 1; +} +FX_BOOL CBC_PDF417ECModulusPoly::isZero() +{ + return m_coefficients[0] == 0; +} +FX_INT32 CBC_PDF417ECModulusPoly::getCoefficient(FX_INT32 degree) +{ + return m_coefficients[m_coefficients.GetSize() - 1 - degree]; +} +FX_INT32 CBC_PDF417ECModulusPoly::evaluateAt(FX_INT32 a) +{ + if (a == 0) { + return getCoefficient(0); + } + FX_INT32 size = m_coefficients.GetSize(); + if (a == 1) { + FX_INT32 result = 0; + for (FX_INT32 l = 0; l < m_coefficients.GetSize(); l++) { + FX_INT32 coefficient = m_coefficients.GetAt(l); + result = m_field->add(result, coefficient); + } + return result; + } + FX_INT32 result = m_coefficients[0]; + for (FX_INT32 i = 1; i < size; i++) { + result = m_field->add(m_field->multiply(a, result), m_coefficients[i]); + } + return result; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(other->getField(), other->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + if (other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array smallerCoefficients; + smallerCoefficients.Copy(m_coefficients); + CFX_Int32Array largerCoefficients; + largerCoefficients.Copy(other->m_coefficients); + if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { + CFX_Int32Array temp; + temp.Copy(smallerCoefficients); + smallerCoefficients.Copy(largerCoefficients); + largerCoefficients.Copy(temp); + } + CFX_Int32Array sumDiff; + sumDiff.SetSize(largerCoefficients.GetSize()); + FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); + for (FX_INT32 l = 0; l < lengthDiff; l++) { + sumDiff.SetAt(l, largerCoefficients.GetAt(l)); + } + for (FX_INT32 i = lengthDiff; i < largerCoefficients.GetSize(); i++) { + sumDiff[i] = m_field->add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, sumDiff, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CBC_PDF417ECModulusPoly* poly = other->negative(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + modulusPoly = add(poly, e); + delete poly; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (isZero() || other->isZero()) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + CFX_Int32Array aCoefficients; + aCoefficients.Copy(m_coefficients); + FX_INT32 aLength = aCoefficients.GetSize(); + CFX_Int32Array bCoefficients; + bCoefficients.Copy(other->m_coefficients); + FX_INT32 bLength = bCoefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(aLength + bLength - 1); + for (FX_INT32 i = 0; i < aLength; i++) { + FX_INT32 aCoeff = aCoefficients[i]; + for (FX_INT32 j = 0; j < bLength; j++) { + product[i + j] = m_field->add(product[i + j], m_field->multiply(aCoeff, bCoefficients[j])); + } + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::negative(FX_INT32 &e) +{ + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array negativeCoefficients; + negativeCoefficients.SetSize(size); + for (FX_INT32 i = 0; i < size; i++) { + negativeCoefficients[i] = m_field->subtract(0, m_coefficients[i]); + } + CBC_PDF417ECModulusPoly* modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, negativeCoefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(FX_INT32 scalar, FX_INT32 &e) +{ + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (scalar == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + if (scalar == 1) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size); + for (FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->multiply(m_coefficients[i], scalar); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) +{ + if (degree < 0) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_PDF417ECModulusPoly* modulusPoly = NULL; + if (coefficient == 0) { + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; + } + FX_INT32 size = m_coefficients.GetSize(); + CFX_Int32Array product; + product.SetSize(size + degree); + for (FX_INT32 i = 0; i < size; i++) { + product[i] = m_field->multiply(m_coefficients[i], coefficient); + } + modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return modulusPoly; +} +CFX_PtrArray* CBC_PDF417ECModulusPoly::divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) +{ + if (other->isZero()) { + e = BCExceptionDivideByZero; + return NULL; + } + CBC_PDF417ECModulusPoly* quotient = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_PDF417ECModulusPoly* remainder = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); + if (e != BCExceptionNO) { + delete quotient; + return NULL; + } + FX_INT32 denominatorLeadingTerm = other->getCoefficient(other->getDegree()); + FX_INT32 inverseDenominatorLeadingTerm = m_field->inverse(denominatorLeadingTerm, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + return NULL; + } + while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) { + FX_INT32 degreeDifference = remainder->getDegree() - other->getDegree(); + FX_INT32 scale = m_field->multiply(remainder->getCoefficient(remainder->getDegree()), inverseDenominatorLeadingTerm); + CBC_PDF417ECModulusPoly* term = other->multiplyByMonomial(degreeDifference, scale, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + return NULL; + } + CBC_PDF417ECModulusPoly* iterationQuotient = m_field->buildMonomial(degreeDifference, scale, e); + if (e != BCExceptionNO) { + delete quotient; + delete remainder; + delete term; + return NULL; + } + CBC_PDF417ECModulusPoly* temp = quotient; + quotient = temp->add(iterationQuotient, e); + delete iterationQuotient; + delete temp; + if (e != BCExceptionNO) { + delete remainder; + return NULL; + } + temp = remainder; + remainder = temp->subtract(term, e); + delete term; + delete temp; + if (e != BCExceptionNO) { + delete quotient; + return NULL; + } + } + CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; + modulusPoly->Add(quotient); + modulusPoly->Add(remainder); + return modulusPoly; +} +CFX_ByteString CBC_PDF417ECModulusPoly::toString() +{ + CFX_ByteString result; + for (FX_INT32 degree = getDegree(); degree >= 0; degree--) { + FX_INT32 coefficient = getCoefficient(degree); + if (coefficient != 0) { + if (coefficient < 0) { + result += " - "; + coefficient = -coefficient; + } else { + if (result.GetLength() > 0) { + result += " + "; + } + } + if (degree == 0 || coefficient != 1) { + result += coefficient; + } + if (degree != 0) { + if (degree == 1) { + result += 'x'; + } else { + result += "x^"; + result += degree; + } + } + } + } + return result; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h new file mode 100644 index 0000000000..9a9d6c16f2 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h @@ -0,0 +1,34 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417ECMODULUSPOLY_H_ +#define _BC_PDF417ECMODULUSPOLY_H_ +class CBC_PDF417ECModulusGF; +class CBC_PDF417ECModulusPoly; +class CBC_PDF417ECModulusPoly : public CFX_Object +{ +public: + CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e); + virtual ~CBC_PDF417ECModulusPoly(); + CFX_Int32Array& getCoefficients(); + CBC_PDF417ECModulusGF* getField(); + FX_INT32 getDegree(); + FX_BOOL isZero(); + FX_INT32 getCoefficient(FX_INT32 degree); + FX_INT32 evaluateAt(FX_INT32 a); + CBC_PDF417ECModulusPoly* add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CBC_PDF417ECModulusPoly* negative(FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiply(FX_INT32 scalar, FX_INT32 &e); + CBC_PDF417ECModulusPoly* multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); + CFX_PtrArray* divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); + CFX_ByteString toString(); +private: + CBC_PDF417ECModulusGF* m_field; + CFX_Int32Array m_coefficients; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp new file mode 100644 index 0000000000..cd1ea88046 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp @@ -0,0 +1,193 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417ErrorCorrection.h" +FX_INT32 CBC_PDF417ErrorCorrection::EC_COEFFICIENTS[][2500] = { + {27, 917}, + {522, 568, 723, 809}, + {237, 308, 436, 284, 646, 653, 428, 379}, + { + 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, + 42, 176, 65 + }, + { + 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, + 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, + 133, 231, 390, 685, 330, 63, 410 + }, + { + 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, + 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, + 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, + 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, + 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, + 623, 264, 543 + }, + { + 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, + 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, + 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, + 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, + 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, + 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, + 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, + 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, + 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, + 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, + 315, 550, 86, 801, 4, 108, 539 + }, + { + 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, + 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, + 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, + 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, + 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, + 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, + 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, + 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, + 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, + 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, + 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, + 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, + 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, + 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, + 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, + 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, + 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, + 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, + 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, + 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, + 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, + 55, 497, 10 + }, + { + 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, + 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, + 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, + 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, + 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, + 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, + 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, + 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, + 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, + 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, + 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, + 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, + 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, + 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, + 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, + 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, + 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, + 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, + 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, + 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, + 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, + 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, + 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, + 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, + 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, + 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, + 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, + 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, + 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, + 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, + 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, + 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, + 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, + 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, + 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, + 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, + 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, + 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, + 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, + 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, + 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, + 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, + 410, 389, 244, 31, 121, 303, 263 + } +}; +CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() +{ +} +CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() +{ +} +FX_INT32 CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { + e = BCExceptionErrorCorrectionLevelMustBeBetween0And8; + return -1; + } + return 1 << (errorCorrectionLevel + 1); +} +FX_INT32 CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e) +{ + if (n <= 0) { + e = BCExceptionIllegalArgumentnMustBeAbove0; + return -1; + } + if (n <= 40) { + return 2; + } + if (n <= 160) { + return 3; + } + if (n <= 320) { + return 4; + } + if (n <= 863) { + return 5; + } + e = BCExceptionNoRecommendationPossible; + return -1; +} +CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e) +{ + FX_INT32 k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); + FX_WCHAR* ech = FX_Alloc(FX_WCHAR, k * sizeof(FX_WCHAR)); + FXSYS_memset32(ech, 0, k * sizeof(FX_WCHAR)); + FX_INT32 sld = dataCodewords.GetLength(); + for (FX_INT32 i = 0; i < sld; i++) { + FX_INT32 t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929; + FX_INT32 t2; + FX_INT32 t3; + for (FX_INT32 j = k - 1; j >= 1; j--) { + t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; + t3 = 929 - t2; + ech[j] = (FX_WCHAR) ((ech[j - 1] + t3) % 929); + } + t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; + t3 = 929 - t2; + ech[0] = (FX_WCHAR) (t3 % 929); + } + CFX_WideString sb; + for (FX_INT32 j = k - 1; j >= 0; j--) { + if (ech[j] != 0) { + ech[j] = (FX_WCHAR) (929 - ech[j]); + } + sb += (FX_WCHAR)ech[j]; + } + FX_Free (ech); + return sb; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h new file mode 100644 index 0000000000..4e3aee8d26 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417ERRORCORRECTION_H_ +#define _BC_PDF417ERRORCORRECTION_H_ +class CBC_PDF417ErrorCorrection; +class CBC_PDF417ErrorCorrection : public CFX_Object +{ +public: + CBC_PDF417ErrorCorrection(); + virtual ~CBC_PDF417ErrorCorrection(); + static FX_INT32 getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e); + static FX_INT32 getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e); + static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e); +private: + static FX_INT32 EC_COEFFICIENTS[][2500]; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp new file mode 100644 index 0000000000..8ee21ea97e --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp @@ -0,0 +1,420 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_UtilCodingConvert.h" +#include "../../../../third_party/bigint/BigIntegerLibrary.hh" +#include "BC_PDF417Compaction.h" +#include "BC_PDF417HighLevelEncoder.h" +#define SUBMODE_ALPHA 0 +#define SUBMODE_LOWER 1 +#define SUBMODE_MIXED 2 +FX_INT32 CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0; +FX_INT32 CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1; +FX_INT32 CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2; +FX_INT32 CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902; +FX_INT32 CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913; +FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924; +FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, + 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0 + }; +FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = {59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, + 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0 + }; +FX_INT32 CBC_PDF417HighLevelEncoder::MIXED[128] = {0}; +FX_INT32 CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0}; +void CBC_PDF417HighLevelEncoder::Initialize() +{ + Inverse(); +} +void CBC_PDF417HighLevelEncoder::Finalize() +{ +} +CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel(CFX_WideString wideMsg, Compaction compaction, FX_INT32 &e) +{ + CFX_ByteString bytes; + CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes); + CFX_WideString msg; + FX_INT32 len = bytes.GetLength(); + for (FX_INT32 i = 0; i < len; i++) { + FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff); + if (ch == '?' && bytes.GetAt(i) != '?') { + e = BCExceptionCharactersOutsideISO88591Encoding; + return (FX_LPWSTR)""; + } + msg += ch; + } + CFX_ByteArray byteArr; + for (FX_INT32 k = 0; k < bytes.GetLength(); k++) { + byteArr.Add(bytes.GetAt(k)); + } + CFX_WideString sb; + len = msg.GetLength(); + FX_INT32 p = 0; + FX_INT32 textSubMode = SUBMODE_ALPHA; + if (compaction == TEXT) { + encodeText(msg, p, len, sb, textSubMode); + } else if (compaction == BYTES) { + encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb); + } else if (compaction == NUMERIC) { + sb += (FX_WCHAR) LATCH_TO_NUMERIC; + encodeNumeric(msg, p, len, sb); + } else { + FX_INT32 encodingMode = LATCH_TO_TEXT; + while (p < len) { + FX_INT32 n = determineConsecutiveDigitCount(msg, p); + if (n >= 13) { + sb += (FX_WCHAR) LATCH_TO_NUMERIC; + encodingMode = NUMERIC_COMPACTION; + textSubMode = SUBMODE_ALPHA; + encodeNumeric(msg, p, n, sb); + p += n; + } else { + FX_INT32 t = determineConsecutiveTextCount(msg, p); + if (t >= 5 || n == len) { + if (encodingMode != TEXT_COMPACTION) { + sb += (FX_WCHAR) LATCH_TO_TEXT; + encodingMode = TEXT_COMPACTION; + textSubMode = SUBMODE_ALPHA; + } + textSubMode = encodeText(msg, p, t, sb, textSubMode); + p += t; + } else { + FX_INT32 b = determineConsecutiveBinaryCount(msg, &byteArr, p, e); + BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); + if (b == 0) { + b = 1; + } + if (b == 1 && encodingMode == TEXT_COMPACTION) { + encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb); + } else { + encodeBinary(&byteArr, p, b, encodingMode, sb); + encodingMode = BYTE_COMPACTION; + textSubMode = SUBMODE_ALPHA; + } + p += b; + } + } + } + } + return sb; +} +void CBC_PDF417HighLevelEncoder::Inverse() +{ + FX_BYTE i = 0; + FX_INT32 l = 0; + for (l = 0; l < sizeof(MIXED) / sizeof(MIXED[0]); l++) { + MIXED[l] = -1; + } + for (i = 0; i < sizeof(TEXT_MIXED_RAW) / sizeof(TEXT_MIXED_RAW[0]); i++) { + FX_BYTE b = TEXT_MIXED_RAW[i]; + if (b > 0) { + MIXED[b] = i; + } + } + for (l = 0; l < sizeof(PUNCTUATION) / sizeof(PUNCTUATION[0]); l++) { + PUNCTUATION[l] = -1; + } + for (i = 0; i < sizeof(TEXT_PUNCTUATION_RAW) / sizeof(TEXT_PUNCTUATION_RAW[0]); i++) { + FX_BYTE b = TEXT_PUNCTUATION_RAW[i]; + if (b > 0) { + PUNCTUATION[b] = i; + } + } +} +FX_INT32 CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode) +{ + CFX_WideString tmp; + FX_INT32 submode = initialSubmode; + FX_INT32 idx = 0; + while (TRUE) { + FX_WCHAR ch = msg.GetAt(startpos + idx); + switch (submode) { + case SUBMODE_ALPHA: + if (isAlphaUpper(ch)) { + if (ch == ' ') { + tmp += (FX_WCHAR) 26; + } else { + tmp += (FX_WCHAR) (ch - 65); + } + } else { + if (isAlphaLower(ch)) { + submode = SUBMODE_LOWER; + tmp += (FX_WCHAR) 27; + continue; + } else if (isMixed(ch)) { + submode = SUBMODE_MIXED; + tmp += (FX_WCHAR) 28; + continue; + } else { + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + break; + } + } + break; + case SUBMODE_LOWER: + if (isAlphaLower(ch)) { + if (ch == ' ') { + tmp += (FX_WCHAR) 26; + } else { + tmp += (FX_WCHAR) (ch - 97); + } + } else { + if (isAlphaUpper(ch)) { + tmp += (FX_WCHAR) 27; + tmp += (FX_WCHAR) (ch - 65); + break; + } else if (isMixed(ch)) { + submode = SUBMODE_MIXED; + tmp += (FX_WCHAR) 28; + continue; + } else { + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + break; + } + } + break; + case SUBMODE_MIXED: + if (isMixed(ch)) { + FX_WCHAR a = MIXED[ch]; + FX_INT32 b = (FX_INT32)a; + tmp += MIXED[ch]; + } else { + if (isAlphaUpper(ch)) { + submode = SUBMODE_ALPHA; + tmp += (FX_WCHAR) 28; + continue; + } else if (isAlphaLower(ch)) { + submode = SUBMODE_LOWER; + tmp += (FX_WCHAR) 27; + continue; + } else { + if (startpos + idx + 1 < count) { + FX_WCHAR next = msg.GetAt(startpos + idx + 1); + if (isPunctuation(next)) { + submode = SUBMODE_PUNCTUATION; + tmp += (FX_WCHAR) 25; + continue; + } + } + tmp += (FX_WCHAR) 29; + tmp += PUNCTUATION[ch]; + } + } + break; + default: + if (isPunctuation(ch)) { + tmp += PUNCTUATION[ch]; + } else { + submode = SUBMODE_ALPHA; + tmp += (FX_WCHAR) 29; + continue; + } + } + idx++; + if (idx >= count) { + break; + } + } + FX_WCHAR h = 0; + FX_INT32 len = tmp.GetLength(); + for (FX_INT32 i = 0; i < len; i++) { + FX_BOOL odd = (i % 2) != 0; + if (odd) { + h = (FX_WCHAR) ((h * 30) + tmp.GetAt(i)); + sb += h; + } else { + h = tmp.GetAt(i); + } + } + if ((len % 2) != 0) { + sb += (FX_WCHAR) ((h * 30) + 29); + } + return submode; +} +void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb) +{ + if (count == 1 && startmode == TEXT_COMPACTION) { + sb += (FX_WCHAR) SHIFT_TO_BYTE; + } + FX_INT32 idx = startpos; + FX_INT32 i = 0; + if (count >= 6) { + sb += (FX_WCHAR) LATCH_TO_BYTE; + FX_WCHAR chars[5]; + while ((startpos + count - idx) >= 6) { + FX_INT64 t = 0; + for (i = 0; i < 6; i++) { + t <<= 8; + t += bytes->GetAt(idx + i) & 0xff; + } + for (i = 0; i < 5; i++) { + chars[i] = (FX_WCHAR) (t % 900); + t /= 900; + } + for (i = 4; i >= 0; i--) { + sb += (chars[i]); + } + idx += 6; + } + } + if (idx < startpos + count) { + sb += (FX_WCHAR) LATCH_TO_BYTE_PADDED; + } + for (i = idx; i < startpos + count; i++) { + FX_INT32 ch = bytes->GetAt(i) & 0xff; + sb += (FX_WCHAR) ch; + } +} +void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb) +{ + FX_INT32 idx = 0; + BigInteger num900 = 900; + while (idx < count - 1) { + CFX_WideString tmp; + FX_INT32 len = 44 < count - idx ? 44 : count - idx; + CFX_ByteString part = ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode(); + BigInteger bigint = stringToBigInteger(FX_LPCSTR(part)); + do { + FX_INT32 c = (bigint % num900).toInt(); + tmp += (FX_WCHAR)(c); + bigint = bigint / num900; + } while (!bigint.isZero()); + for (FX_INT32 i = tmp.GetLength() - 1; i >= 0; i--) { + sb += tmp.GetAt(i); + } + idx += len; + } +} +FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) +{ + return ch >= '0' && ch <= '9'; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) +{ + return ch == ' ' || (ch >= 'A' && ch <= 'Z'); +} +FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) +{ + return ch == ' ' || (ch >= 'a' && ch <= 'z'); +} +FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) +{ + return MIXED[ch] != -1; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) +{ + return PUNCTUATION[ch] != -1; +} +FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) +{ + return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 count = 0; + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + if (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + while (isDigit(ch) && idx < len) { + count++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + } + return count; +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos) +{ + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + while (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + FX_INT32 numericCount = 0; + while (numericCount < 13 && isDigit(ch) && idx < len) { + numericCount++; + idx++; + if (idx < len) { + ch = msg.GetAt(idx); + } + } + if (numericCount >= 13) { + return idx - startpos - numericCount; + } + if (numericCount > 0) { + continue; + } + ch = msg.GetAt(idx); + if (!isText(ch)) { + break; + } + idx++; + } + return idx - startpos; +} +FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e) +{ + FX_INT32 len = msg.GetLength(); + FX_INT32 idx = startpos; + while (idx < len) { + FX_WCHAR ch = msg.GetAt(idx); + FX_INT32 numericCount = 0; + while (numericCount < 13 && isDigit(ch)) { + numericCount++; + FX_INT32 i = idx + numericCount; + if (i >= len) { + break; + } + ch = msg.GetAt(i); + } + if (numericCount >= 13) { + return idx - startpos; + } + FX_INT32 textCount = 0; + while (textCount < 5 && isText(ch)) { + textCount++; + FX_INT32 i = idx + textCount; + if (i >= len) { + break; + } + ch = msg.GetAt(i); + } + if (textCount >= 5) { + return idx - startpos; + } + ch = msg.GetAt(idx); + if (bytes->GetAt(idx) == 63 && ch != '?') { + e = BCExceptionNonEncodableCharacterDetected; + return -1; + } + idx++; + } + return idx - startpos; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h new file mode 100644 index 0000000000..ed962030ac --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h @@ -0,0 +1,54 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417HIGHLEVELENCODER_H_ +#define _BC_PDF417HIGHLEVELENCODER_H_ + +#include "BC_PDF417Compaction.h" + +class CBC_PDF417HighLevelEncoder : public CFX_Object +{ +public: + static CFX_WideString encodeHighLevel(CFX_WideString msg, Compaction compaction, FX_INT32 &e); + static void Inverse(); + static void Initialize(); + static void Finalize(); +private: + static FX_INT32 TEXT_COMPACTION; + static FX_INT32 BYTE_COMPACTION; + static FX_INT32 NUMERIC_COMPACTION; + static FX_INT32 SUBMODE_PUNCTUATION; + static FX_INT32 LATCH_TO_TEXT; + static FX_INT32 LATCH_TO_BYTE_PADDED; + static FX_INT32 LATCH_TO_NUMERIC; + static FX_INT32 SHIFT_TO_BYTE; + static FX_INT32 LATCH_TO_BYTE; + static FX_BYTE TEXT_MIXED_RAW[]; + static FX_BYTE TEXT_PUNCTUATION_RAW[]; + static FX_INT32 MIXED[128]; + static FX_INT32 PUNCTUATION[128]; + static FX_INT32 encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode); + static void encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb); + static void encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb); + static FX_BOOL isDigit(FX_WCHAR ch); + static FX_BOOL isAlphaUpper(FX_WCHAR ch); + static FX_BOOL isAlphaLower(FX_WCHAR ch); + static FX_BOOL isMixed(FX_WCHAR ch); + static FX_BOOL isPunctuation(FX_WCHAR ch); + static FX_BOOL isText(FX_WCHAR ch); + static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); + static FX_INT32 determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos); + static FX_INT32 determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e); + + friend class PDF417HighLevelEncoder_EncodeNumeric_Test; + friend class PDF417HighLevelEncoder_EncodeBinary_Test; + friend class PDF417HighLevelEncoder_EncodeText_Test; + friend class PDF417HighLevelEncoder_ConsecutiveDigitCount_Test; + friend class PDF417HighLevelEncoder_ConsecutiveTextCount_Test; + friend class PDF417HighLevelEncoder_ConsecutiveBinaryCount_Test; +}; + +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp new file mode 100644 index 0000000000..33c875366c --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp @@ -0,0 +1,221 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/include/fxcrt/fx_basic.h" +#include "BC_PDF417HighLevelEncoder.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/fx_string_testhelpers.h" + +TEST(PDF417HighLevelEncoder, EncodeHighLevel) { + // TODO(tsepez): implement test cases. +} + +TEST(PDF417HighLevelEncoder, EncodeText) { + // TODO(tsepez): implement test cases. +} + +TEST(PDF417HighLevelEncoder, EncodeBinary) { + struct EncodeBinaryCase { + const char* input; + int offset; + int count; + int startmode; + const wchar_t* expected; + int expected_length; + } encode_binary_cases[] = { + // Empty string encodes as empty string. + { "", 0, 0, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"", 0 }, + + // Fewer than 6 characters encodes as prefix without compaction. + { "xxxxx", 0, 5, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"\x0385xxxxx", 6 }, + + // 6 charcters triggerst text encoding compaction. + { "xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, + L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6 }, + + // Same result if initially in numeric compaction mode. + { "xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION, + L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6 }, + }; + + CBC_PDF417HighLevelEncoder::Initialize(); + for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) { + EncodeBinaryCase* ptr = &encode_binary_cases[i]; + CFX_ByteArray input_array; + size_t input_length = strlen(ptr->input); + input_array.SetSize(input_length); + for (size_t j = 0; j < input_length; ++j) { + input_array.SetAt(j, ptr->input[j]); + } + CFX_WideString expected(ptr->expected, ptr->expected_length); + CFX_WideString result; + CBC_PDF417HighLevelEncoder::encodeBinary( + &input_array, ptr->offset, ptr->count, ptr->startmode, result); + EXPECT_EQ(expected, result) << " for case number " << i; + } + CBC_PDF417HighLevelEncoder::Finalize(); +} + +TEST(PDF417HighLevelEncoder, EncodeNumeric) { + struct EncodeNumericCase { + const wchar_t* input; + int offset; + int count; + const wchar_t* expected; + int expected_length; + } encode_numeric_cases[] = { + // Empty string encodes as empty string. + { L"", 0, 0, L"", 0 }, + + // Blank string encodes as empty string. + { L" ", 0, 1, L"", 0 }, + + // Single 0 should encode as 10 base-900 == 10. + { L"0", 0, 1, L"", 0 }, // wrong - should be \u000a? + + // 800 should encode as 1800 base-900 == 2,0. + { L"800", 0, 3, L"\x0002\x0000", 2 }, + + // Test longer strings and sub-strings. + { L"123456", 0, 6, L"\x0001\x015c\x0100", 3 }, + { L"123456", 0, 5, L"\x007c\x02e9", 2 }, + { L"123456", 1, 5, L"\x0089\x009c", 2 }, + { L"123456", 2, 2, L"\x0086", 1 }, + + // Up to 44 characters encodes as 15 base-900 words. + { L"00000000000000000000000000000000000000000000", 0, 44, + L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064", 15 }, + + // 45 characters should encode as same 15 words followed by one additional word. + { L"000000000000000000000000000000000000000000000", 0, 45, + L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064\x000a", 16 }, + + // 44 characters followed by 800 should encode as 15 words followed by 1800 base-900 == 2,0. + { L"00000000000000000000000000000000000000000000800", 0, 47, + L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064\x0002\x0000", 17 }, + + // Even longer input. + { L"10000000000000000000000000000000000000000000000000", 0, 50, + L"\x01e0\x02f0\x036d\x02ad\x029c\x01ea\x0011\x000b\x02d6\x023c\x0108\x02bb\x0023\x02d2\x00c8\x0001\x00d3\x0064", 18 }, + }; + + CBC_PDF417HighLevelEncoder::Initialize(); + for (size_t i = 0; i < FX_ArraySize(encode_numeric_cases); ++i) { + EncodeNumericCase* ptr = &encode_numeric_cases[i]; + CFX_WideString input(ptr->input); + CFX_WideString expected(ptr->expected, ptr->expected_length); + CFX_WideString result; + CBC_PDF417HighLevelEncoder::encodeNumeric( + input, ptr->offset, ptr->count, result); + EXPECT_EQ(expected, result) << " for case number " << i; + } + CBC_PDF417HighLevelEncoder::Finalize(); +} + +TEST(PDF417HighLevelEncoder, ConsecutiveDigitCount) { + struct ConsecutiveDigitCase { + const wchar_t* input; + int offset; + int expected_count; + } consecutive_digit_cases[] = { + // Empty string contains 0 consecuitve digits. + { L"", 0, 0 }, + + // Single non-digit character contains 0 consecutive digits. + { L"X", 0, 0 }, + + // Leading non-digit followed by digits contains 0 consecutive. + { L"X123", 0, 0 }, + + // Single digit contains 1 consecutive digit. + { L"1", 0, 1 }, + + // Single digit followe by non-digit contains 1 consecutive digit. + { L"1Z", 0, 1 }, + + // Test longer strings. + { L"123FOO45678", 0, 3 }, + + // Test subtring starting in digits field. + { L"123FOO45678", 3, 0 }, + + // Test subtring starting in non-digits field. + { L"123FOO45678", 3, 0 }, + + // Test substring starting in digits field following non-digit field. + { L"123FOO45678", 6, 5 }, + }; + + CBC_PDF417HighLevelEncoder::Initialize(); + for (size_t i = 0; i < FX_ArraySize(consecutive_digit_cases); ++i) { + ConsecutiveDigitCase* ptr = &consecutive_digit_cases[i]; + CFX_WideString input(ptr->input); + int actual_count = CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(input, ptr->offset); + EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i; + } + CBC_PDF417HighLevelEncoder::Finalize(); +} + +TEST(PDF417HighLevelEncoder, ConsecutiveTextCount) { + struct ConsecutiveTextCase { + const wchar_t* input; + int offset; + int expected_count; + } consecutive_text_cases[] = { + // Empty string contains 0 consecutive text characters. + { L"", 0, 0 }, + + // Single text character is 1 consecutive text characters. + { L"X", 0, 1 }, + + // Trailing numbers count as text characters. + { L"X123", 0, 4 }, + + // Leading numbers count as text characters. + { L"123X", 0, 4 }, + + // Embedded lo-value binary characters terminate text runs. + { L"ABC\x0001XXXX", 0, 3 }, + + // Embedded hi-value binary characters terminate text runs. + { L"ABC\x0100XXXX", 0, 3 }, + + // Text run still found after indexing past lo-value character. + { L"ABC\x0001XXXX", 4, 4 }, + + // Text run still found after indexing past hi-value character. + { L"ABC\x0100XXXX", 4, 4 }, + + // Leading hi-value character results in 0 consecutive characters. + { L"\x0100XXX", 0, 0 }, + + // Up to 12 numbers count as text. + { L"123456789012", 0, 12 }, + + // 13 or more numbers are compresssed using numeric compression, not text. + { L"1234567890123", 0, 0 }, + + // Leading Text character doesn't affect the 12 character case. + { L"X123456789012", 0, 13 }, + + // Leading Text character doesn't affect the 13 character case. + { L"X1234567890123", 0, 1 }, + + // Jumping between numbers and letters works properly. + { L"XXX121XXX12345678901234", 0, 9 }, + }; + + CBC_PDF417HighLevelEncoder::Initialize(); + for (size_t i = 0; i < FX_ArraySize(consecutive_text_cases); ++i) { + ConsecutiveTextCase* ptr = &consecutive_text_cases[i]; + CFX_WideString input(ptr->input); + int actual_count = CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(input, ptr->offset); + EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i; + } + CBC_PDF417HighLevelEncoder::Finalize(); +} + +TEST(PDF417HighLevelEncoder, ConsecutiveBinaryCount) { + +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp new file mode 100644 index 0000000000..ed751cc4ba --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.cpp @@ -0,0 +1,119 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../BC_BinaryBitmap.h" +#include "../BC_ResultPoint.h" +#include "../BC_BinaryBitmap.h" +#include "../BC_DecoderResult.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/BC_CommonBitArray.h" +#include "../common/BC_CommonDecoderResult.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_PDF417DetectorResult.h" +#include "BC_PDF417Detector.h" +#include "BC_PDF417DetectorResult.h" +#include "BC_PDF417Codeword.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417BarcodeValue.h" +#include "BC_PDF417BarcodeMetadata.h" +#include "BC_PDF417BoundingBox.h" +#include "BC_PDF417DetectionResultColumn.h" +#include "BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "BC_PDF417DetectionResult.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417CodewordDecoder.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417ECModulusPoly.h" +#include "BC_PDF417ECModulusGF.h" +#include "BC_PDF417ECErrorCorrection.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417ScanningDecoder.h" +#include "BC_PDF417Reader.h" +#define Integer_MAX_VALUE 2147483647 +CBC_PDF417Reader::CBC_PDF417Reader() +{ +} +CBC_PDF417Reader::~CBC_PDF417Reader() +{ +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + return Decode(image, 0, e); +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString results; + CBC_PDF417DetectorResult* detectorResult = CBC_Detector::detect(image, hints, multiple, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + for (FX_INT32 i = 0; i < detectorResult->getPoints()->GetSize(); i++) { + CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i); + CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4), (CBC_ResultPoint*)points->GetAt(5), + (CBC_ResultPoint*)points->GetAt(6), (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points), getMaxCodewordWidth(*points), e); + if (ResultTemp == NULL) { + delete detectorResult; + e = BCExceptiontNotFoundInstance; + return ""; + } + results += ResultTemp->GetText(); + delete ResultTemp; + } + delete detectorResult; + return results; +} +CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, FALSE, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +FX_INT32 CBC_PDF417Reader::getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) +{ + if (p1 == NULL || p2 == NULL) { + return 0; + } + return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); +} +FX_INT32 CBC_PDF417Reader::getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) +{ + if (p1 == NULL || p2 == NULL) { + return Integer_MAX_VALUE; + } + return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); +} +FX_INT32 CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) +{ + FX_INT32 a = getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 b = getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; + FX_INT32 d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; + return c < d ? c : d; +} +FX_INT32 CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) +{ + FX_INT32 a = getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 b = getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; + FX_INT32 c = getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; + FX_INT32 d = getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; + return c < d ? c : d; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h new file mode 100644 index 0000000000..e6c0236cf7 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Reader.h @@ -0,0 +1,26 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417READER_H_ +#define _BC_PDF417READER_H_ +class CBC_BinaryBitmap; +class CBC_ResultPoint; +class CBC_PDF417Reader; +class CBC_PDF417Reader : public CBC_Reader +{ +public: + CBC_PDF417Reader(); + virtual ~CBC_PDF417Reader(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); +private: + static FX_INT32 getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); + static FX_INT32 getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); + static FX_INT32 getMaxCodewordWidth(CFX_PtrArray& p); + static FX_INT32 getMinCodewordWidth(CFX_PtrArray& p); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp new file mode 100644 index 0000000000..393ee2e75d --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.cpp @@ -0,0 +1,62 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_PDF417ResultMetadata.h" +CBC_PDF417ResultMetadata::CBC_PDF417ResultMetadata() +{ +} +CBC_PDF417ResultMetadata::~CBC_PDF417ResultMetadata() +{ +} +FX_INT32 CBC_PDF417ResultMetadata::getSegmentIndex() +{ + return m_segmentIndex; +} +void CBC_PDF417ResultMetadata::setSegmentIndex(FX_INT32 segmentIndex) +{ + m_segmentIndex = segmentIndex; +} +CFX_ByteString CBC_PDF417ResultMetadata::getFileId() +{ + return m_fileId; +} +void CBC_PDF417ResultMetadata::setFileId(CFX_ByteString fileId) +{ + m_fileId = fileId; +} +CFX_Int32Array& CBC_PDF417ResultMetadata::getOptionalData() +{ + return m_optionalData; +} +void CBC_PDF417ResultMetadata::setOptionalData(CFX_Int32Array &optionalData) +{ + m_optionalData.Copy(optionalData); +} +FX_BOOL CBC_PDF417ResultMetadata::isLastSegment() +{ + return m_lastSegment; +} +void CBC_PDF417ResultMetadata::setLastSegment(FX_BOOL lastSegment) +{ + m_lastSegment = lastSegment; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h new file mode 100644 index 0000000000..e6c7780304 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ResultMetadata.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417READER_H_ +#define _BC_PDF417READER_H_ +class CBC_PDF417ResultMetadata; +class CBC_PDF417ResultMetadata : public CFX_Object +{ +public: + CBC_PDF417ResultMetadata(); + virtual ~CBC_PDF417ResultMetadata(); + FX_INT32 getSegmentIndex(); + void setSegmentIndex(FX_INT32 segmentIndex); + CFX_ByteString getFileId(); + void setFileId(CFX_ByteString fileId); + CFX_Int32Array& getOptionalData(); + void setOptionalData(CFX_Int32Array &optionalData); + FX_BOOL isLastSegment(); + void setLastSegment(FX_BOOL lastSegment); +private: + FX_INT32 m_segmentIndex; + CFX_ByteString m_fileId; + CFX_Int32Array m_optionalData; + FX_BOOL m_lastSegment; +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp new file mode 100644 index 0000000000..2b127ceb07 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp @@ -0,0 +1,596 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_DecoderResult.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_PDF417Codeword.h" +#include "BC_PDF417Common.h" +#include "BC_PDF417BarcodeValue.h" +#include "BC_PDF417BarcodeMetadata.h" +#include "BC_PDF417BoundingBox.h" +#include "BC_PDF417DetectionResultColumn.h" +#include "BC_PDF417DetectionResultRowIndicatorColumn.h" +#include "BC_PDF417DetectionResult.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417CodewordDecoder.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417ECModulusPoly.h" +#include "BC_PDF417ECModulusGF.h" +#include "BC_PDF417ECErrorCorrection.h" +#include "BC_PDF417DecodedBitStreamParser.h" +#include "BC_PDF417ScanningDecoder.h" +FX_INT32 CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2; +FX_INT32 CBC_PDF417ScanningDecoder::MAX_ERRORS = 3; +FX_INT32 CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512; +CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL; +CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() +{ +} +CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() +{ +} +void CBC_PDF417ScanningDecoder::Initialize() +{ + errorCorrection = FX_NEW CBC_PDF417ECErrorCorrection; +} +void CBC_PDF417ScanningDecoder::Finalize() +{ + delete errorCorrection; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, + CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e) +{ + CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL; + CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL; + CBC_DetectionResult* detectionResult = NULL; + for (FX_INT32 i = 0; i < 2; i++) { + if (imageTopLeft != NULL) { + leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopLeft, TRUE, minCodewordWidth, maxCodewordWidth); + } + if (imageTopRight != NULL) { + rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopRight, FALSE, minCodewordWidth, maxCodewordWidth); + } + detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn, e); + if (e != BCExceptionNO) { + e = BCExceptiontNotFoundInstance; + delete leftRowIndicatorColumn; + delete rightRowIndicatorColumn; + delete boundingBox; + return NULL; + } + if (i == 0 && (detectionResult->getBoundingBox()->getMinY() < boundingBox->getMinY() || detectionResult->getBoundingBox()->getMaxY() > boundingBox->getMaxY())) { + delete boundingBox; + boundingBox = detectionResult->getBoundingBox(); + } else { + detectionResult->setBoundingBox(boundingBox); + break; + } + } + FX_INT32 maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1; + detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn); + detectionResult->setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn); + FX_BOOL leftToRight = leftRowIndicatorColumn != NULL; + for (FX_INT32 barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { + FX_INT32 barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; + if (detectionResult->getDetectionResultColumn(barcodeColumn) != NULL) { + continue; + } + CBC_DetectionResultColumn* detectionResultColumn = NULL; + if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { + detectionResultColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn == 0); + } else { + detectionResultColumn = FX_NEW CBC_DetectionResultColumn(boundingBox); + } + detectionResult->setDetectionResultColumn(barcodeColumn, detectionResultColumn); + FX_INT32 startColumn = -1; + FX_INT32 previousStartColumn = startColumn; + for (FX_INT32 imageRow = boundingBox->getMinY(); imageRow <= boundingBox->getMaxY(); imageRow++) { + startColumn = getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); + if (startColumn < 0 || startColumn > boundingBox->getMaxX()) { + if (previousStartColumn == -1) { + continue; + } + startColumn = previousStartColumn; + } + CBC_Codeword* codeword = detectCodeword(image, boundingBox->getMinX(), boundingBox->getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); + if (codeword != NULL) { + detectionResultColumn->setCodeword(imageRow, codeword); + previousStartColumn = startColumn; + minCodewordWidth = minCodewordWidth < codeword->getWidth() ? minCodewordWidth : codeword->getWidth(); + maxCodewordWidth = maxCodewordWidth > codeword->getWidth() ? maxCodewordWidth : codeword->getWidth(); + } + } + } + CBC_CommonDecoderResult* decoderresult = createDecoderResult(detectionResult, e); + if (e != BCExceptionNO) { + delete detectionResult; + return NULL; + } + return decoderresult; +} +CFX_ByteString CBC_PDF417ScanningDecoder::toString(CFX_PtrArray* barcodeMatrix) +{ + CFX_ByteString result; + for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { + result += row; + FX_INT32 l = 0; + for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) { + CBC_BarcodeValue* barcodeValue = (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l); + if (barcodeValue->getValue()->GetSize() == 0) { + result += ""; + } else { + result += barcodeValue->getValue()->GetAt(0); + result += barcodeValue->getConfidence(barcodeValue->getValue()->GetAt(0)); + } + } + } + return result; +} +CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e) +{ + if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) { + e = BCExceptionIllegalArgument; + return NULL; + } + CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn); + if (barcodeMetadata == NULL) { + e = BCExceptionCannotMetadata; + return NULL; + } + CBC_BoundingBox* leftboundingBox = adjustBoundingBox(leftRowIndicatorColumn, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_BoundingBox* rightboundingBox = adjustBoundingBox(rightRowIndicatorColumn, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_BoundingBox* boundingBox = CBC_BoundingBox::merge(leftboundingBox, rightboundingBox, e); + if (e != BCExceptionNO) { + delete barcodeMetadata; + return NULL; + } + CBC_DetectionResult* detectionresult = FX_NEW CBC_DetectionResult(barcodeMetadata, boundingBox); + return detectionresult; +} +CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e) +{ + if (rowIndicatorColumn == NULL) { + return NULL; + } + CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 maxRowHeight = getMax(*rowHeights); + FX_INT32 missingStartRows = 0; + for (FX_INT32 i = 0; i < rowHeights->GetSize(); i++) { + FX_INT32 rowHeight = rowHeights->GetAt(i); + missingStartRows += maxRowHeight - rowHeight; + if (rowHeight > 0) { + break; + } + } + CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords(); + for (FX_INT32 row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL; row++) { + missingStartRows--; + } + FX_INT32 missingEndRows = 0; + for (FX_INT32 row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) { + missingEndRows += maxRowHeight - rowHeights->GetAt(row1); + if (rowHeights->GetAt(row1) > 0) { + break; + } + } + for (FX_INT32 row2 = codewords->GetSize() - 1; missingEndRows > 0 && codewords->GetAt(row2) == NULL; row2--) { + missingEndRows--; + } + CBC_BoundingBox* boundingBox = rowIndicatorColumn->getBoundingBox()->addMissingRows(missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return boundingBox; +} +FX_INT32 CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) +{ + FX_INT32 maxValue = -1; + for (FX_INT32 i = 0; i < values.GetSize(); i++) { + FX_INT32 value = values.GetAt(i); + maxValue = maxValue > value ? maxValue : value; + } + return maxValue; +} +CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, + CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) +{ + CBC_BarcodeMetadata* leftBarcodeMetadata = NULL; + CBC_BarcodeMetadata* rightBarcodeMetadata = NULL; + if (leftRowIndicatorColumn == NULL || (leftBarcodeMetadata = leftRowIndicatorColumn->getBarcodeMetadata()) == NULL) { + return rightRowIndicatorColumn == NULL ? NULL : rightRowIndicatorColumn->getBarcodeMetadata(); + } + if (rightRowIndicatorColumn == NULL || (rightBarcodeMetadata = rightRowIndicatorColumn->getBarcodeMetadata()) == NULL) { + return leftRowIndicatorColumn == NULL ? NULL : leftRowIndicatorColumn->getBarcodeMetadata(); + } + if (leftBarcodeMetadata->getColumnCount() != rightBarcodeMetadata->getColumnCount() && + leftBarcodeMetadata->getErrorCorrectionLevel() != rightBarcodeMetadata->getErrorCorrectionLevel() && + leftBarcodeMetadata->getRowCount() != rightBarcodeMetadata->getRowCount()) { + delete leftBarcodeMetadata; + delete rightBarcodeMetadata; + return NULL; + } + delete rightBarcodeMetadata; + return leftBarcodeMetadata; +} +CBC_DetectionResultRowIndicatorColumn* CBC_PDF417ScanningDecoder::getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, + FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, leftToRight); + for (FX_INT32 i = 0; i < 2; i++) { + FX_INT32 increment = i == 0 ? 1 : -1; + FX_INT32 startColumn = (FX_INT32) startPoint.GetX(); + for (FX_INT32 imageRow = (FX_INT32) startPoint.GetY(); imageRow <= boundingBox->getMaxY() && imageRow >= boundingBox->getMinY(); imageRow += increment) { + CBC_Codeword* codeword = detectCodeword(image, 0, image->GetWidth(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); + if (codeword != NULL) { + rowIndicatorColumn->setCodeword(imageRow, codeword); + if (leftToRight) { + startColumn = codeword->getStartX(); + } else { + startColumn = codeword->getEndX(); + } + } + } + } + return rowIndicatorColumn; +} +void CBC_PDF417ScanningDecoder::adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e) +{ + CFX_Int32Array* numberOfCodewords = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->getValue(); + FX_INT32 calculatedNumberOfCodewords = detectionResult->getBarcodeColumnCount() * detectionResult->getBarcodeRowCount() - getNumberOfECCodeWords(detectionResult->getBarcodeECLevel()); + if (numberOfCodewords->GetSize() == 0) { + if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) { + e = BCExceptiontNotFoundInstance; + delete numberOfCodewords; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); + } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) { + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); + } + delete numberOfCodewords; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e) +{ + CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult); + adjustCodewordCount(detectionResult, barcodeMatrix, e); + if (e != BCExceptionNO) { + for (FX_INT32 i = 0; i < barcodeMatrix->GetSize(); i++) { + CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_BarcodeValue*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + barcodeMatrix->RemoveAll(); + delete barcodeMatrix; + return NULL; + } + CFX_Int32Array erasures; + CFX_Int32Array codewords; + codewords.SetSize(detectionResult->getBarcodeRowCount() * detectionResult->getBarcodeColumnCount()); + CFX_PtrArray ambiguousIndexValuesList; + CFX_Int32Array ambiguousIndexesList; + for (FX_INT32 row = 0; row < detectionResult->getBarcodeRowCount(); row++) { + for (FX_INT32 l = 0; l < detectionResult->getBarcodeColumnCount(); l++) { + CFX_Int32Array* values = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l + 1))->getValue(); + FX_INT32 codewordIndex = row * detectionResult->getBarcodeColumnCount() + l; + if (values->GetSize() == 0) { + erasures.Add(codewordIndex); + } else if (values->GetSize() == 1) { + codewords[codewordIndex] = values->GetAt(0); + } else { + ambiguousIndexesList.Add(codewordIndex); + ambiguousIndexValuesList.Add(values); + } + } + } + CFX_PtrArray ambiguousIndexValues; + ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize()); + for (FX_INT32 i = 0; i < ambiguousIndexValues.GetSize(); i++) { + ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i)); + } + for (FX_INT32 l = 0; l < barcodeMatrix->GetSize(); l++) { + CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l); + for (FX_INT32 j = 0; j < temp->GetSize(); j++) { + delete (CBC_BarcodeValue*)temp->GetAt(j); + } + temp->RemoveAll(); + delete temp; + } + barcodeMatrix->RemoveAll(); + delete barcodeMatrix; + CBC_CommonDecoderResult* decoderResult = createDecoderResultFromAmbiguousValues(detectionResult->getBarcodeECLevel(), codewords, erasures, ambiguousIndexesList, ambiguousIndexValues, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return decoderResult; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, + CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e) +{ + CFX_Int32Array ambiguousIndexCount; + ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize()); + FX_INT32 tries = 100; + while (tries-- > 0) { + for (FX_INT32 l = 0; l < ambiguousIndexCount.GetSize(); l++) { + codewords[ambiguousIndexes[l]] = ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))->GetAt(ambiguousIndexCount[l]); + } + CBC_CommonDecoderResult* decoderResult = decodeCodewords(codewords, ecLevel, erasureArray, e); + if (e != BCExceptionNO) { + e = BCExceptionNO; + continue; + } else { + return decoderResult; + } + if (ambiguousIndexCount.GetSize() == 0) { + e = BCExceptionChecksumInstance; + return NULL; + } + for (FX_INT32 i = 0; i < ambiguousIndexCount.GetSize(); i++) { + if (ambiguousIndexCount[i] < ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) { + ambiguousIndexCount[i]++; + break; + } else { + ambiguousIndexCount[i] = 0; + if (i == ambiguousIndexCount.GetSize() - 1) { + e = BCExceptionChecksumInstance; + return NULL; + } + } + } + } + e = BCExceptionChecksumInstance; + return NULL; +} +CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(CBC_DetectionResult* detectionResult) +{ + CFX_PtrArray* barcodeMatrix = FX_NEW CFX_PtrArray; + barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount()); + CFX_PtrArray* temp = NULL; + FX_INT32 colume = 0; + for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { + temp = FX_NEW CFX_PtrArray; + temp->SetSize(detectionResult->getBarcodeColumnCount() + 2); + for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2; colume++) { + temp->SetAt(colume, FX_NEW CBC_BarcodeValue()); + } + barcodeMatrix->SetAt(row, temp); + } + colume = -1; + for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumns().GetSize(); i++) { + CBC_DetectionResultColumn* detectionResultColumn = (CBC_DetectionResultColumn*) detectionResult->getDetectionResultColumns().GetAt(i); + colume++; + if (detectionResultColumn == NULL) { + continue; + } + CFX_PtrArray* temp = detectionResultColumn->getCodewords(); + for (FX_INT32 l = 0; l < temp->GetSize(); l++) { + CBC_Codeword* codeword = (CBC_Codeword*) temp->GetAt(l); + if (codeword == NULL || codeword->getRowNumber() == -1) { + continue; + } + ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(codeword->getRowNumber()))->GetAt(colume))->setValue(codeword->getValue()); + } + } + return barcodeMatrix; +} +FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn) +{ + return barcodeColumn >= 0 && barcodeColumn <= detectionResult->getBarcodeColumnCount() + 1; +} +FX_INT32 CBC_PDF417ScanningDecoder::getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight) +{ + FX_INT32 offset = leftToRight ? 1 : -1; + CBC_Codeword* codeword = NULL; + if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodeword(imageRow); + } + if (codeword != NULL) { + return leftToRight ? codeword->getEndX() : codeword->getStartX(); + } + codeword = detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewordNearby(imageRow); + if (codeword != NULL) { + return leftToRight ? codeword->getStartX() : codeword->getEndX(); + } + if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodewordNearby(imageRow); + } + if (codeword != NULL) { + return leftToRight ? codeword->getEndX() : codeword->getStartX(); + } + FX_INT32 skippedColumns = 0; + while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { + barcodeColumn -= offset; + for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetSize(); i++) { + CBC_Codeword* previousRowCodeword = (CBC_Codeword*) detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetAt(i); + if (previousRowCodeword != NULL) { + return (leftToRight ? previousRowCodeword->getEndX() : previousRowCodeword->getStartX()) + + offset * skippedColumns * (previousRowCodeword->getEndX() - previousRowCodeword->getStartX()); + } + } + skippedColumns++; + } + return leftToRight ? detectionResult->getBoundingBox()->getMinX() : detectionResult->getBoundingBox()->getMaxX(); +} +CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, + FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); + CFX_Int32Array* moduleBitCount = getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); + if (moduleBitCount == NULL) { + return NULL; + } + FX_INT32 endColumn; + FX_INT32 codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount); + if (leftToRight) { + endColumn = startColumn + codewordBitCount; + } else { + for (FX_INT32 i = 0; i < moduleBitCount->GetSize() >> 1; i++) { + FX_INT32 tmpCount = moduleBitCount->GetAt(i); + moduleBitCount->SetAt(i, moduleBitCount->GetAt(moduleBitCount->GetSize() - 1 - i)); + moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount); + } + endColumn = startColumn; + startColumn = endColumn - codewordBitCount; + } + FX_INT32 decodedValue = CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBitCount); + FX_INT32 codeword = CBC_PDF417Common::getCodeword(decodedValue); + delete moduleBitCount; + if (codeword == -1) { + return NULL; + } + return FX_NEW CBC_Codeword(startColumn, endColumn, getCodewordBucketNumber(decodedValue), codeword); +} +CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow) +{ + FX_INT32 imageColumn = startColumn; + CFX_Int32Array* moduleBitCount = FX_NEW CFX_Int32Array; + moduleBitCount->SetSize(8); + FX_INT32 moduleNumber = 0; + FX_INT32 increment = leftToRight ? 1 : -1; + FX_BOOL previousPixelValue = leftToRight; + while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageColumn >= minColumn)) && moduleNumber < moduleBitCount->GetSize()) { + if (image->Get(imageColumn, imageRow) == previousPixelValue) { + moduleBitCount->SetAt(moduleNumber, moduleBitCount->GetAt(moduleNumber) + 1); + imageColumn += increment; + } else { + moduleNumber++; + previousPixelValue = !previousPixelValue; + } + } + if (moduleNumber == moduleBitCount->GetSize() || (((leftToRight && imageColumn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber == moduleBitCount->GetSize() - 1)) { + return moduleBitCount; + } + delete moduleBitCount; + return NULL; +} +FX_INT32 CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(FX_INT32 barcodeECLevel) +{ + return 2 << barcodeECLevel; +} +FX_INT32 CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow) +{ + FX_INT32 correctedStartColumn = codewordStartColumn; + FX_INT32 increment = leftToRight ? -1 : 1; + for (FX_INT32 i = 0; i < 2; i++) { + FX_BOOL l = image->Get(correctedStartColumn, imageRow); + while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRight && correctedStartColumn < maxColumn)) && leftToRight == image->Get(correctedStartColumn, imageRow)) { + if (abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_SIZE) { + return codewordStartColumn; + } + correctedStartColumn += increment; + } + increment = -increment; + leftToRight = !leftToRight; + } + return correctedStartColumn; +} +FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) +{ + return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE; +} +CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e) +{ + if (codewords.GetSize() == 0) { + e = BCExceptionFormatInstance; + return NULL; + } + FX_INT32 numECCodewords = 1 << (ecLevel + 1); + FX_INT32 correctedErrorsCount = correctErrors(codewords, erasures, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e , NULL); + verifyCodewordCount(codewords, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_ByteString bytestring; + CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(codewords, bytestring.FormatInteger(ecLevel), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return decoderResult; +} +FX_INT32 CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e) +{ + if ((erasures.GetSize() != 0 && erasures.GetSize() > (numECCodewords / 2 + MAX_ERRORS)) || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { + e = BCExceptionChecksumInstance; + return -1; + } + FX_INT32 result = CBC_PDF417ECErrorCorrection::decode(codewords, numECCodewords, erasures, e); + BC_EXCEPTION_CHECK_ReturnValue(e, -1); + return result; +} +void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e) +{ + if (codewords.GetSize() < 4) { + e = BCExceptionFormatInstance; + return; + } + FX_INT32 numberOfCodewords = codewords.GetAt(0); + if (numberOfCodewords > codewords.GetSize()) { + e = BCExceptionFormatInstance; + return; + } + if (numberOfCodewords == 0) { + if (numECCodewords < codewords.GetSize()) { + codewords[0] = codewords.GetSize() - numECCodewords; + } else { + e = BCExceptionFormatInstance; + return; + } + } +} +CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(FX_INT32 codeword) +{ + CFX_Int32Array* result = FX_NEW CFX_Int32Array; + result->SetSize(8); + FX_INT32 previousValue = 0; + FX_INT32 i = result->GetSize() - 1; + while (TRUE) { + if ((codeword & 0x1) != previousValue) { + previousValue = codeword & 0x1; + i--; + if (i < 0) { + break; + } + } + result->SetAt(i, result->GetAt(i) + 1); + codeword >>= 1; + } + return result; +} +FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(FX_INT32 codeword) +{ + CFX_Int32Array* array = getBitCountForCodeword(codeword); + FX_INT32 result = getCodewordBucketNumber(*array); + delete array; + return result; +} +FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(CFX_Int32Array& moduleBitCount) +{ + return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) + moduleBitCount.GetAt(4) - moduleBitCount.GetAt(6) + 9) % 9; +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h new file mode 100644 index 0000000000..924e5f798a --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h @@ -0,0 +1,61 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417SCANNINGDECODER_H_ +#define _BC_PDF417SCANNINGDECODER_H_ +class CBC_CommonDecoderResult; +class CBC_CommonBitMatrix; +class CBC_ErrorCorrection; +class CBC_Codeword; +class CBC_BoundingBox; +class CBC_ResultPoint; +class CBC_BarcodeMetadata; +class CBC_BarcodeValue; +class CBC_DetectionResult; +class CBC_DetectionResultRowIndicatorColumn; +class CBC_PDF417ScanningDecoder; +class CBC_PDF417ScanningDecoder : public CFX_Object +{ +public: + CBC_PDF417ScanningDecoder(); + virtual ~CBC_PDF417ScanningDecoder(); + static void Initialize(); + static void Finalize(); + static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, + CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e); + static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix); +private: + static FX_INT32 CODEWORD_SKEW_SIZE; + static FX_INT32 MAX_ERRORS; + static FX_INT32 MAX_EC_CODEWORDS; + static CBC_PDF417ECErrorCorrection* errorCorrection; + static CBC_DetectionResult* merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e); + static CBC_BoundingBox* adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e); + static FX_INT32 getMax(CFX_Int32Array& values); + static CBC_BarcodeMetadata* getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn); + static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, + FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static void adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e); + static CBC_CommonDecoderResult* createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e); + static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, + CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e); + static CFX_PtrArray* createBarcodeMatrix(CBC_DetectionResult* detectionResult); + static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn); + static FX_INT32 getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight); + static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, + FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow); + static FX_INT32 getNumberOfECCodeWords(FX_INT32 barcodeECLevel); + static FX_INT32 adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow); + static FX_BOOL checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); + static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e); + static FX_INT32 correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e); + static void verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e); + static CFX_Int32Array* getBitCountForCodeword(FX_INT32 codeword); + static FX_INT32 getCodewordBucketNumber(FX_INT32 codeword); + static FX_INT32 getCodewordBucketNumber(CFX_Int32Array& moduleBitCount); +}; +#endif diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp new file mode 100644 index 0000000000..86951c91e9 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.cpp @@ -0,0 +1,126 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_TwoDimWriter.h" +#include "../common/BC_CommonBitArray.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_PDF417Compaction.h" +#include "BC_PDF417.h" +#include "BC_PDF417BarcodeMatrix.h" +#include "BC_PDF417Writer.h" +CBC_PDF417Writer::CBC_PDF417Writer() +{ + m_bFixedSize = FALSE; +} +CBC_PDF417Writer::~CBC_PDF417Writer() +{ + m_bTruncated = TRUE; +} +FX_BOOL CBC_PDF417Writer:: SetErrorCorrectionLevel(FX_INT32 level) +{ + if (level < 0 || level > 8) { + return FALSE; + } + m_iCorrectLevel = level; + return TRUE; +} +void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) +{ + m_bTruncated = truncated; +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + if ( format != BCFORMAT_PDF_417) { + return NULL; + } + CFX_WideString encodeContents = contents.UTF8Decode(); + return Encode(encodeContents, outWidth, outHeight, e ); +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE* CBC_PDF417Writer::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + CBC_PDF417 encoder; + FX_INT32 col = (m_Width / m_ModuleWidth - 69) / 17; + FX_INT32 row = m_Height / (m_ModuleWidth * 20); + if (row >= 3 && row <= 90 && col >= 1 && col <= 30) { + encoder.setDimensions(col, col, row, row); + } else if (col >= 1 && col <= 30) { + encoder.setDimensions(col, col, 90, 3); + } else if (row >= 3 && row <= 90) { + encoder.setDimensions(30, 1, row, row); + } + encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 lineThickness = 2; + FX_INT32 aspectRatio = 4; + CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix(); + CFX_ByteArray originalScale; + originalScale.Copy(barcodeMatrix->getScaledMatrix(lineThickness, aspectRatio * lineThickness)); + FX_INT32 width = outWidth; + FX_INT32 height = outHeight; + outWidth = barcodeMatrix->getWidth(); + outHeight = barcodeMatrix->getHeight(); + FX_BOOL rotated = FALSE; + if ((height > width) ^ (outWidth < outHeight)) { + rotateArray(originalScale, outHeight, outWidth); + rotated = TRUE; + FX_INT32 temp = outHeight; + outHeight = outWidth; + outWidth = temp; + } + FX_INT32 scaleX = width / outWidth; + FX_INT32 scaleY = height / outHeight; + FX_INT32 scale; + if (scaleX < scaleY) { + scale = scaleX; + } else { + scale = scaleY; + } + if (scale > 1) { + originalScale.RemoveAll(); + originalScale.Copy(barcodeMatrix->getScaledMatrix(scale * lineThickness, scale * aspectRatio * lineThickness)); + if (rotated) { + rotateArray(originalScale, outHeight, outWidth); + FX_INT32 temp = outHeight; + outHeight = outWidth; + outWidth = temp; + } + } + FX_BYTE* result = (FX_BYTE*)FX_Alloc(FX_BYTE, outHeight * outWidth); + FXSYS_memcpy32(result, originalScale.GetData(), outHeight * outWidth); + return result; +} +void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray, FX_INT32 height, FX_INT32 width) +{ + CFX_ByteArray temp; + temp.Copy(bitarray); + for (FX_INT32 ii = 0; ii < height; ii++) { + FX_INT32 inverseii = height - ii - 1; + for (FX_INT32 jj = 0; jj < width; jj++) { + bitarray[jj * height + inverseii] = temp[ii * width + jj]; + } + } +} diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h new file mode 100644 index 0000000000..5d974f9377 --- /dev/null +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h @@ -0,0 +1,26 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_PDF417WRITER_H_ +#define _BC_PDF417WRITER_H_ +class CBC_TwoDimWriter; +class CBC_PDF417Writer; +class CBC_PDF417Writer : public CBC_TwoDimWriter +{ +public: + CBC_PDF417Writer(); + virtual ~CBC_PDF417Writer(); + FX_BYTE * Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); + void SetTruncated(FX_BOOL truncated); +private: + void rotateArray(CFX_ByteArray& bitarray, FX_INT32 width, FX_INT32 height); + FX_BOOL m_bTruncated; +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp new file mode 100644 index 0000000000..b3c6f3f8a3 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.cpp @@ -0,0 +1,48 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "BC_QRFinderPattern.h" +#include "BC_FinderPatternInfo.h" +CBC_QRFinderPatternInfo::CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters) +{ + m_bottomLeft = (CBC_QRFinderPattern*)(*patternCenters)[0]; + m_topLeft = (CBC_QRFinderPattern*)(*patternCenters)[1]; + m_topRight = (CBC_QRFinderPattern*)(*patternCenters)[2]; +} +CBC_QRFinderPatternInfo::~CBC_QRFinderPatternInfo() +{ +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetBottomLeft() +{ + return m_bottomLeft; +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopLeft() +{ + return m_topLeft; +} +CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopRight() +{ + return m_topRight; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h new file mode 100644 index 0000000000..bac9291947 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_FinderPatternInfo.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_FINDERPATTERNINFO_H_ +#define _BC_FINDERPATTERNINFO_H_ +class CBC_QRFinderPattern; +class CBC_QRFinderPatternInfo; +class CBC_QRFinderPatternInfo : public CFX_Object +{ +private: + CBC_QRFinderPattern *m_bottomLeft; + CBC_QRFinderPattern *m_topLeft; + CBC_QRFinderPattern *m_topRight; +public: + CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters); + virtual ~CBC_QRFinderPatternInfo(); + CBC_QRFinderPattern* GetBottomLeft(); + CBC_QRFinderPattern* GetTopLeft(); + CBC_QRFinderPattern* GetTopRight(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp new file mode 100644 index 0000000000..e1ee168e72 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.cpp @@ -0,0 +1,52 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "BC_QRAlignmentPattern.h" +CBC_QRAlignmentPattern::CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize): + CBC_ResultPoint(posX, posY), m_moduleSize(estimateModuleSize) +{ +} +CBC_QRAlignmentPattern::~CBC_QRAlignmentPattern() +{ +} +FX_FLOAT CBC_QRAlignmentPattern::GetX() +{ + return m_x; +} +FX_FLOAT CBC_QRAlignmentPattern::GetY() +{ + return m_y; +} +FX_BOOL CBC_QRAlignmentPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) +{ + if ((FXSYS_fabs(i - GetY()) <= moduleSize) && (FXSYS_fabs(j - GetX()) <= moduleSize)) { + FX_FLOAT moduleSizeDiff = FXSYS_fabs(moduleSize - m_moduleSize); + return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_moduleSize <= 1.0f); + } + return FALSE; +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPattern::Clone() +{ + return FX_NEW CBC_QRAlignmentPattern(m_x, m_y, m_moduleSize); +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h new file mode 100644 index 0000000000..a52687b6b7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPattern.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRALIGNMENTPATTERN_H_ +#define _BC_QRALIGNMENTPATTERN_H_ +class CBC_CommonBitArray; +class CBC_ResultPoint; +class CBC_REAI013x0x1xDecoder; +class CBC_QRAlignmentPattern : public CBC_ResultPoint +{ +private: + FX_FLOAT m_moduleSize; +public: + CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize); + virtual ~CBC_QRAlignmentPattern(); + FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); + FX_FLOAT GetX(); + FX_FLOAT GetY(); + CBC_QRAlignmentPattern *Clone(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp new file mode 100644 index 0000000000..669a0fbf7e --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp @@ -0,0 +1,187 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRAlignmentPattern.h" +#include "BC_QRAlignmentPatternFinder.h" +CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, + FX_INT32 startX, + FX_INT32 startY, + FX_INT32 width, + FX_INT32 height, + FX_FLOAT moduleSize): m_image(image), + m_startX(startX), + m_startY(startY), + m_width(width), + m_height(height), + m_moduleSize(moduleSize) + +{ + m_crossCheckStateCount.SetSize(3); +} +CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() +{ + for (FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { + delete (CBC_QRAlignmentPattern*)m_possibleCenters[i]; + } + m_possibleCenters.RemoveAll(); +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::Find(FX_INT32 &e) +{ + FX_INT32 startX = m_startX; + FX_INT32 height = m_height; + FX_INT32 maxJ = startX + m_width; + FX_INT32 middleI = m_startY + (height >> 1); + CFX_Int32Array stateCount; + stateCount.SetSize(3); + for (FX_INT32 iGen = 0; iGen < height; iGen++) { + FX_INT32 i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1)); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + FX_INT32 j = startX; + while (j < maxJ && !m_image->Get(j, i)) { + j++; + } + FX_INT32 currentState = 0; + while (j < maxJ) { + if (m_image->Get(j, i)) { + if (currentState == 1) { + stateCount[currentState]++; + } else { + if (currentState == 2) { + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, j); + if (confirmed != NULL) { + return confirmed; + } + } + stateCount[0] = stateCount[2]; + stateCount[1] = 1; + stateCount[2] = 0; + currentState = 1; + } else { + stateCount[++currentState]++; + } + } + } else { + if (currentState == 1) { + currentState++; + } + stateCount[currentState]++; + } + j++; + } + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, maxJ); + if (confirmed != NULL) { + return confirmed; + } + } + } + if (m_possibleCenters.GetSize() != 0) { + return ((CBC_QRAlignmentPattern*) (m_possibleCenters[0]) )->Clone(); + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) +{ + return (FX_FLOAT) (end - stateCount[2]) - stateCount[1] / 2.0f; +} +FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) +{ + FX_FLOAT moduleSize = m_moduleSize; + FX_FLOAT maxVariance = moduleSize / 2.0f; + for (FX_INT32 i = 0; i < 3; i++) { + if (fabs(moduleSize - stateCount[i]) >= maxVariance) { + return false; + } + } + return TRUE; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxI = m_image->GetHeight(); + CFX_Int32Array stateCount; + stateCount.Copy(m_crossCheckStateCount); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + FX_INT32 i = startI; + while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if (i < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if (stateCount[0] > maxCount) { + return FXSYS_nan(); + } + i = startI + 1; + while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i++; + } + if (i == maxI || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) { + stateCount[2]++; + i++; + } + if (stateCount[2] > maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); +} +CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) +{ + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + FX_FLOAT centerJ = CenterFromEnd(stateCount, j); + FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, 2 * stateCount[1], stateCountTotal); + if (!FXSYS_isnan(centerI)) { + FX_FLOAT estimatedModuleSize = (FX_FLOAT) (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; + FX_INT32 max = m_possibleCenters.GetSize(); + for (FX_INT32 index = 0; index < max; index++) { + CBC_QRAlignmentPattern *center = (CBC_QRAlignmentPattern *)(m_possibleCenters[index]); + if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { + return FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize); + } + } + m_possibleCenters.Add(FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize)); + } + return NULL; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h new file mode 100644 index 0000000000..5471c4e62a --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRALIGNMENTPATTERNFINDER_H_ +#define _BC_QRALIGNMENTPATTERNFINDER_H_ +class CBC_CommonBitMatrix; +class CBC_QRAlignmentPattern; +class CBC_QRAlignmentPatternFinder; +class CBC_QRAlignmentPatternFinder : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_image; + CFX_PtrArray m_possibleCenters; + FX_INT32 m_startX; + FX_INT32 m_startY; + FX_INT32 m_width; + FX_INT32 m_height; + FX_FLOAT m_moduleSize; + CFX_Int32Array m_crossCheckStateCount; +public: + CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, FX_INT32 startX, FX_INT32 startY, FX_INT32 width, FX_INT32 height, FX_FLOAT moduleSize); + virtual ~CBC_QRAlignmentPatternFinder(); + FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); + FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 startJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); + CBC_QRAlignmentPattern* Find(FX_INT32 &e); + CBC_QRAlignmentPattern *HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); + static FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp new file mode 100644 index 0000000000..7c85c58367 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.cpp @@ -0,0 +1,185 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRCoderVersion.h" +#include "BC_QRCoderFormatInformation.h" +#include "BC_QRDataMask.h" +#include "BC_QRBitMatrixParser.h" +CBC_QRBitMatrixParser::CBC_QRBitMatrixParser() +{ +} +void CBC_QRBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) +{ + m_dimension = bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + m_tempBitMatrix = bitMatrix; + if(m_dimension < 21 || (m_dimension & 0x03) != 1) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + m_bitMatrix = m_tempBitMatrix; + m_parsedFormatInfo = NULL; + m_version = NULL; +} +CBC_QRBitMatrixParser::~CBC_QRBitMatrixParser() +{ + if(m_parsedFormatInfo != NULL) { + delete m_parsedFormatInfo; + m_parsedFormatInfo = NULL; + } + m_version = NULL; +} +CBC_QRCoderFormatInformation* CBC_QRBitMatrixParser::ReadFormatInformation(FX_INT32 &e) +{ + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + FX_INT32 formatInfoBits = 0; + FX_INT32 j; + for( j = 0; j < 6; j++) { + formatInfoBits = CopyBit(8, j, formatInfoBits); + } + formatInfoBits = CopyBit(8, 7, formatInfoBits); + formatInfoBits = CopyBit(8, 8, formatInfoBits); + formatInfoBits = CopyBit(7, 8, formatInfoBits); + for(FX_INT32 i = 5; i >= 0; i--) { + formatInfoBits = CopyBit(i, 8, formatInfoBits); + } + m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + formatInfoBits = 0; + FX_INT32 iMin = dimension - 8; + for(j = dimension - 1; j >= iMin; j--) { + formatInfoBits = CopyBit(j, 8, formatInfoBits); + } + for(FX_INT32 k = dimension - 7; k < dimension; k++) { + formatInfoBits = CopyBit(8, k , formatInfoBits); + } + m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); + if(m_parsedFormatInfo != NULL) { + return m_parsedFormatInfo; + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +CBC_QRCoderVersion* CBC_QRBitMatrixParser::ReadVersion(FX_INT32 &e) +{ + if(m_version != NULL) { + return m_version; + } + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 provisionVersion = (dimension - 17) >> 2; + if(provisionVersion <= 6) { + CBC_QRCoderVersion* qrv = CBC_QRCoderVersion::GetVersionForNumber(provisionVersion, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qrv; + } + FX_INT32 versionBits = 0; + for (FX_INT32 i = 5; i >= 0; i--) { + FX_INT32 jMin = dimension - 11; + for (FX_INT32 j = dimension - 9; j >= jMin; j--) { + versionBits = CopyBit(i, j, versionBits); + } + } + m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { + return m_version; + } + versionBits = 0; + for (FX_INT32 j = 5; j >= 0; j--) { + FX_INT32 iMin = dimension - 11; + for (FX_INT32 i = dimension - 9; i >= iMin; i--) { + versionBits = CopyBit(i, j, versionBits); + } + } + m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { + return m_version; + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_INT32 CBC_QRBitMatrixParser::CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits) +{ + return m_bitMatrix->Get(j, i) ? (versionBits << 1) | 0x1 : versionBits << 1; +} +CFX_ByteArray* CBC_QRBitMatrixParser::ReadCodewords(FX_INT32 &e) +{ + CBC_QRCoderFormatInformation *formatInfo = ReadFormatInformation(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL) + CBC_QRCoderVersion *version = ReadVersion(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRDataMask *dataMask = CBC_QRDataMask::ForReference((FX_INT32)(formatInfo->GetDataMask()), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 dimension = m_bitMatrix->GetDimension(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + dataMask->UnmaskBitMatirx(m_bitMatrix, dimension); + CBC_CommonBitMatrix* cbm = version->BuildFunctionPattern(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr functionPattern(cbm); + FX_BOOL readingUp = TRUE; + CFX_ByteArray * temp = FX_NEW CFX_ByteArray; + temp->SetSize(version->GetTotalCodeWords()); + CBC_AutoPtr result(temp); + FX_INT32 resultOffset = 0; + FX_INT32 currentByte = 0; + FX_INT32 bitsRead = 0; + for(FX_INT32 j = dimension - 1; j > 0; j -= 2) { + if(j == 6) { + j--; + } + for(FX_INT32 count = 0; count < dimension; count++) { + FX_INT32 i = readingUp ? dimension - 1 - count : count; + for(FX_INT32 col = 0; col < 2; col++) { + if(!functionPattern->Get(j - col, i)) { + bitsRead++; + currentByte <<= 1; + if(m_bitMatrix->Get(j - col, i)) { + currentByte |= 1; + } + if(bitsRead == 8) { + (*result)[resultOffset++] = (FX_BYTE) currentByte; + bitsRead = 0; + currentByte = 0; + } + } + } + } + readingUp ^= TRUE; + } + if(resultOffset != version->GetTotalCodeWords()) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h new file mode 100644 index 0000000000..2e176f63d3 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRBitMatrixParser.h @@ -0,0 +1,31 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRABITMATRIXPARSER_H_ +#define _BC_QRABITMATRIXPARSER_H_ +class CBC_CommonBitMatrix ; +class CBC_QRCoderVersion; +class CBC_QRCoderFormatInformation; +class CBC_QRDataMask; +class CBC_QRBitMatrixParser; +class CBC_QRBitMatrixParser : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_bitMatrix; + CBC_CommonBitMatrix *m_tempBitMatrix; + CBC_QRCoderVersion *m_version; + CBC_QRCoderFormatInformation *m_parsedFormatInfo; + FX_INT32 m_dimension; +public: + CBC_QRBitMatrixParser(); + virtual ~CBC_QRBitMatrixParser(); + CBC_QRCoderFormatInformation *ReadFormatInformation(FX_INT32 &e); + CBC_QRCoderVersion *ReadVersion(FX_INT32 &e); + FX_INT32 CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits); + CFX_ByteArray *ReadCodewords(FX_INT32 &e); + virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp new file mode 100644 index 0000000000..f12c4e0ad3 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.cpp @@ -0,0 +1,111 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_Reader.h" +#include "../BC_LuminanceSource.h" +#include "../BC_BufferedImageLuminanceSource.h" +#include "../BC_Binarizer.h" +#include "../BC_BinaryBitmap.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_GlobalHistogramBinarizer.h" +#include "../common/BC_CommonDecoderResult.h" +#include "../common/reedsolomon/BC_ReedSolomonGF256.h" +#include "BC_QRCodeReader.h" +#include "BC_QRCodeReader.h" +#include "BC_QRCoderMode.h" +#include "BC_QRCoderDecoder.h" +#include "BC_QRDetector.h" +#include "BC_QRDetectorResult.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRDataMask.h" +#include "BC_QRCodeReader.h" +#include "BC_QRCoderVersion.h" +CBC_QRCodeReader::CBC_QRCodeReader(): m_decoder(NULL) +{ +} +void CBC_QRCodeReader::Init() +{ + m_decoder = FX_NEW CBC_QRCoderDecoder; + m_decoder->Init(); +} +CBC_QRCodeReader::~CBC_QRCodeReader() +{ + if(m_decoder != NULL) { + delete m_decoder; + } + m_decoder = NULL; +} +CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) +{ + CBC_CommonBitMatrix *matrix = image->GetMatrix(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_QRDetector detector(matrix); + CBC_QRDetectorResult* qdr = detector.Detect(hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr detectorResult(qdr); + CBC_CommonDecoderResult* qdr2 = m_decoder->Decode(detectorResult->GetBits(), 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_AutoPtr decodeResult(qdr2); + return (decodeResult->GetText()); +} +CFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(filename); + source.Init(e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bs = Decode(&bitmap, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +CFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_BufferedImageLuminanceSource source(pBitmap); + CBC_GlobalHistogramBinarizer binarizer(&source); + CBC_BinaryBitmap bitmap(&binarizer); + CFX_ByteString bs = Decode(&bitmap, hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) +{ + CFX_ByteString bs = Decode(image, 0, e); + BC_EXCEPTION_CHECK_ReturnValue(e, ""); + return bs; +} +void CBC_QRCodeReader::ReleaseAll() +{ + if(CBC_ReedSolomonGF256 ::QRCodeFild) { + delete CBC_ReedSolomonGF256 ::QRCodeFild; + CBC_ReedSolomonGF256 ::QRCodeFild = NULL; + } + if(CBC_ReedSolomonGF256 ::DataMatrixField) { + delete CBC_ReedSolomonGF256 ::DataMatrixField; + CBC_ReedSolomonGF256 ::DataMatrixField = NULL; + } + CBC_QRCoderMode::Destroy(); + CBC_QRCoderErrorCorrectionLevel::Destroy(); + CBC_QRDataMask::Destroy(); + CBC_QRCoderVersion::Destroy(); +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h new file mode 100644 index 0000000000..71a1ad3dd6 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCodeReader.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODEREADER_H_ +#define _BC_QRCODEREADER_H_ +class CBC_QRDetector; +class CBC_BinaryBitmap; +class CBC_QRCoderDecoder; +class CBC_ResultPoint; +class CBC_ReedSolomonGF256; +class CBC_QRCoderVersion; +class CBC_QRDetector; +class CBC_QRDetectorResult; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderMode; +class CBC_QRDataMask; +class CBC_QRCodeReader; +class CBC_QRCodeReader : public CBC_Reader +{ +private: + CBC_QRCoderDecoder *m_decoder; +public: + CBC_QRCodeReader(); + virtual ~CBC_QRCodeReader(); + CFX_ByteString Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); + CFX_ByteString Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); + static void ReleaseAll(); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); + CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp new file mode 100644 index 0000000000..ccc0220d6c --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.cpp @@ -0,0 +1,103 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_TwoDimWriter.h" +#include "../BC_Reader.h" +#include "../common/BC_CommonByteMatrix.h" +#include "BC_QRCodeWriter.h" +#include "BC_QRCoderEncoder.h" +#include "BC_QRCoder.h" +#include "BC_QRCodeReader.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +CBC_QRCodeWriter::CBC_QRCodeWriter() +{ + m_bFixedSize = TRUE; + m_iCorrectLevel = 1; + m_iVersion = 0; +} +CBC_QRCodeWriter::~CBC_QRCodeWriter() +{ +} +void CBC_QRCodeWriter::ReleaseAll() +{ + CBC_QRCodeReader::ReleaseAll(); +} +FX_BOOL CBC_QRCodeWriter::SetVersion(FX_INT32 version) +{ + if (version < 0 || version > 40) { + return FALSE; + } + m_iVersion = version; + return TRUE; +} +FX_BOOL CBC_QRCodeWriter::SetErrorCorrectionLevel(FX_INT32 level) +{ + if (level < 0 || level > 3) { + return FALSE; + } + m_iCorrectLevel = level; + return TRUE; +} +FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + CBC_QRCoderErrorCorrectionLevel *ec = NULL; + switch(ecLevel) { + case 0: + ec = CBC_QRCoderErrorCorrectionLevel::L; + break; + case 1: + ec = CBC_QRCoderErrorCorrectionLevel::M; + break; + case 2: + ec = CBC_QRCoderErrorCorrectionLevel::Q; + break; + case 3: + ec = CBC_QRCoderErrorCorrectionLevel::H; + break; + default: { + e = BCExceptionUnSupportEclevel; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + CBC_QRCoder qr; + if (m_iVersion > 0 && m_iVersion < 41) { + CFX_ByteString byteStr = contents.UTF8Encode(); + CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion); + } else { + CBC_QRCoderEncoder::Encode(contents, ec, &qr, e); + } + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + outWidth = qr.GetMatrixWidth(); + outHeight = qr.GetMatrixWidth(); + FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outWidth); + FXSYS_memcpy32(result, qr.GetMatrix()->GetArray(), outWidth * outHeight); + return result; +} +FX_BYTE *CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) +{ + return NULL; +} +FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) +{ + return NULL; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h new file mode 100644 index 0000000000..bf0ca71996 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCodeWriter.h @@ -0,0 +1,28 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERWRITER_H_ +#define _BC_QRCODERWRITER_H_ +#include "../BC_TwoDimWriter.h" +class CBC_TwoDimWriter; +class CBC_MultiBarCodes; +class CBC_QRCoderWriter; +class CBC_QRCodeWriter : public CBC_TwoDimWriter +{ +public: + CBC_QRCodeWriter(); + virtual ~CBC_QRCodeWriter(); + FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); + FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); + FX_BOOL SetVersion(FX_INT32 version); + FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); + static void ReleaseAll(); +private: + + FX_INT32 m_iVersion; +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp new file mode 100644 index 0000000000..f650f83b48 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoder.cpp @@ -0,0 +1,168 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonByteMatrix.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRCoderMode.h" +#include "BC_QRCoder.h" +CBC_QRCoder::CBC_QRCoder() +{ + m_mode = NULL; + m_ecLevel = NULL; + m_version = -1; + m_matrixWidth = -1; + m_maskPattern = -1; + m_numTotalBytes = -1; + m_numDataBytes = -1; + m_numECBytes = -1; + m_numRSBlocks = -1; + m_matrix = NULL; +} +CBC_QRCoder::~CBC_QRCoder() +{ + if(m_matrix != NULL) { + delete m_matrix; + m_matrix = NULL; + } + m_mode = NULL; + m_ecLevel = NULL; + m_version = -1; + m_matrixWidth = -1; + m_maskPattern = -1; + m_numTotalBytes = -1; + m_numDataBytes = -1; + m_numECBytes = -1; + m_numRSBlocks = -1; +} +CBC_QRCoderMode* CBC_QRCoder::GetMode() +{ + return m_mode; +} +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoder::GetECLevel() +{ + return m_ecLevel; +} +FX_INT32 CBC_QRCoder::GetVersion() +{ + return m_version; +} +FX_INT32 CBC_QRCoder::GetMatrixWidth() +{ + return m_matrixWidth; +} +FX_INT32 CBC_QRCoder::GetMaskPattern() +{ + return m_maskPattern; +} +FX_INT32 CBC_QRCoder::GetNumTotalBytes() +{ + return m_numTotalBytes; +} +FX_INT32 CBC_QRCoder::GetNumDataBytes() +{ + return m_numDataBytes; +} +FX_INT32 CBC_QRCoder::GetNumECBytes() +{ + return m_numECBytes; +} +FX_INT32 CBC_QRCoder::GetNumRSBlocks() +{ + return m_numRSBlocks; +} +CBC_CommonByteMatrix* CBC_QRCoder::GetMatrix() +{ + return m_matrix; +} +FX_INT32 CBC_QRCoder::At(FX_INT32 x, FX_INT32 y, FX_INT32 &e) +{ + FX_INT32 value = m_matrix->Get(x, y); + if(!(value == 0 || value == 1)) { + e = BCExceptionValueMustBeEither0or1; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + return value; +} +FX_BOOL CBC_QRCoder::IsValid() +{ + return + m_mode != NULL && + m_ecLevel != NULL && + m_version != -1 && + m_matrixWidth != -1 && + m_maskPattern != -1 && + m_numTotalBytes != -1 && + m_numDataBytes != -1 && + m_numECBytes != -1 && + m_numRSBlocks != -1 && + IsValidMaskPattern(m_maskPattern) && + m_numTotalBytes == m_numDataBytes + m_numECBytes && + m_matrix != NULL && + m_matrixWidth == m_matrix->GetWidth() && + m_matrix->GetWidth() == m_matrix->GetHeight(); +} +void CBC_QRCoder::SetMode(CBC_QRCoderMode* value) +{ + m_mode = value; +} +void CBC_QRCoder::SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel) +{ + m_ecLevel = ecLevel; +} +void CBC_QRCoder::SetVersion(FX_INT32 version) +{ + m_version = version; +} +void CBC_QRCoder::SetMatrixWidth(FX_INT32 width) +{ + m_matrixWidth = width; +} +void CBC_QRCoder::SetMaskPattern(FX_INT32 pattern) +{ + m_maskPattern = pattern; +} +void CBC_QRCoder::SetNumDataBytes(FX_INT32 bytes) +{ + m_numDataBytes = bytes; +} +void CBC_QRCoder::SetNumTotalBytes(FX_INT32 value) +{ + m_numTotalBytes = value; +} +void CBC_QRCoder::SetNumRSBlocks(FX_INT32 block) +{ + m_numRSBlocks = block; +} +void CBC_QRCoder::SetNumECBytes(FX_INT32 value) +{ + m_numECBytes = value; +} +FX_BOOL CBC_QRCoder::IsValidMaskPattern(FX_INT32 maskPattern) +{ + return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS; +} +void CBC_QRCoder::SetMatrix(CBC_CommonByteMatrix* value) +{ + m_matrix = value; +} +const FX_INT32 CBC_QRCoder::NUM_MASK_PATTERNS = 8; diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoder.h new file mode 100644 index 0000000000..89ce140fbd --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoder.h @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODER_H_ +#define _BC_QRCODER_H_ +class CBC_QRCoderErrorCorrectionLevel ; +class CBC_QRCoderMode; +class CBC_CommonByteMatrix; +class CBC_QRCoder; +class CBC_QRCoder : public CFX_Object +{ +private: + CBC_QRCoderMode* m_mode; + CBC_QRCoderErrorCorrectionLevel* m_ecLevel; + FX_INT32 m_version; + FX_INT32 m_matrixWidth; + FX_INT32 m_maskPattern; + FX_INT32 m_numTotalBytes; + FX_INT32 m_numDataBytes; + FX_INT32 m_numECBytes; + FX_INT32 m_numRSBlocks; + CBC_CommonByteMatrix* m_matrix; +public: + const static FX_INT32 NUM_MASK_PATTERNS; + CBC_QRCoder(); + virtual ~CBC_QRCoder(); + CBC_QRCoderMode* GetMode(); + CBC_QRCoderErrorCorrectionLevel* GetECLevel(); + FX_INT32 GetVersion(); + FX_INT32 GetMatrixWidth(); + FX_INT32 GetMaskPattern(); + FX_INT32 GetNumTotalBytes(); + FX_INT32 GetNumDataBytes(); + FX_INT32 GetNumECBytes(); + FX_INT32 GetNumRSBlocks(); + CBC_CommonByteMatrix* GetMatrix(); + FX_INT32 At(FX_INT32 x, FX_INT32 y, FX_INT32 &e); + FX_BOOL IsValid(); + + void SetMode(CBC_QRCoderMode* value); + void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel); + void SetVersion(FX_INT32 version); + void SetMatrixWidth(FX_INT32 width); + void SetMaskPattern(FX_INT32 pattern); + void SetNumDataBytes(FX_INT32 bytes); + void SetNumTotalBytes(FX_INT32 value); + void SetNumECBytes(FX_INT32 value); + void SetNumRSBlocks(FX_INT32 block); + void SetMatrix(CBC_CommonByteMatrix* value); + static FX_BOOL IsValidMaskPattern(FX_INT32 maskPattern); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp new file mode 100644 index 0000000000..b7a0a1c3a7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.cpp @@ -0,0 +1,141 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderBitVector.h" +CBC_QRCoderBitVector::CBC_QRCoderBitVector() +{ + m_sizeInBits = 0; + m_size = 32; +} +void CBC_QRCoderBitVector::Init() +{ + m_array = FX_Alloc(FX_BYTE, m_size); +} +CBC_QRCoderBitVector::~CBC_QRCoderBitVector() +{ + if(m_array != NULL) { + FX_Free(m_array); + } + m_size = 0; + m_sizeInBits = 0; +} +void CBC_QRCoderBitVector::Clear() +{ + if(m_array != NULL) { + FX_Free(m_array); + m_array = NULL; + } + m_sizeInBits = 0; + m_size = 32; + m_array = FX_Alloc(FX_BYTE, m_size); +} +FX_INT32 CBC_QRCoderBitVector::At(FX_INT32 index, FX_INT32 &e) +{ + if(index < 0 || index >= m_sizeInBits) { + e = BCExceptionBadIndexException; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + FX_INT32 value = m_array[index >> 3] & 0xff; + return (value >> (7 - (index & 0x7))) & 1; +} +FX_INT32 CBC_QRCoderBitVector::sizeInBytes() +{ + return (m_sizeInBits + 7) >> 3; +} +FX_INT32 CBC_QRCoderBitVector::Size() +{ + return m_sizeInBits; +} +void CBC_QRCoderBitVector::AppendBit(FX_INT32 bit, FX_INT32 &e) +{ + if(!(bit == 0 || bit == 1)) { + e = BCExceptionBadValueException; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsInLastByte = m_sizeInBits & 0x7; + if(numBitsInLastByte == 0) { + AppendByte(0); + m_sizeInBits -= 8; + } + m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte)); + ++m_sizeInBits; +} +void CBC_QRCoderBitVector::AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e) +{ + if (numBits < 0 || numBits > 32) { + e = BCExceptionBadNumBitsException; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsLeft = numBits; + while (numBitsLeft > 0) { + if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) { + FX_INT32 newByte = (value >> (numBitsLeft - 8)) & 0xff; + AppendByte(newByte); + numBitsLeft -= 8; + } else { + FX_INT32 bit = (value >> (numBitsLeft - 1)) & 1; + AppendBit(bit, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + --numBitsLeft; + } + } +} +void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e) +{ + FX_INT32 size = bits->Size(); + for(FX_INT32 i = 0; i < size; i++) { + FX_INT32 num = bits->At(i, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBit(num, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } +} +void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector *other, FX_INT32 &e) +{ + if(m_sizeInBits != other->Size()) { + e = BCExceptioncanNotOperatexorOperator; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 sizeInBytes = (m_sizeInBits + 7) >> 3; + for(FX_INT32 i = 0; i < sizeInBytes; ++i) { + m_array[i] ^= (other->GetArray())[i]; + } +} +FX_BYTE* CBC_QRCoderBitVector::GetArray() +{ + return m_array; +} +void CBC_QRCoderBitVector::AppendByte(FX_INT32 value) +{ + if((m_sizeInBits >> 3) == m_size) { + FX_BYTE* newArray = FX_Alloc(FX_BYTE, m_size << 1); + FXSYS_memcpy32(newArray, m_array, m_size); + if(m_array != NULL) { + FX_Free(m_array); + } + m_array = newArray; + m_size = m_size << 1; + } + m_array[m_sizeInBits >> 3] = (FX_BYTE) value; + m_sizeInBits += 8; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h new file mode 100644 index 0000000000..6e9abba6c9 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderBitVector.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRECODERBITVECTOR_H_ +#define _BC_QRECODERBITVECTOR_H_ +class CBC_QRCoderBitVector; +class CBC_QRCoderBitVector : public CFX_Object +{ +private: + FX_INT32 m_sizeInBits; + FX_BYTE *m_array; + FX_INT32 m_size; + + void AppendByte(FX_INT32 value); +public: + CBC_QRCoderBitVector(); + virtual ~CBC_QRCoderBitVector(); + FX_INT32 At(FX_INT32 index, FX_INT32 &e); + FX_INT32 Size(); + FX_INT32 sizeInBytes(); + void AppendBit(FX_INT32 bit, FX_INT32 &e); + void AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e); + void AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e); + void XOR(CBC_QRCoderBitVector *other, FX_INT32 &e); + FX_BYTE* GetArray(); + void Clear(); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp new file mode 100644 index 0000000000..da7e8a509e --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp @@ -0,0 +1,49 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonByteArray.h" +#include "BC_QRCoderBlockPair.h" +CBC_QRCoderBlockPair::CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection) +{ + m_dataBytes = data; + m_errorCorrectionBytes = errorCorrection; +} +CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() +{ + if(m_dataBytes != NULL) { + delete m_dataBytes; + m_dataBytes = NULL; + } + if(m_errorCorrectionBytes != NULL) { + delete m_errorCorrectionBytes; + m_errorCorrectionBytes = NULL; + } +} +CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() +{ + return m_dataBytes; +} +CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() +{ + return m_errorCorrectionBytes; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h new file mode 100644 index 0000000000..234ac1a776 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderBlockPair.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERBLOCKPAIR_H_ +#define _BC_QRCODERBLOCKPAIR_H_ +class CBC_CommonByteArray; +class CBC_QRCoderBlockPair; +class CBC_QRCoderBlockPair : public CFX_Object +{ +private: + CBC_CommonByteArray* m_dataBytes; + CBC_CommonByteArray* m_errorCorrectionBytes; +public: + CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection); + virtual ~CBC_QRCoderBlockPair(); + + CBC_CommonByteArray* GetDataBytes(); + CBC_CommonByteArray* GetErrorCorrectionBytes(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp new file mode 100644 index 0000000000..6f16db6ad8 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.cpp @@ -0,0 +1,128 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../common/BC_CommonDecoderResult.h" +#include "../common/reedsolomon/BC_ReedSolomonDecoder.h" +#include "../common/reedsolomon/BC_ReedSolomonGF256.h" +#include "BC_QRBitMatrixParser.h" +#include "BC_QRDataBlock.h" +#include "BC_QRDecodedBitStreamParser.h" +#include "BC_QRCoderVersion.h" +#include "BC_QRCoderFormatInformation.h" +#include "BC_QRCoderDecoder.h" +CBC_QRCoderDecoder::CBC_QRCoderDecoder() +{ + m_rsDecoder = NULL; +} + +void CBC_QRCoderDecoder::Init() +{ + m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::QRCodeFild); +} +CBC_QRCoderDecoder::~CBC_QRCoderDecoder() +{ + if(m_rsDecoder != NULL) { + delete m_rsDecoder; + } + m_rsDecoder = NULL; +} +CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e) +{ + CBC_CommonBitMatrix bits; + bits.Init(width); + for(FX_INT32 i = 0; i < width; i++) { + for(FX_INT32 j = 0; j < height; j++) { + if(image[i * width + j]) { + bits.Set(j, i); + } + } + } + CBC_CommonDecoderResult* cdr = Decode(&bits, height, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cdr; +} +CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_QRBitMatrixParser parser; + parser.Init(bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderVersion *version = parser.ReadVersion(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel(); + CFX_ByteArray* ba = parser.ReadCodewords(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr codewords(ba); + CFX_PtrArray *dataBlocks = CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 totalBytes = 0; + for (FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { + totalBytes += ((CBC_QRDataBlock*) ((*dataBlocks)[i]))->GetNumDataCodewords(); + } + CFX_ByteArray resultBytes; + FX_INT32 resultOffset = 0; + for (FX_INT32 j = 0; j < dataBlocks->GetSize(); j++) { + CBC_QRDataBlock *dataBlock = (CBC_QRDataBlock *)((*dataBlocks)[j]); + CFX_ByteArray* codewordBytes = dataBlock->GetCodewords(); + FX_INT32 numDataCodewords = dataBlock->GetNumDataCodewords(); + CorrectErrors(codewordBytes, numDataCodewords, e); + if (e != BCExceptionNO) { + for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { + delete (CBC_QRDataBlock*)(*dataBlocks)[k]; + } + dataBlocks->RemoveAll(); + delete dataBlocks; + dataBlocks = NULL; + return NULL; + } + for(FX_INT32 i = 0; i < numDataCodewords; i++) { + resultBytes.Add((*codewordBytes)[i]); + } + } + for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { + delete (CBC_QRDataBlock*)(*dataBlocks)[k] ; + } + dataBlocks->RemoveAll(); + delete dataBlocks; + dataBlocks = NULL; + CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode(&resultBytes, version, ecLevel, byteModeDecode, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cdr; +} +void CBC_QRCoderDecoder::CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) +{ + FX_INT32 numCodewords = codewordBytes->GetSize(); + CFX_Int32Array codewordsInts; + codewordsInts.SetSize(numCodewords); + for(FX_INT32 i = 0; i < numCodewords; i++) { + codewordsInts[i] = (FX_INT32)((*codewordBytes)[i] & 0xff); + } + FX_INT32 numECCodewords = codewordBytes->GetSize() - numDataCodewords; + m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + for(FX_INT32 k = 0; k < numDataCodewords; k++) { + (*codewordBytes)[k] = (FX_BYTE) codewordsInts[k]; + } +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h new file mode 100644 index 0000000000..355af78180 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderDecoder.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERDECODER_H_ +#define _BC_QRCODERDECODER_H_ +class CBC_CommonBitMatrix; +class CBC_ReedSolomonDecoder; +class CBC_CommonDecoderResult; +class CBC_QRBitMatrixParser; +class CBC_QRCoderVersion; +class CBC_QRDataBlock; +class CBC_QRCoderDecoder; +class CBC_QRCoderDecoder : public CFX_Object +{ +private: + CBC_ReedSolomonDecoder *m_rsDecoder; +public: + CBC_QRCoderDecoder(); + virtual ~CBC_QRCoderDecoder(); + + CBC_CommonDecoderResult* Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e); + CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e); + void CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); + virtual void Init(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp new file mode 100644 index 0000000000..a475cecb37 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.cpp @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderECB.h" +CBC_QRCoderECB::CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords) +{ + m_dataCodeWords = dataCodeWords; + m_count = count; +} +CBC_QRCoderECB::~CBC_QRCoderECB() +{ +} +FX_INT32 CBC_QRCoderECB::GetCount() +{ + return m_count; +} +FX_INT32 CBC_QRCoderECB::GetDataCodeWords() +{ + return m_dataCodeWords; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h new file mode 100644 index 0000000000..c6494b75cd --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderECB.h @@ -0,0 +1,21 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERECB_H_ +#define _BC_QRCODERECB_H_ +class CBC_QRCoderECB; +class CBC_QRCoderECB : public CFX_Object +{ +private: + FX_INT32 m_count; + FX_INT32 m_dataCodeWords; +public: + CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords); + virtual ~CBC_QRCoderECB(); + FX_INT32 GetCount(); + FX_INT32 GetDataCodeWords(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp new file mode 100644 index 0000000000..22485fe733 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp @@ -0,0 +1,65 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderECB.h" +#include "BC_QRCoderECBlocks.h" +CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks) +{ + m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; + m_ecBlocks.Add(ecBlocks); +} +CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, + CBC_QRCoderECB* ecBlocks1, + CBC_QRCoderECB* ecBlocks2) +{ + m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); +} +CBC_QRCoderECBlocks::~CBC_QRCoderECBlocks() +{ + for (FX_INT32 i = 0 ; i < m_ecBlocks.GetSize(); i++) { + delete ( (CBC_QRCoderECB*)(m_ecBlocks[i]) ) ; + } + m_ecBlocks.RemoveAll(); +} +FX_INT32 CBC_QRCoderECBlocks::GetECCodeWordsPerBlock() +{ + return m_ecCodeWordsPerBlock; +} +FX_INT32 CBC_QRCoderECBlocks::GetNumBlocks() +{ + FX_INT32 total = 0; + for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { + total += ( (CBC_QRCoderECB*)(m_ecBlocks[i]) )->GetCount(); + } + return total; +} +FX_INT32 CBC_QRCoderECBlocks::GetTotalECCodeWords() +{ + return m_ecCodeWordsPerBlock * GetNumBlocks(); +} +CFX_PtrArray* CBC_QRCoderECBlocks::GetECBlocks() +{ + return &m_ecBlocks; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h new file mode 100644 index 0000000000..385837510a --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderECBlocks.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERECBLOCKS_H_ +#define _BC_QRCODERECBLOCKS_H_ +class CBC_QRCoderECB; +class CBC_QRCoderECBlocks; +class CBC_QRCoderECBlocks : public CFX_Object +{ +private: + FX_INT32 m_ecCodeWordsPerBlock; + CFX_PtrArray m_ecBlocks; +public: + CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks); + CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks1, CBC_QRCoderECB* ecBlocks2); + virtual ~CBC_QRCoderECBlocks(); + FX_INT32 GetECCodeWordsPerBlock(); + FX_INT32 GetNumBlocks(); + FX_INT32 GetTotalECCodeWords(); + CFX_PtrArray* GetECBlocks(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp new file mode 100644 index 0000000000..e072dc337e --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.cpp @@ -0,0 +1,876 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_UtilCodingConvert.h" +#include "../common/BC_CommonByteArray.h" +#include "../common/BC_CommonByteMatrix.h" +#include "../common/reedsolomon/BC_ReedSolomon.h" +#include "../common/reedsolomon/BC_ReedSolomonGF256.h" +#include "BC_QRCoder.h" +#include "BC_QRCoderEncoder.h" +#include "BC_QRCoderMode.h" +#include "BC_QRCoderEncoder.h" +#include "BC_QRCoderECBlocks.h" +#include "BC_QRCoderVersion.h" +#include "BC_QRCoderBlockPair.h" +#include "BC_QRCoderMaskUtil.h" +#include "BC_QRCoderMatrixUtil.h" +#include "BC_QRCoderBitVector.h" +const FX_INT32 CBC_QRCoderEncoder::m_alphaNumbericTable[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1 +}; +CBC_QRCoderEncoder::CBC_QRCoderEncoder() +{ +} +CBC_QRCoderEncoder::~CBC_QRCoderEncoder() +{ +} +class Make_Pair : public CFX_Object +{ +public: + CBC_QRCoderMode* m_mode; + CFX_ByteString m_string; +private: + Make_Pair(const Make_Pair &mode_string) {} + Make_Pair &operator = (Make_Pair &mode_string) + { + if (this == &mode_string) { + return *this; + } + m_mode = mode_string.m_mode; + m_string = mode_string.m_string; + return *this; + } +public: + Make_Pair(CBC_QRCoderMode *mode, const CFX_ByteString &str): m_mode(mode), m_string(str) {} + ~Make_Pair() {} +}; +void CBC_QRCoderEncoder::Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify) +{ + if(versionSpecify == 0) { + EncodeWithAutoVersion(content, ecLevel, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } else if(versionSpecify > 0 && versionSpecify <= 40) { + EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionVersionMust1_40; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) +{ +} +void CBC_QRCoderEncoder::AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, + CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + tempMode = ((Make_Pair*)splitResult[i])->m_mode; + if(tempMode == CBC_QRCoderMode::sGBK) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sBYTE) { + CFX_ByteArray bytes; + CBC_UtilCodingConvert::LocaleToUtf8(((Make_Pair*)splitResult[i])->m_string, bytes); + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + Append8BitBytes(bytes, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sALPHANUMERIC) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(tempMode == CBC_QRCoderMode::sNUMERIC) { + AppendModeInfo(tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionUnknown; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } +} +void CBC_QRCoderEncoder::SplitString(const CFX_ByteString &content, CFX_PtrArray &result) +{ + FX_INT32 index = 0, flag = 0; + while((((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || + ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) && (index < content.GetLength())) { + index += 2; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(GetAlphaNumericCode((FX_BYTE)content[index]) == -1 + && !(((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || + ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) + && (index < content.GetLength())) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if(IsDBCSLeadByte((FX_BYTE)content[index])) +#else + if((FX_BYTE)content[index] > 127) +#endif + { + index += 2; + } else { + index++; + } + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(FXSYS_Isdigit((FX_BYTE)content[index]) && (index < content.GetLength())) { + index++; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sNUMERIC, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + while(GetAlphaNumericCode((FX_BYTE)content[index]) != -1 && (index < content.GetLength())) { + index++; + } + if(index != flag) { + result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sALPHANUMERIC, content.Mid(flag, index - flag))); + } + flag = index; + if(index >= content.GetLength()) { + return; + } + SplitString(content.Mid(index, content.GetLength() - index), result); +} +FX_INT32 CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e) +{ + if(versionNum == 0) { + return 0; + } + if((modeFirst == CBC_QRCoderMode::sALPHANUMERIC) + && (modeSecond == CBC_QRCoderMode::sBYTE)) { + if(versionNum >= 1 && versionNum <= 9) { + return 11; + } else if(versionNum >= 10 && versionNum <= 26) { + return 15; + } else if(versionNum >= 27 && versionNum <= 40) { + return 16; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } else if((modeSecond == CBC_QRCoderMode::sALPHANUMERIC) + && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { + if(versionNum >= 1 && versionNum <= 9) { + return 13; + } else if(versionNum >= 10 && versionNum <= 26) { + return 15; + } else if(versionNum >= 27 && versionNum <= 40) { + return 17; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } else if((modeSecond == CBC_QRCoderMode::sBYTE) + && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { + if(versionNum >= 1 && versionNum <= 9) { + return 6; + } else if(versionNum >= 10 && versionNum <= 26) { + return 8; + } else if(versionNum >= 27 && versionNum <= 40) { + return 9; + } else { + e = BCExceptionNoSuchVersion; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } + return -1; +} +void CBC_QRCoderEncoder::MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e) +{ + Make_Pair *first = NULL; + Make_Pair *second = NULL; + size_t mergeNum = 0; + FX_INT32 i; + for(i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) { + first = (Make_Pair*)result[i]; + second = (Make_Pair*)result[i + 1]; + if(first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) { + FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sBYTE) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + } else if(first->m_mode == CBC_QRCoderMode::sBYTE) { + if(second->m_mode == CBC_QRCoderMode::sBYTE) { + first->m_string += second->m_string; + delete second; + result.RemoveAt(i + 1); + i--; + mergeNum++; + } + } else if(first->m_mode == CBC_QRCoderMode::sNUMERIC) { + FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sBYTE) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sALPHANUMERIC, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) + && (first->m_string.GetLength() < tmp)) { + CFX_ByteString str = first->m_string + second->m_string; + second->m_string = str; + delete first; + result.RemoveAt(i); + i--; + mergeNum++; + } + } + } + if(mergeNum == 0) { + return; + } + MergeString(result, versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, + CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) +{ + qrCode->SetECLevel(ecLevel); + qrCode->SetMode(mode); + CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNumber, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBytes = version->GetTotalCodeWords(); + CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); + FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); + FX_INT32 numDataBytes = numBytes - numEcBytes; + if(numDataBytes >= numInputBytes + 3) { + qrCode->SetVersion(versionNumber); + qrCode->SetNumTotalBytes(numBytes); + qrCode->SetNumDataBytes(numDataBytes); + qrCode->SetNumRSBlocks(numRSBlocks); + qrCode->SetNumECBytes(numEcBytes); + qrCode->SetMatrixWidth(version->GetDimensionForVersion()); + return; + } + e = BCExceptionCannotFindBlockInfo; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; + CFX_PtrArray splitResult; + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + SplitString(content, splitResult); + MergeString(splitResult, versionSpecify, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + CBC_QRCoderMode *tempMode = NULL; + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 y = 0; y < splitResult.GetSize(); y++) { + delete (Make_Pair*)splitResult[y]; + } + splitResult.RemoveAll(); + return; + } + } + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + numInputBytes = headerAndDataBits.sizeInBytes(); + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + if(e != BCExceptionNO) { + for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + return ; + } + for(FX_INT32 j = 0; j < splitResult.GetSize(); j++) { + delete (Make_Pair*)splitResult[j]; + } + splitResult.RemoveAll(); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; + CFX_PtrArray splitResult; + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + SplitString(content, splitResult); + MergeString(splitResult, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderMode *tempMode = NULL; + for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { + AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); + if(e != BCExceptionNO) { + for(FX_INT32 l = 0; l < splitResult.GetSize(); l++) { + delete (Make_Pair*)splitResult[l]; + } + splitResult.RemoveAll(); + return; + } + } + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + tempMode = NULL; + FX_INT32 versionNum = qrCode->GetVersion(); +sign: + AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); + if (e != BCExceptionNO) { + goto catchException; + } + numInputBytes = headerAndDataBits.sizeInBytes(); + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + if (e != BCExceptionNO) { + goto catchException; + } +catchException: + if (e != BCExceptionNO) { + FX_INT32 e1 = BCExceptionNO; + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e1); + if (e1 != BCExceptionNO) { + e = e1; + return; + } + versionNum++; + if (versionNum <= 40) { + headerAndDataBits.Clear(); + e = BCExceptionNO; + goto sign; + } else { + for (FX_INT32 j = 0; j < splitResult.GetSize(); j++) { + delete (Make_Pair*)splitResult[j]; + } + splitResult.RemoveAll(); + return; + } + } + for (FX_INT32 k = 0; k < splitResult.GetSize(); k++) { + delete (Make_Pair*)splitResult[k]; + } + splitResult.RemoveAll(); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) +{ + CFX_ByteString encoding = "utf8"; + CFX_ByteString utf8Data; + CBC_UtilCodingConvert::UnicodeToUTF8(content, utf8Data); + CBC_QRCoderMode* mode = ChooseMode(utf8Data, encoding); + CBC_QRCoderBitVector dataBits; + dataBits.Init(); + AppendBytes(utf8Data, mode, &dataBits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numInputBytes = dataBits.sizeInBytes(); + InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderBitVector headerAndDataBits; + headerAndDataBits.Init(); + AppendModeInfo(mode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numLetters = mode == CBC_QRCoderMode::sBYTE ? dataBits.sizeInBytes() : content.GetLength(); + AppendLengthInfo(numLetters, qrCode->GetVersion(), mode, &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + headerAndDataBits.AppendBitVector(&dataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_QRCoderBitVector finalBits ; + finalBits.Init(); + InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), + qrCode->GetNumRSBlocks(), &finalBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); + pDecoder->Init(); + CBC_AutoPtr matrix(pDecoder); + FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + qrCode->SetMaskPattern(maskPattern); + CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + qrCode->SetMatrix(matrix.release()); + if(!qrCode->IsValid()) { + e = BCExceptionInvalidQRCode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 capacity = numDataBytes << 3; + if(bits->Size() > capacity) { + e = BCExceptionDataTooMany; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for (FX_INT32 i = 0; i < 4 && bits->Size() < capacity; ++i) { + bits->AppendBit(0, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numBitsInLastByte = bits->Size() % 8; + if (numBitsInLastByte > 0) { + FX_INT32 numPaddingBits = 8 - numBitsInLastByte; + for (FX_INT32 j = 0; j < numPaddingBits; ++j) { + bits->AppendBit(0, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + } + } + if (bits->Size() % 8 != 0) { + e = BCExceptionDigitLengthMustBe8; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 numPaddingBytes = numDataBytes - bits->sizeInBytes(); + for (FX_INT32 k = 0; k < numPaddingBytes; ++k) { + if (k % 2 == 0) { + bits->AppendBits(0xec, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + bits->AppendBits(0x11, 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + if (bits->Size() != capacity) { + e = BCExceptionBitsNotEqualCacity; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +FX_INT32 CBC_QRCoderEncoder::ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + FX_INT32 minPenalty = 65535; + FX_INT32 bestMaskPattern = -1; + for(FX_INT32 maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS; maskPattern++) { + CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + FX_INT32 penalty = CalculateMaskPenalty(matrix); + if(penalty < minPenalty) { + minPenalty = penalty; + bestMaskPattern = maskPattern; + } + } + return bestMaskPattern; +} +FX_INT32 CBC_QRCoderEncoder::CalculateMaskPenalty(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(matrix); + penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(matrix); + return penalty; +} +CBC_QRCoderMode *CBC_QRCoderEncoder::ChooseMode(const CFX_ByteString &content, CFX_ByteString encoding) +{ + if(encoding.Compare("SHIFT_JIS") == 0) { + return CBC_QRCoderMode::sKANJI; + } + FX_BOOL hasNumeric = FALSE; + FX_BOOL hasAlphaNumeric = FALSE; + for(FX_INT32 i = 0; i < content.GetLength(); i++) { + if(isdigit((FX_BYTE)content[i])) { + hasNumeric = TRUE; + } else if(GetAlphaNumericCode((FX_BYTE)content[i]) != -1) { + hasAlphaNumeric = TRUE; + } else { + return CBC_QRCoderMode::sBYTE; + } + } + if(hasAlphaNumeric) { + return CBC_QRCoderMode::sALPHANUMERIC; + } else if(hasNumeric) { + return CBC_QRCoderMode::sNUMERIC; + } + return CBC_QRCoderMode::sBYTE; +} +FX_INT32 CBC_QRCoderEncoder::GetAlphaNumericCode(FX_INT32 code) +{ + if(code < 96 && code >= 0) { + return m_alphaNumbericTable[code]; + } + return -1; +} +void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) +{ + if(mode == CBC_QRCoderMode::sNUMERIC) { + AppendNumericBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { + AppendAlphaNumericBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sBYTE) { + Append8BitBytes(content, bits, encoding, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sKANJI) { + AppendKanjiBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else if(mode == CBC_QRCoderMode::sGBK) { + AppendGBKBytes(content, bits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } else { + e = BCExceptionUnsupportedMode; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_INT32 i = 0; + while(i < length) { + FX_INT32 num1 = content[i] - '0'; + if(i + 2 < length) { + FX_INT32 num2 = content[i + 1] - '0'; + FX_INT32 num3 = content[i + 2] - '0'; + bits->AppendBits(num1 * 100 + num2 * 10 + num3, 10, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i += 3; + } else if(i + 1 < length) { + FX_INT32 num2 = content[i + 1] - '0'; + bits->AppendBits(num1 * 10 + num2, 7, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i += 2; + } else { + bits->AppendBits(num1, 4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + i++; + } + } +} +void CBC_QRCoderEncoder::AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_INT32 i = 0; + while(i < length) { + FX_INT32 code1 = GetAlphaNumericCode(content[i]); + if(code1 == -1) { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(i + 1 < length) { + FX_INT32 code2 = GetAlphaNumericCode(content[i + 1]); + if(code2 == -1) { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(code1 * 45 + code2, 11, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + i += 2; + } else { + bits->AppendBits(code1, 6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e) + i++; + } + } +} +void CBC_QRCoderEncoder::AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + FX_INT32 length = content.GetLength(); + FX_DWORD value = 0; + for(FX_INT32 i = 0; i < length; i += 2) { + value = (FX_DWORD)((FX_BYTE)content[i] << 8 | (FX_BYTE)content[i + 1]); + if(value <= 0xAAFE && value >= 0xA1A1) { + value -= 0xA1A1; + } else if(value <= 0xFAFE && value >= 0xB0A1) { + value -= 0xA6A1; + } else { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + value = (FX_DWORD)((value >> 8 ) * 0x60) + (FX_DWORD)(value & 0xff); + bits->AppendBits(value, 13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < content.GetLength(); i++) { + bits->AppendBits(content[i], 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e) +{ + for(FX_INT32 i = 0; i < bytes.GetSize(); i++) { + bits->AppendBits(bytes[i], 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + CFX_ByteArray bytes; + FX_DWORD value = 0, h = 0; + for(FX_INT32 i = 0; i < bytes.GetSize(); i += 2) { + value = (FX_DWORD)((FX_BYTE)(content[i] << 8) | (FX_BYTE)content[i + 1]); + if(value <= 0x9ffc && value >= 0x8140) { + value -= 0x8140; + } else if(value <= 0xebbf && value >= 0xe040) { + value -= 0xc140; + } else { + e = BCExceptionInvalidateCharacter; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + value = (FX_DWORD)((value >> 8 ) * 0xc0) + (FX_DWORD)(value & 0xff); + bits->AppendBits(value, 13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) +{ + qrCode->SetECLevel(ecLevel); + qrCode->SetMode(mode); + for(FX_INT32 versionNum = 1; versionNum <= 40; versionNum++) { + CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNum, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBytes = version->GetTotalCodeWords(); + CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); + FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); + FX_INT32 numDataBytes = numBytes - numEcBytes; + if(numDataBytes >= numInputBytes + 3) { + qrCode->SetVersion(versionNum); + qrCode->SetNumTotalBytes(numBytes); + qrCode->SetNumDataBytes(numDataBytes); + qrCode->SetNumRSBlocks(numRSBlocks); + qrCode->SetNumECBytes(numEcBytes); + qrCode->SetMatrixWidth(version->GetDimensionForVersion()); + return; + } + } + e = BCExceptionCannotFindBlockInfo; + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + bits->AppendBits(mode->GetBits(), 4, e); + if(mode == CBC_QRCoderMode::sGBK) { + bits->AppendBits(1, 4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + CBC_QRCoderVersion* qcv = CBC_QRCoderVersion::GetVersionForNumber(version, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 numBits = mode->GetCharacterCountBits(qcv, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(numBits > ((1 << numBits) - 1)) { + return; + } + if(mode == CBC_QRCoderMode::sGBK) { + bits->AppendBits(numLetters / 2, numBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(numLetters, numBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderEncoder::InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e) +{ + if(bits->sizeInBytes() != numDataBytes) { + e = BCExceptionBitsBytesNotMatch; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 dataBytesOffset = 0; + FX_INT32 maxNumDataBytes = 0; + FX_INT32 maxNumEcBytes = 0; + CFX_PtrArray blocks; + FX_INT32 i; + for(i = 0; i < numRSBlocks; i++) { + FX_INT32 numDataBytesInBlock; + FX_INT32 numEcBytesInBlosk; + GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, numRSBlocks, i, + numDataBytesInBlock, numEcBytesInBlosk); + CBC_CommonByteArray* dataBytes = FX_NEW CBC_CommonByteArray; + dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); + CBC_CommonByteArray* ecBytes = GenerateECBytes(dataBytes, numEcBytesInBlosk, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + blocks.Add(FX_NEW CBC_QRCoderBlockPair(dataBytes, ecBytes)); + maxNumDataBytes = FX_MAX(maxNumDataBytes, dataBytes->Size()); + maxNumEcBytes = FX_MAX(maxNumEcBytes, ecBytes->Size()); + dataBytesOffset += numDataBytesInBlock; + } + if(numDataBytes != dataBytesOffset) { + e = BCExceptionBytesNotMatchOffset; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 x = 0; x < maxNumDataBytes; x++) { + for(FX_INT32 j = 0; j < blocks.GetSize(); j++) { + CBC_CommonByteArray* dataBytes = ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes(); + if(x < dataBytes->Size()) { + result->AppendBits(dataBytes->At(x), 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } + for(FX_INT32 y = 0; y < maxNumEcBytes; y++) { + for(FX_INT32 l = 0; l < blocks.GetSize(); l++) { + CBC_CommonByteArray* ecBytes = ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes(); + if(y < ecBytes->Size()) { + result->AppendBits(ecBytes->At(y), 8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } + for(FX_INT32 k = 0; k < blocks.GetSize(); k++) { + delete (CBC_QRCoderBlockPair*)blocks[k]; + } + if(numTotalBytes != result->sizeInBytes()) { + e = BCExceptionSizeInBytesDiffer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderEncoder::GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, + FX_INT32 numRSBlocks, FX_INT32 blockID, + FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlock) +{ + if(blockID >= numRSBlocks) { + return; + } + FX_INT32 numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; + FX_INT32 numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; + FX_INT32 numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; + FX_INT32 numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; + FX_INT32 numDataBytesInGroup1 = numDataBytes / numRSBlocks; + FX_INT32 numDataBytesInGroup2 = numDataBytesInGroup1 + 1; + FX_INT32 numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; + FX_INT32 numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; + if (blockID < numRsBlocksInGroup1) { + numDataBytesInBlock = numDataBytesInGroup1; + numECBytesInBlock = numEcBytesInGroup1; + } else { + numDataBytesInBlock = numDataBytesInGroup2; + numECBytesInBlock = numEcBytesInGroup2; + } +} +CBC_CommonByteArray* CBC_QRCoderEncoder::GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e) +{ + FX_INT32 numDataBytes = dataBytes->Size(); + CFX_Int32Array toEncode; + toEncode.SetSize(numDataBytes + numEcBytesInBlock); + for(FX_INT32 i = 0; i < numDataBytes; i++) { + toEncode[i] = (dataBytes->At(i)); + } + CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild); + encode.Init(); + encode.Encode(&toEncode, numEcBytesInBlock, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_CommonByteArray* ecBytes = FX_NEW CBC_CommonByteArray(numEcBytesInBlock); + for(FX_INT32 j = 0; j < numEcBytesInBlock; j++) { + ecBytes->Set(j, toEncode[numDataBytes + j]); + } + return ecBytes; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h new file mode 100644 index 0000000000..8dea2a6477 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderEncoder.h @@ -0,0 +1,60 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERENCODER_H_ +#define _BC_QRCODERENCODER_H_ +class Make_Pair; +class CBC_QRCoder; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderMode; +class CBC_QRCoderBitVector; +class CBC_CommonByteArray; +class CBC_CommonByteMatrix; +class CBC_QRCoderEncoder; +class CBC_QRCoderEncoder : public CFX_Object +{ +private: + const static FX_INT32 m_alphaNumbericTable[96]; +public: + CBC_QRCoderEncoder(); + virtual ~CBC_QRCoderEncoder(); + + static void Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify = 0); + static void Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); + static void EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, + CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e); + static void EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); + static CBC_QRCoderMode* ChooseMode(const CFX_ByteString & content, CFX_ByteString encoding); + static FX_INT32 GetAlphaNumericCode(FX_INT32 code); + static void AppendECI(CBC_QRCoderBitVector* bits); + static void AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); + static void AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); + static void Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e); + static void AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, + CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); + static void InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); + static void AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); + + static void InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e); + static void GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, + FX_INT32 numRSBlocks, FX_INT32 blockID, + FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlocks); + static CBC_CommonByteArray* GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e); + static FX_INT32 ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static FX_INT32 CalculateMaskPenalty(CBC_CommonByteMatrix* matrix); + static void TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static FX_INT32 GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e); + static void MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e); + static void SplitString(const CFX_ByteString &content, CFX_PtrArray &result); + static void AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp new file mode 100644 index 0000000000..f8aae491da --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp @@ -0,0 +1,97 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::L = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::M = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::Q = NULL; +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::H = NULL; +CBC_QRCoderErrorCorrectionLevel::CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name) +{ + m_name += name; + m_ordinal = ordinal; + m_bits = bits; +} +CBC_QRCoderErrorCorrectionLevel::~CBC_QRCoderErrorCorrectionLevel() +{ +} +void CBC_QRCoderErrorCorrectionLevel::Initialize() +{ + L = FX_NEW CBC_QRCoderErrorCorrectionLevel(0, 0x01, (FX_CHAR*)"L"); + M = FX_NEW CBC_QRCoderErrorCorrectionLevel(1, 0x00, (FX_CHAR*)"M"); + Q = FX_NEW CBC_QRCoderErrorCorrectionLevel(2, 0x03, (FX_CHAR*)"Q"); + H = FX_NEW CBC_QRCoderErrorCorrectionLevel(3, 0x02, (FX_CHAR*)"H"); +} +void CBC_QRCoderErrorCorrectionLevel::Finalize() +{ + delete L; + delete M; + delete Q; + delete H; +} +FX_INT32 CBC_QRCoderErrorCorrectionLevel::Ordinal() +{ + return m_ordinal; +} +FX_INT32 CBC_QRCoderErrorCorrectionLevel::GetBits() +{ + return m_bits; +} +CFX_ByteString CBC_QRCoderErrorCorrectionLevel::GetName() +{ + return m_name; +} +CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::ForBits(FX_INT32 bits) +{ + switch(bits) { + case 0x00: + return M; + case 0x01: + return L; + case 0x02: + return H; + case 0x03: + return Q; + default: + return NULL; + } +} +void CBC_QRCoderErrorCorrectionLevel::Destroy() +{ + if(L) { + delete CBC_QRCoderErrorCorrectionLevel::L; + L = NULL; + } + if(M) { + delete CBC_QRCoderErrorCorrectionLevel::M; + M = NULL; + } + if(H) { + delete CBC_QRCoderErrorCorrectionLevel::H; + H = NULL; + } + if(Q) { + delete CBC_QRCoderErrorCorrectionLevel::Q; + Q = NULL; + } +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h new file mode 100644 index 0000000000..2c0ad7b0b7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERERRORCORRECTIONLEVEL_H_ +#define _BC_QRCODERERRORCORRECTIONLEVEL_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderErrorCorrectionLevel : public CFX_Object +{ +private: + FX_INT32 m_ordinal; + FX_INT32 m_bits; + CFX_ByteString m_name; + CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name); + CBC_QRCoderErrorCorrectionLevel(); +public: + static CBC_QRCoderErrorCorrectionLevel* L; + static CBC_QRCoderErrorCorrectionLevel* M; + static CBC_QRCoderErrorCorrectionLevel* Q; + static CBC_QRCoderErrorCorrectionLevel* H; + virtual ~CBC_QRCoderErrorCorrectionLevel(); + static void Initialize(); + static void Finalize(); + FX_INT32 Ordinal(); + FX_INT32 GetBits(); + CFX_ByteString GetName(); + static void Destroy(); + static CBC_QRCoderErrorCorrectionLevel* ForBits(FX_INT32 bits); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp new file mode 100644 index 0000000000..5a205480ae --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.cpp @@ -0,0 +1,119 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRCoderFormatInformation.h" +const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_MASK_QR = 0X5412; +const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_DECODE_LOOKUP[32][2] = { + {0x5412, 0x00}, + {0x5125, 0x01}, + {0x5E7C, 0x02}, + {0x5B4B, 0x03}, + {0x45F9, 0x04}, + {0x40CE, 0x05}, + {0x4F97, 0x06}, + {0x4AA0, 0x07}, + {0x77C4, 0x08}, + {0x72F3, 0x09}, + {0x7DAA, 0x0A}, + {0x789D, 0x0B}, + {0x662F, 0x0C}, + {0x6318, 0x0D}, + {0x6C41, 0x0E}, + {0x6976, 0x0F}, + {0x1689, 0x10}, + {0x13BE, 0x11}, + {0x1CE7, 0x12}, + {0x19D0, 0x13}, + {0x0762, 0x14}, + {0x0255, 0x15}, + {0x0D0C, 0x16}, + {0x083B, 0x17}, + {0x355F, 0x18}, + {0x3068, 0x19}, + {0x3F31, 0x1A}, + {0x3A06, 0x1B}, + {0x24B4, 0x1C}, + {0x2183, 0x1D}, + {0x2EDA, 0x1E}, + {0x2BED, 0x1F}, +}; +const FX_INT32 CBC_QRCoderFormatInformation::BITS_SET_IN_HALF_BYTE[] = +{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; +CBC_QRCoderFormatInformation::CBC_QRCoderFormatInformation(FX_INT32 formatInfo) +{ + m_errorCorrectLevl = CBC_QRCoderErrorCorrectionLevel::ForBits((formatInfo >> 3) & 0x03); + m_dataMask = (FX_BYTE) (formatInfo & 0x07); +} +CBC_QRCoderFormatInformation::~CBC_QRCoderFormatInformation() +{ +} +FX_INT32 CBC_QRCoderFormatInformation::NumBitsDiffering(FX_INT32 a, FX_INT32 b) +{ + a ^= b; + return BITS_SET_IN_HALF_BYTE[a & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] + + BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F]; +} +FX_BYTE CBC_QRCoderFormatInformation::GetDataMask() +{ + return m_dataMask; +} +CBC_QRCoderErrorCorrectionLevel *CBC_QRCoderFormatInformation::GetErrorCorrectionLevel() +{ + return m_errorCorrectLevl; +} +CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DecodeFormatInformation(FX_INT32 maskedFormatInfo) +{ + CBC_QRCoderFormatInformation* formatInfo = DoDecodeFormatInformation(maskedFormatInfo); + if(formatInfo != NULL) { + return formatInfo; + } + return DoDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR); +} +CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DoDecodeFormatInformation(FX_INT32 maskedFormatInfo) +{ + FX_INT32 bestDifference = (FX_INT32)FXSYS_nan(); + FX_INT32 bestFormatInfo = 0; + for(FX_INT32 i = 0; i < 32; i++) { + FX_INT32 const* decodeInfo = &FORMAT_INFO_DECODE_LOOKUP[i][0]; + FX_INT32 targetInfo = decodeInfo[0]; + if(targetInfo == maskedFormatInfo) { + return FX_NEW CBC_QRCoderFormatInformation(decodeInfo[1]); + } + FX_INT32 bitsDifference = NumBitsDiffering(maskedFormatInfo, targetInfo); + if(bitsDifference < bestDifference) { + bestFormatInfo = decodeInfo[1]; + bestDifference = bitsDifference; + } + } + if(bestDifference <= 3) { + return FX_NEW CBC_QRCoderFormatInformation(bestFormatInfo); + } + return NULL; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h new file mode 100644 index 0000000000..9d828c8380 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderFormatInformation.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERFORMATINFORMATION_H_ +#define _BC_QRCODERFORMATINFORMATION_H_ +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderFormatInformation; +class CBC_QRCoderFormatInformation : public CFX_Object +{ +private: + const static FX_INT32 FORMAT_INFO_MASK_QR; + const static FX_INT32 FORMAT_INFO_DECODE_LOOKUP[32][2]; + const static FX_INT32 BITS_SET_IN_HALF_BYTE[16]; + CBC_QRCoderErrorCorrectionLevel* m_errorCorrectLevl; + FX_BYTE m_dataMask; +public: + CBC_QRCoderFormatInformation(FX_INT32 formatInfo); + virtual ~CBC_QRCoderFormatInformation(); + FX_BYTE GetDataMask(); + CBC_QRCoderErrorCorrectionLevel* GetErrorCorrectionLevel(); + + static FX_INT32 NumBitsDiffering(FX_INT32 a, FX_INT32 b); + static CBC_QRCoderFormatInformation* DecodeFormatInformation(FX_INT32 maskedFormatInfo); + static CBC_QRCoderFormatInformation* DoDecodeFormatInformation(FX_INT32 maskedFormatInfo); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp new file mode 100644 index 0000000000..bc01eff442 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp @@ -0,0 +1,208 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonByteMatrix.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRCoder.h" +#include "BC_QRCoderMaskUtil.h" +CBC_QRCoderMaskUtil::CBC_QRCoderMaskUtil() +{ +} +CBC_QRCoderMaskUtil::~CBC_QRCoderMaskUtil() +{ +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix) +{ + return ApplyMaskPenaltyRule1Internal(matrix, TRUE) + + ApplyMaskPenaltyRule1Internal(matrix, FALSE); +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for(FX_INT32 y = 0; y < height - 1; y++) { + for(FX_INT32 x = 0; x < width - 1; x++) { + FX_INT32 value = array[y * width + x]; + if(value == array[y * width + x + 1] && + value == array[(y + 1) * width + x] && + value == array[(y + 1) * width + x + 1]) { + penalty ++; + } + } + } + return 3 * penalty; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 penalty = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for (FX_INT32 y = 0; y < height; ++y) { + for (FX_INT32 x = 0; x < width; ++x) { + if (x == 0 && ((y >= 0 && y <= 6) || (y >= height - 7 && y <= height - 1))) { + continue; + } + if (x == width - 7 && (y >= 0 && y <= 6)) { + continue; + } + if (y == 0 && ((x >= 0 && x <= 6) || (x >= width - 7 && x <= width - 1))) { + continue; + } + if (y == height - 7 && (x >= 0 && x <= 6)) { + continue; + } + if (x + 6 < width && + array[y * width + x] == 1 && + array[y * width + x + 1] == 0 && + array[y * width + x + 2] == 1 && + array[y * width + x + 3] == 1 && + array[y * width + x + 4] == 1 && + array[y * width + x + 5] == 0 && + array[y * width + x + 6] == 1 && + ((x + 10 < width && + array[y * width + x + 7] == 0 && + array[y * width + x + 8] == 0 && + array[y * width + x + 9] == 0 && + array[y * width + x + 10] == 0) || + (x - 4 >= 0 && + array[y * width + x - 1] == 0 && + array[y * width + x - 2] == 0 && + array[y * width + x - 3] == 0 && + array[y * width + x - 4] == 0))) { + penalty += 40; + } + if (y + 6 < height && + array[y * width + x] == 1 && + array[(y + 1) * width + x] == 0 && + array[(y + 2) * width + x] == 1 && + array[(y + 3) * width + x] == 1 && + array[(y + 4) * width + x] == 1 && + array[(y + 5) * width + x] == 0 && + array[(y + 6) * width + x] == 1 && + ((y + 10 < height && + array[(y + 7) * width + x] == 0 && + array[(y + 8) * width + x] == 0 && + array[(y + 9) * width + x] == 0 && + array[(y + 10) * width + x] == 0) || + (y - 4 >= 0 && + array[(y - 1) * width + x] == 0 && + array[(y - 2) * width + x] == 0 && + array[(y - 3) * width + x] == 0 && + array[(y - 4) * width + x] == 0))) { + penalty += 40; + } + } + } + return penalty; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix) +{ + FX_INT32 numDarkCells = 0; + FX_BYTE* array = matrix->GetArray(); + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + for (FX_INT32 y = 0; y < height; ++y) { + for (FX_INT32 x = 0; x < width; ++x) { + if (array[y * width + x] == 1) { + numDarkCells += 1; + } + } + } + FX_INT32 numTotalCells = matrix->GetHeight() * matrix->GetWidth(); + double darkRatio = (double) numDarkCells / numTotalCells; + return abs( (FX_INT32) (darkRatio * 100 - 50) / 5 ) * 5 * 10; +} +FX_BOOL CBC_QRCoderMaskUtil::GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e) +{ + if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { + e = (BCExceptionInvalidateMaskPattern); + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + } + FX_INT32 intermediate = 0, temp = 0; + switch(maskPattern) { + case 0: + intermediate = (y + x) & 0x1; + break; + case 1: + intermediate = y & 0x1; + break; + case 2: + intermediate = x % 3; + break; + case 3: + intermediate = (y + x) % 3; + break; + case 4: + intermediate = ((y >> 1) + (x / 3)) & 0x1; + break; + case 5: + temp = y * x; + intermediate = (temp & 0x1) + (temp % 3); + break; + case 6: + temp = y * x; + intermediate = (((temp & 0x1) + (temp % 3)) & 0x1); + break; + case 7: + temp = y * x; + intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1); + break; + default: { + e = BCExceptionInvalidateMaskPattern; + BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); + } + } + return intermediate == 0; +} +FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal) +{ + FX_INT32 penalty = 0; + FX_INT32 numSameBitCells = 0; + FX_INT32 prevBit = -1; + FX_INT32 width = matrix->GetWidth(); + FX_INT32 height = matrix->GetHeight(); + FX_INT32 iLimit = isHorizontal ? height : width; + FX_INT32 jLimit = isHorizontal ? width : height; + FX_BYTE* array = matrix->GetArray(); + for (FX_INT32 i = 0; i < iLimit; ++i) { + for (FX_INT32 j = 0; j < jLimit; ++j) { + FX_INT32 bit = isHorizontal ? array[i * width + j] : array[j * width + i]; + if (bit == prevBit) { + numSameBitCells += 1; + if (numSameBitCells == 5) { + penalty += 3; + } else if (numSameBitCells > 5) { + penalty += 1; + } + } else { + numSameBitCells = 1; + prevBit = bit; + } + } + numSameBitCells = 0; + } + return penalty; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h new file mode 100644 index 0000000000..134d344e72 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMaskUtil.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERMASKUTIL_H_ +#define _BC_QRCODERMASKUTIL_H_ +class CBC_CommonByteMatrix; +class CBC_QRCoderMaskUtil; +class CBC_QRCoderMaskUtil : public CFX_Object +{ +public: + CBC_QRCoderMaskUtil(); + virtual ~CBC_QRCoderMaskUtil(); + static FX_BOOL GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e); + + static FX_INT32 ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix); + static FX_INT32 ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp new file mode 100644 index 0000000000..4c2db5e34e --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp @@ -0,0 +1,490 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonByteMatrix.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRCoder.h" +#include "BC_QRCoderMaskUtil.h" +#include "BC_QRCoderMatrixUtil.h" +#include "BC_QRCoderBitVector.h" +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_DETECTION_PATTERN[7][7] = { + 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::HORIZONTAL_SEPARATION_PATTERN[1][8] = { + 0, 0, 0, 0, 0, 0, 0, 0 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::VERTICAL_SEPARATION_PATTERN[7][1] = { + 0, 0, 0, 0, 0, 0, 0 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN[5][5] = { + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 1, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1 +}; +const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7] = { + { -1, -1, -1, -1, -1, -1, -1}, + { 6, 18, -1, -1, -1, -1, -1}, + { 6, 22, -1, -1, -1, -1, -1}, + { 6, 26, -1, -1, -1, -1, -1}, + { 6, 30, -1, -1, -1, -1, -1}, + { 6, 34, -1, -1, -1, -1, -1}, + { 6, 22, 38, -1, -1, -1, -1}, + { 6, 24, 42, -1, -1, -1, -1}, + { 6, 26, 46, -1, -1, -1, -1}, + { 6, 28, 50, -1, -1, -1, -1}, + { 6, 30, 54, -1, -1, -1, -1}, + { 6, 32, 58, -1, -1, -1, -1}, + { 6, 34, 62, -1, -1, -1, -1}, + { 6, 26, 46, 66, -1, -1, -1}, + { 6, 26, 48, 70, -1, -1, -1}, + { 6, 26, 50, 74, -1, -1, -1}, + { 6, 30, 54, 78, -1, -1, -1}, + { 6, 30, 56, 82, -1, -1, -1}, + { 6, 30, 58, 86, -1, -1, -1}, + { 6, 34, 62, 90, -1, -1, -1}, + { 6, 28, 50, 72, 94, -1, -1}, + { 6, 26, 50, 74, 98, -1, -1}, + { 6, 30, 54, 78, 102, -1, -1}, + { 6, 28, 54, 80, 106, -1, -1}, + { 6, 32, 58, 84, 110, -1, -1}, + { 6, 30, 58, 86, 114, -1, -1}, + { 6, 34, 62, 90, 118, -1, -1}, + { 6, 26, 50, 74, 98, 122, -1}, + { 6, 30, 54, 78, 102, 126, -1}, + { 6, 26, 52, 78, 104, 130, -1}, + { 6, 30, 56, 82, 108, 134, -1}, + { 6, 34, 60, 86, 112, 138, -1}, + { 6, 30, 58, 86, 114, 142, -1}, + { 6, 34, 62, 90, 118, 146, -1}, + { 6, 30, 54, 78, 102, 126, 150}, + { 6, 24, 50, 76, 102, 128, 154}, + { 6, 28, 54, 80, 106, 132, 158}, + { 6, 32, 58, 84, 110, 136, 162}, + { 6, 26, 54, 82, 110, 138, 166}, + { 6, 30, 58, 86, 114, 142, 170}, +}; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_COORDINATES[15][2] = { + {8, 0}, + {8, 1}, + {8, 2}, + {8, 3}, + {8, 4}, + {8, 5}, + {8, 7}, + {8, 8}, + {7, 8}, + {5, 8}, + {4, 8}, + {3, 8}, + {2, 8}, + {1, 8}, + {0, 8}, +}; +const FX_INT32 CBC_QRCoderMatrixUtil::VERSION_INFO_POLY = 0x1f25; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_POLY = 0x0537; +const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_MASK_PATTERN = 0x5412; +void CBC_QRCoderMatrixUtil::ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->clear((FX_BYTE) - 1); +} +void CBC_QRCoderMatrixUtil::BuildMatrix(CBC_QRCoderBitVector* dataBits, + CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, FX_INT32 maskPattern, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + ClearMatrix(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedBasicPatterns(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedTypeInfo(ecLevel, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + MaybeEmbedVersionInfo(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedDataBits(dataBits, maskPattern, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + EmbedPositionDetectionPatternsAndSeparators(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedDarkDotAtLeftBottomCorner(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + MaybeEmbedPositionAdjustmentPatterns(version, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedTimingPatterns(matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CBC_QRCoderBitVector typeInfoBits; + typeInfoBits.Init(); + MakeTypeInfoBits(ecLevel, maskPattern, &typeInfoBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + for(FX_INT32 i = 0; i < typeInfoBits.Size(); i++) { + FX_INT32 bit = typeInfoBits.At(typeInfoBits.Size() - 1 - i, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 x1 = TYPE_INFO_COORDINATES[i][0]; + FX_INT32 y1 = TYPE_INFO_COORDINATES[i][1]; + matrix->Set(x1, y1, bit); + if(i < 8) { + FX_INT32 x2 = matrix->GetWidth() - i - 1; + FX_INT32 y2 = 8; + matrix->Set(x2, y2, bit); + } else { + FX_INT32 x2 = 8; + FX_INT32 y2 = matrix->GetHeight() - 7 + (i - 8); + matrix->Set(x2, y2, bit); + } + } +} +void CBC_QRCoderMatrixUtil::MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(version < 7) { + return; + } + CBC_QRCoderBitVector versionInfoBits; + versionInfoBits.Init(); + MakeVersionInfoBits(version, &versionInfoBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 bitIndex = 6 * 3 - 1; + for(FX_INT32 i = 0; i < 6; i++) { + for(FX_INT32 j = 0; j < 3; j++) { + FX_INT32 bit = versionInfoBits.At(bitIndex, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bitIndex--; + matrix->Set(i, matrix->GetHeight() - 11 + j, bit); + matrix->Set(matrix->GetHeight() - 11 + j, i, bit); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedDataBits(CBC_QRCoderBitVector* dataBits, + FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL || dataBits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 bitIndex = 0; + FX_INT32 direction = -1; + FX_INT32 x = matrix->GetWidth() - 1; + FX_INT32 y = matrix->GetHeight() - 1; + while(x > 0) { + if (x == 6) { + x -= 1; + } + while(y >= 0 && y < matrix->GetHeight()) { + if (y == 6) { + y += direction; + continue; + } + for(FX_INT32 i = 0; i < 2; i++) { + FX_INT32 xx = x - i; + if(!IsEmpty(matrix->Get(xx, y))) { + continue; + } + FX_INT32 bit; + if(bitIndex < dataBits->Size()) { + bit = dataBits->At(bitIndex, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bitIndex++; + } else { + bit = 0; + } + if( maskPattern != -1) { + FX_BOOL bol = CBC_QRCoderMaskUtil::GetDataMaskBit(maskPattern, xx, y, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bol) { + bit ^= 0x01; + } + } + matrix->Set(xx, y, bit); + } + y += direction; + } + direction = -direction; + y += direction; + x -= 2; + } + if(bitIndex != dataBits->Size()) { + return; + } +} +FX_INT32 CBC_QRCoderMatrixUtil::CalculateBCHCode(FX_INT32 value, FX_INT32 poly) +{ + FX_INT32 msbSetInPoly = FindMSBSet(poly); + value <<= msbSetInPoly - 1; + while(FindMSBSet(value) >= msbSetInPoly) { + value ^= poly << (FindMSBSet(value) - msbSetInPoly); + } + return value; +} +void CBC_QRCoderMatrixUtil::MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + if(bits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { + e = BCExceptionBadMask; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 typeInfo = (ecLevel->GetBits() << 3) | maskPattern; + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->AppendBits(typeInfo, 5, e); + FX_INT32 bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->AppendBits(bchCode, 10, e); + CBC_QRCoderBitVector maskBits; + maskBits.Init(); + maskBits.AppendBits(TYPE_INFO_MASK_PATTERN, 15, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + bits->XOR(&maskBits, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bits->Size() != 15) { + e = BCExceptionBitSizeNot15; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +void CBC_QRCoderMatrixUtil::MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e) +{ + if(bits == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + bits->AppendBits(version, 6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 bchCode = CalculateBCHCode(version, VERSION_INFO_POLY); + bits->AppendBits(bchCode, 12, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(bits->Size() != 18) { + e = BCExceptionBitSizeNot18; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } +} +FX_BOOL CBC_QRCoderMatrixUtil::IsEmpty(FX_INT32 value) +{ + return (FX_BYTE)value == 0xff; +} +FX_BOOL CBC_QRCoderMatrixUtil::IsValidValue(FX_INT32 value) +{ + return ((FX_BYTE)value == 0xff || (FX_BYTE)value == 0x00 || (FX_BYTE)value == 0x01); +} +void CBC_QRCoderMatrixUtil::EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 i = 8; i < matrix->GetWidth() - 8; i++) { + FX_INT32 bit = (i + 1) % 2; + if(!IsValidValue(matrix->Get(i, 6))) { + e = BCExceptionInvalidateImageData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(IsEmpty(matrix->Get(i , 6))) { + matrix->Set(i, 6, bit); + } + if(!IsValidValue(matrix->Get(6, i))) { + e = BCExceptionInvalidateImageData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(IsEmpty(matrix->Get(6, i))) { + matrix->Set(6, i, bit); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(matrix->Get(8, matrix->GetHeight() - 8) == 0) { + e = BCExceptionHeight_8BeZero; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(8, matrix->GetHeight() - 8, 1); +} +void CBC_QRCoderMatrixUtil::EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 x = 0; x < 8; x++) { + if(!IsEmpty(matrix->Get(xStart + x, yStart))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e) + } + matrix->Set(xStart + x, yStart, HORIZONTAL_SEPARATION_PATTERN[0][x]); + } +} +void CBC_QRCoderMatrixUtil::EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 7; y++) { + if(!IsEmpty(matrix->Get(xStart, yStart + y))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart, yStart + y, VERTICAL_SEPARATION_PATTERN[y][0]); + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 5; y++) { + for(FX_INT32 x = 0; x < 5; x++) { + if(!IsEmpty(matrix->Get(xStart + x, y + yStart))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPattern (FX_INT32 xStart, FX_INT32 yStart, + CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + for(FX_INT32 y = 0; y < 7; y++) { + for(FX_INT32 x = 0; x < 7; x++) { + if(!IsEmpty(matrix->Get(xStart + x, yStart + y))) { + e = BCExceptionInvalidateData; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + matrix->Set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]); + } + } +} +void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_INT32 pdpWidth = 7; + EmbedPositionDetectionPattern(0, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedPositionDetectionPattern(matrix->GetWidth() - pdpWidth, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedPositionDetectionPattern(0, matrix->GetWidth() - pdpWidth, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 hspWidth = 8; + EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedHorizontalSeparationPattern(matrix->GetWidth() - hspWidth, hspWidth - 1, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedHorizontalSeparationPattern(0, matrix->GetWidth() - hspWidth, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 vspSize = 7; + EmbedVerticalSeparationPattern(vspSize, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedVerticalSeparationPattern(matrix->GetHeight() - vspSize - 1, 0, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + EmbedVerticalSeparationPattern(vspSize, matrix->GetHeight() - vspSize, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); +} +void CBC_QRCoderMatrixUtil::MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) +{ + if(matrix == NULL) { + e = BCExceptionNullPointer; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if(version < 2) { + return; + } + FX_INT32 index = version - 1; + FX_INT32 const* coordinates = &(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][0]); + FX_INT32 numCoordinate = 7; + for(FX_INT32 i = 0; i < numCoordinate; i++) { + for(FX_INT32 j = 0; j < numCoordinate; j++) { + FX_INT32 y = coordinates[i]; + FX_INT32 x = coordinates[j]; + if(x == -1 || y == -1) { + continue; + } + if(IsEmpty(matrix->Get(x, y))) { + EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + } + } +} +FX_INT32 CBC_QRCoderMatrixUtil::FindMSBSet(FX_INT32 value) +{ + FX_INT32 numDigits = 0; + while(value != 0) { + value >>= 1; + ++numDigits; + } + return numDigits; +} +CBC_QRCoderMatrixUtil::CBC_QRCoderMatrixUtil() +{ +} +CBC_QRCoderMatrixUtil::~CBC_QRCoderMatrixUtil() +{ +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h new file mode 100644 index 0000000000..23a9d88128 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERMATRIXUTIL_H_ +#define _BC_QRCODERMATRIXUTIL_H_ +class CBC_CommonByteMatrix; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderBitVector; +class CBC_QRCoderMatrixUtil; +class CBC_QRCoderMatrixUtil : public CFX_Object +{ +private: + const static FX_INT32 POSITION_DETECTION_PATTERN[7][7]; + const static FX_INT32 VERTICAL_SEPARATION_PATTERN[7][1]; + const static FX_INT32 HORIZONTAL_SEPARATION_PATTERN[1][8]; + const static FX_INT32 POSITION_ADJUSTMENT_PATTERN[5][5]; + const static FX_INT32 POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7]; + const static FX_INT32 TYPE_INFO_COORDINATES[15][2]; + const static FX_INT32 VERSION_INFO_POLY; + const static FX_INT32 TYPE_INFO_POLY; + const static FX_INT32 TYPE_INFO_MASK_PATTERN; +public: + CBC_QRCoderMatrixUtil(); + virtual ~CBC_QRCoderMatrixUtil(); + static void ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void BuildMatrix(CBC_QRCoderBitVector* dataBits, CBC_QRCoderErrorCorrectionLevel* ecLevel, + FX_INT32 version, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e); + static void EmbedDataBits(CBC_QRCoderBitVector* dataBits, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static FX_INT32 FindMSBSet(FX_INT32 value); + static FX_INT32 CalculateBCHCode(FX_INT32 code, FX_INT32 poly); + static void MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static void MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e); + static FX_BOOL IsEmpty(FX_INT32 value); + static FX_BOOL IsValidValue(FX_INT32 value); + static void EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionDetectionPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e); + static void MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp new file mode 100644 index 0000000000..00c7e47cb7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.cpp @@ -0,0 +1,178 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderVersion.h" +#include "BC_QRCoderMode.h" +CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL; +CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL; +CBC_QRCoderMode::CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, + FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, + FX_INT32 bits, CFX_ByteString name) +{ + m_characterCountBitsForVersions = characterCountBitsForVersions; + if (m_characterCountBitsForVersions != NULL) { + m_characterCountBitsForVersions[0] = x1; + m_characterCountBitsForVersions[1] = x2; + m_characterCountBitsForVersions[2] = x3; + } + m_name += name; + m_bits = bits; +} +CBC_QRCoderMode::~CBC_QRCoderMode() +{ + if(m_characterCountBitsForVersions != NULL) { + FX_Free(m_characterCountBitsForVersions); + } +} +void CBC_QRCoderMode::Initialize() +{ + sBYTE = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 16, 16, 0x4, "BYTE"); + sALPHANUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 9, 11, 13, 0x2, "ALPHANUMERIC"); + sECI = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI"); + sKANJI = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x8, "KANJI"); + sNUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 10, 12, 14, 0x1, "NUMERIC"); + sGBK = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x0D, "GBK"); + sTERMINATOR = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x00, "TERMINATOR"); + sFNC1_FIRST_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION"); + sFNC1_SECOND_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION"); + sSTRUCTURED_APPEND = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x03, "STRUCTURED_APPEND"); +} +void CBC_QRCoderMode::Finalize() +{ + delete sBYTE; + delete sALPHANUMERIC; + delete sECI; + delete sKANJI; + delete sNUMERIC; + delete sGBK; + delete sTERMINATOR; + delete sFNC1_FIRST_POSITION; + delete sFNC1_SECOND_POSITION; + delete sSTRUCTURED_APPEND; +} +CBC_QRCoderMode* CBC_QRCoderMode::ForBits(FX_INT32 bits, FX_INT32 &e) +{ + switch (bits) { + case 0x0: + return sTERMINATOR; + case 0x1: + return sNUMERIC; + case 0x2: + return sALPHANUMERIC; + case 0x3: + return sSTRUCTURED_APPEND; + case 0x4: + return sBYTE; + case 0x5: + return sFNC1_FIRST_POSITION; + case 0x7: + return sECI; + case 0x8: + return sKANJI; + case 0x9: + return sFNC1_SECOND_POSITION; + case 0x0D: + return sGBK; + default: { + e = BCExceptionUnsupportedMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + return NULL; +} +FX_INT32 CBC_QRCoderMode::GetBits() +{ + return m_bits; +} +CFX_ByteString CBC_QRCoderMode::GetName() +{ + return m_name; +} +FX_INT32 CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e) +{ + if(m_characterCountBitsForVersions == NULL) { + e = BCExceptionCharacterNotThisMode; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + FX_INT32 number = version->GetVersionNumber(); + FX_INT32 offset; + if(number <= 9) { + offset = 0; + } else if(number <= 26) { + offset = 1; + } else { + offset = 2; + } + return m_characterCountBitsForVersions[offset]; +} +void CBC_QRCoderMode::Destroy() +{ + if(sBYTE) { + delete CBC_QRCoderMode::sBYTE; + sBYTE = NULL; + } + if(sNUMERIC) { + delete CBC_QRCoderMode::sNUMERIC; + sNUMERIC = NULL; + } + if(sALPHANUMERIC) { + delete CBC_QRCoderMode::sALPHANUMERIC; + sALPHANUMERIC = NULL; + } + if(sKANJI) { + delete CBC_QRCoderMode::sKANJI; + sKANJI = NULL; + } + if(sECI) { + delete CBC_QRCoderMode::sECI; + sECI = NULL; + } + if(sGBK) { + delete CBC_QRCoderMode::sGBK; + sGBK = NULL; + } + if(sTERMINATOR) { + delete CBC_QRCoderMode::sTERMINATOR; + sTERMINATOR = NULL; + } + if(sFNC1_FIRST_POSITION) { + delete CBC_QRCoderMode::sFNC1_FIRST_POSITION; + sFNC1_FIRST_POSITION = NULL; + } + if(sFNC1_SECOND_POSITION) { + delete CBC_QRCoderMode::sFNC1_SECOND_POSITION; + sFNC1_SECOND_POSITION = NULL; + } + if(sSTRUCTURED_APPEND) { + delete CBC_QRCoderMode::sSTRUCTURED_APPEND; + sSTRUCTURED_APPEND = NULL; + } +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h new file mode 100644 index 0000000000..71cea9fc78 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderMode.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERMODE_H_ +#define _BC_QRCODERMODE_H_ +class CBC_QRCoderVersion; +class CBC_QRCoderMode; +class CBC_QRCoderMode : public CFX_Object +{ +private: + FX_INT32* m_characterCountBitsForVersions; + FX_INT32 m_bits; + CFX_ByteString m_name; + CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, FX_INT32 bits, CFX_ByteString name); + CBC_QRCoderMode(); +public: + static CBC_QRCoderMode* sBYTE; + static CBC_QRCoderMode* sNUMERIC; + static CBC_QRCoderMode* sALPHANUMERIC; + static CBC_QRCoderMode* sKANJI; + static CBC_QRCoderMode* sECI; + static CBC_QRCoderMode* sGBK; + static CBC_QRCoderMode* sTERMINATOR; + static CBC_QRCoderMode* sFNC1_FIRST_POSITION; + static CBC_QRCoderMode* sFNC1_SECOND_POSITION; + static CBC_QRCoderMode* sSTRUCTURED_APPEND; + virtual ~CBC_QRCoderMode(); + + static void Initialize(); + static void Finalize(); + static CBC_QRCoderMode* ForBits(FX_INT32 bits, FX_INT32 &e); + FX_INT32 GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e); + FX_INT32 GetBits(); + CFX_ByteString GetName(); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp new file mode 100644 index 0000000000..9ff54f2a13 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.cpp @@ -0,0 +1,777 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../utils.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRCoderECB.h" +#include "BC_QRCoderFormatInformation.h" +#include "BC_QRCoderErrorCorrectionLevel.h" +#include "BC_QRCoderBitVector.h" +#include "BC_QRCoderECBlocks.h" +#include "BC_QRCoderVersion.h" +const FX_INT32 CBC_QRCoderVersion::VERSION_DECODE_INFO[] = { + 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, + 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, + 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, + 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, + 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, + 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, + 0x2542E, 0x26A64, 0x27541, 0x28C69 +}; +CFX_PtrArray *CBC_QRCoderVersion::VERSION = NULL; +void CBC_QRCoderVersion::Initialize() +{ + VERSION = FX_NEW CFX_PtrArray(); +} +void CBC_QRCoderVersion::Finalize() +{ + for(FX_INT32 i = 0 ; i < VERSION->GetSize(); i++) { + CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i)); + delete v; + } + delete VERSION; +} +CBC_QRCoderVersion::CBC_QRCoderVersion(FX_INT32 versionNumber, + CBC_QRCoderECBlocks* ecBlocks1, + CBC_QRCoderECBlocks* ecBlocks2, + CBC_QRCoderECBlocks* ecBlocks3, + CBC_QRCoderECBlocks* ecBlocks4) +{ + m_versionNumber = versionNumber; + m_ecBlocks.Add(ecBlocks1); + m_ecBlocks.Add(ecBlocks2); + m_ecBlocks.Add(ecBlocks3); + m_ecBlocks.Add(ecBlocks4); + FX_INT32 total = 0; + FX_INT32 ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock(); + CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks(); + for(FX_INT32 i = 0; i < ecbArray->GetSize(); i++) { + CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]); + total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords); + } + m_totalCodeWords = total; + switch(versionNumber) { + case 1: + break; + case 2: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(18); + break; + case 3: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(22); + break; + case 4: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + break; + case 5: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + break; + case 6: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + break; + case 7: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(22); + m_alignmentPatternCenters.Add(38); + break; + case 8: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(24); + m_alignmentPatternCenters.Add(42); + break; + case 9: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(46); + break; + case 10: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(50); + break; + case 11: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + break; + case 12: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + break; + case 13: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + break; + case 14: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(46); + m_alignmentPatternCenters.Add(66); + break; + case 15: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(48); + m_alignmentPatternCenters.Add(70); + break; + case 16: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + break; + case 17: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + break; + case 18: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(56); + m_alignmentPatternCenters.Add(82); + break; + case 19: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + break; + case 20: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + break; + case 21: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(72); + m_alignmentPatternCenters.Add(94); + break; + case 22: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(98); + break; + case 23: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(102); + break; + case 24: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(80); + m_alignmentPatternCenters.Add(106); + break; + case 25: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(84); + m_alignmentPatternCenters.Add(110); + break; + case 26: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + break; + case 27: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + m_alignmentPatternCenters.Add(118); + break; + case 28: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(74); + m_alignmentPatternCenters.Add(98); + m_alignmentPatternCenters.Add(122); + break; + case 29: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(126); + break; + case 30: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(52); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(104); + m_alignmentPatternCenters.Add(130); + break; + case 31: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(56); + m_alignmentPatternCenters.Add(82); + m_alignmentPatternCenters.Add(108); + m_alignmentPatternCenters.Add(134); + break; + case 32: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(60); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(112); + m_alignmentPatternCenters.Add(138); + break; + case 33: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + m_alignmentPatternCenters.Add(142); + break; + case 34: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(34); + m_alignmentPatternCenters.Add(62); + m_alignmentPatternCenters.Add(90); + m_alignmentPatternCenters.Add(118); + m_alignmentPatternCenters.Add(146); + break; + case 35: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(78); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(126); + m_alignmentPatternCenters.Add(150); + break; + case 36: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(24); + m_alignmentPatternCenters.Add(50); + m_alignmentPatternCenters.Add(76); + m_alignmentPatternCenters.Add(102); + m_alignmentPatternCenters.Add(128); + m_alignmentPatternCenters.Add(154); + break; + case 37: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(28); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(80); + m_alignmentPatternCenters.Add(106); + m_alignmentPatternCenters.Add(132); + m_alignmentPatternCenters.Add(158); + break; + case 38: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(32); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(84); + m_alignmentPatternCenters.Add(110); + m_alignmentPatternCenters.Add(136); + m_alignmentPatternCenters.Add(162); + break; + case 39: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(26); + m_alignmentPatternCenters.Add(54); + m_alignmentPatternCenters.Add(82); + m_alignmentPatternCenters.Add(110); + m_alignmentPatternCenters.Add(138); + m_alignmentPatternCenters.Add(166); + break; + case 40: + m_alignmentPatternCenters.Add(6); + m_alignmentPatternCenters.Add(30); + m_alignmentPatternCenters.Add(58); + m_alignmentPatternCenters.Add(86); + m_alignmentPatternCenters.Add(114); + m_alignmentPatternCenters.Add(142); + m_alignmentPatternCenters.Add(170); + break; + } +} +CBC_QRCoderVersion::~CBC_QRCoderVersion() +{ + if(m_ecBlocks.GetSize() != 0) { + FX_INT32 itBeg = 0; + FX_INT32 itEnd = m_ecBlocks.GetSize(); + while(itBeg != itEnd) { + delete ( (CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg]) ); + itBeg++; + } + } +} +FX_INT32 CBC_QRCoderVersion::GetVersionNumber() +{ + return m_versionNumber; +} +CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() +{ + return &m_alignmentPatternCenters; +} +FX_INT32 CBC_QRCoderVersion::GetTotalCodeWords() +{ + return m_totalCodeWords; +} +FX_INT32 CBC_QRCoderVersion::GetDimensionForVersion() +{ + return 17 + 4 * m_versionNumber; +} +CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel) +{ + return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()]; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e) +{ + if((dimension % 4) != 1) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e) +{ + FX_INT32 bestDifference = FXSYS_IntMax; + FX_INT32 bestVersion = 0; + for (FX_INT32 i = 0; i < 34; i++) { + FX_INT32 targetVersion = VERSION_DECODE_INFO[i]; + if(targetVersion == versionBits) { + CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; + } + FX_INT32 bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(versionBits, targetVersion); + if(bitsDifference < bestDifference) { + bestVersion = i + 7; + bestDifference = bitsDifference; + } + } + if(bestDifference <= 3) { + CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qcv; + } + return NULL; +} +CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(FX_INT32 &e) +{ + FX_INT32 dimension = GetDimensionForVersion(); + CBC_CommonBitMatrix* bitMatrix = FX_NEW CBC_CommonBitMatrix(); + bitMatrix->Init(dimension); + bitMatrix->SetRegion(0, 0 , 9, 9, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(0, dimension - 8, 9, 8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 max = m_alignmentPatternCenters.GetSize(); + for (FX_INT32 x = 0; x < max; x++) { + FX_INT32 i = m_alignmentPatternCenters[x] - 2; + for (FX_INT32 y = 0; y < max; y++) { + if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { + continue; + } + bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + bitMatrix->SetRegion(6, 9, 1, dimension - 17, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(9, 6, dimension - 17, 1, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if (m_versionNumber > 6) { + bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + bitMatrix->SetRegion(0, dimension - 11, 6, 3, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return bitMatrix; +} +CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e) +{ + if(VERSION->GetSize() == 0) { + VERSION->Add(FX_NEW CBC_QRCoderVersion(1, + FX_NEW CBC_QRCoderECBlocks(7, FX_NEW CBC_QRCoderECB(1, 19)), + FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 16)), + FX_NEW CBC_QRCoderECBlocks(13, FX_NEW CBC_QRCoderECB(1, 13)), + FX_NEW CBC_QRCoderECBlocks(17, FX_NEW CBC_QRCoderECB(1, 9)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(2, + FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 34)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(1, 28)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(1, 22)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(3, + FX_NEW CBC_QRCoderECBlocks(15, FX_NEW CBC_QRCoderECB(1, 55)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 44)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 17)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(4, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(1, 80)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 32)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(2, 24)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 9)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(5, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 108)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 43)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 15), + FX_NEW CBC_QRCoderECB(2, 16)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 11), + FX_NEW CBC_QRCoderECB(2, 12)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(6, + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68)), + FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 27)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 19)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(7, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(2, 78)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(4, 31)), + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(4, 15)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 13), + FX_NEW CBC_QRCoderECB(1, 14)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(8, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 97)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 38), + FX_NEW CBC_QRCoderECB(2, 39)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(4, 18), + FX_NEW CBC_QRCoderECB(2, 19)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 14), + FX_NEW CBC_QRCoderECB(2, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(9, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 116)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(3, 36), + FX_NEW CBC_QRCoderECB(2, 37)), + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 16), + FX_NEW CBC_QRCoderECB(4, 17)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 12), + FX_NEW CBC_QRCoderECB(4, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(10, + FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68), + FX_NEW CBC_QRCoderECB(2, 69)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 43), + FX_NEW CBC_QRCoderECB(1, 44)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(6, 19), + FX_NEW CBC_QRCoderECB(2, 20)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 15), + FX_NEW CBC_QRCoderECB(2, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(11, + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 81)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 50), + FX_NEW CBC_QRCoderECB(4, 51)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 22), + FX_NEW CBC_QRCoderECB(4, 23)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(3, 12), + FX_NEW CBC_QRCoderECB(8, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(12, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 92), + FX_NEW CBC_QRCoderECB(2, 93)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(6, 36), + FX_NEW CBC_QRCoderECB(2, 37)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 20), + FX_NEW CBC_QRCoderECB(6, 21)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 14), + FX_NEW CBC_QRCoderECB(4, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(13, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 107)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(8, 37), + FX_NEW CBC_QRCoderECB(1, 38)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(8, 20), + FX_NEW CBC_QRCoderECB(4, 21)), + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(12, 11), + FX_NEW CBC_QRCoderECB(4, 12)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(14, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 115), + FX_NEW CBC_QRCoderECB(1, 116)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 40), + FX_NEW CBC_QRCoderECB(5, 41)), + FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(11, 16), + FX_NEW CBC_QRCoderECB(5, 17)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), + FX_NEW CBC_QRCoderECB(5, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(15, + FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(5, 87), + FX_NEW CBC_QRCoderECB(1, 88)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 41), + FX_NEW CBC_QRCoderECB(5, 42)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 24), + FX_NEW CBC_QRCoderECB(7, 25)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), + FX_NEW CBC_QRCoderECB(7, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(16, + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 98), + FX_NEW CBC_QRCoderECB(1, 99)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 45), + FX_NEW CBC_QRCoderECB(3, 46)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(15, 19), + FX_NEW CBC_QRCoderECB(2, 20)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 15), + FX_NEW CBC_QRCoderECB(13, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(17, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 107), + FX_NEW CBC_QRCoderECB(5, 108)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), + FX_NEW CBC_QRCoderECB(1, 47)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 22), + FX_NEW CBC_QRCoderECB(15, 23)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(17, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(18, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 120), + FX_NEW CBC_QRCoderECB(1, 121)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 43), + FX_NEW CBC_QRCoderECB(4, 44)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), + FX_NEW CBC_QRCoderECB(1, 23)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), + FX_NEW CBC_QRCoderECB(19, 15)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(19, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 113), + FX_NEW CBC_QRCoderECB(4, 114)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 44), + FX_NEW CBC_QRCoderECB(11, 45)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 21), + FX_NEW CBC_QRCoderECB(4, 22)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 13), + FX_NEW CBC_QRCoderECB(16, 14)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(20, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 107), + FX_NEW CBC_QRCoderECB(5, 108)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 41), + FX_NEW CBC_QRCoderECB(13, 42)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), + FX_NEW CBC_QRCoderECB(5, 25)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(15, 15), + FX_NEW CBC_QRCoderECB(10, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(21, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 116), + FX_NEW CBC_QRCoderECB(4, 117)), + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 42)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), + FX_NEW CBC_QRCoderECB(6, 23)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 16), + FX_NEW CBC_QRCoderECB(6, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(22, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 111), + FX_NEW CBC_QRCoderECB(7, 112)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), + FX_NEW CBC_QRCoderECB(16, 25)), + FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(34, 13)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(23, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 121), + FX_NEW CBC_QRCoderECB(5, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 47), + FX_NEW CBC_QRCoderECB(14, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(16, 15), + FX_NEW CBC_QRCoderECB(14, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(24, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 117), + FX_NEW CBC_QRCoderECB(4, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 45), + FX_NEW CBC_QRCoderECB(14, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), + FX_NEW CBC_QRCoderECB(16, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(30, 16), + FX_NEW CBC_QRCoderECB(2, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(25, + FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(8, 106), + FX_NEW CBC_QRCoderECB(4, 107)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(8, 47), + FX_NEW CBC_QRCoderECB(13, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), + FX_NEW CBC_QRCoderECB(22, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), + FX_NEW CBC_QRCoderECB(13, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(26, + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 114), + FX_NEW CBC_QRCoderECB(2, 115)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 46), + FX_NEW CBC_QRCoderECB(4, 47)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(28, 22), + FX_NEW CBC_QRCoderECB(6, 23)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(33, 16), + FX_NEW CBC_QRCoderECB(4, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(27, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 122), + FX_NEW CBC_QRCoderECB(4, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(22, 45), + FX_NEW CBC_QRCoderECB(3, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 23), + FX_NEW CBC_QRCoderECB(26, 24)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 15), + FX_NEW CBC_QRCoderECB(28, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(28, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 117), + FX_NEW CBC_QRCoderECB(10, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 45), + FX_NEW CBC_QRCoderECB(23, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 24), + FX_NEW CBC_QRCoderECB(31, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), + FX_NEW CBC_QRCoderECB(31, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(29, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 116), + FX_NEW CBC_QRCoderECB(7, 117)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(21, 45), + FX_NEW CBC_QRCoderECB(7, 46)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 23), + FX_NEW CBC_QRCoderECB(37, 24)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), + FX_NEW CBC_QRCoderECB(26, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(30, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 115), + FX_NEW CBC_QRCoderECB(10, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 47), + FX_NEW CBC_QRCoderECB(10, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), + FX_NEW CBC_QRCoderECB(25, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), + FX_NEW CBC_QRCoderECB(25, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(31, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), + FX_NEW CBC_QRCoderECB(3, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 46), + FX_NEW CBC_QRCoderECB(29, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 24), + FX_NEW CBC_QRCoderECB(1, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), + FX_NEW CBC_QRCoderECB(28, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(32, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), + FX_NEW CBC_QRCoderECB(23, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 24), + FX_NEW CBC_QRCoderECB(35, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), + FX_NEW CBC_QRCoderECB(35, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(33, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115), + FX_NEW CBC_QRCoderECB(1, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), + FX_NEW CBC_QRCoderECB(21, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(29, 24), + FX_NEW CBC_QRCoderECB(19, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), + FX_NEW CBC_QRCoderECB(46, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(34, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), + FX_NEW CBC_QRCoderECB(6, 116)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), + FX_NEW CBC_QRCoderECB(23, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(44, 24), + FX_NEW CBC_QRCoderECB(7, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(59, 16), + FX_NEW CBC_QRCoderECB(1, 17)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(35, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 121), + FX_NEW CBC_QRCoderECB(7, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(12, 47), + FX_NEW CBC_QRCoderECB(26, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(39, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), + FX_NEW CBC_QRCoderECB(41, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(36, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 121), + FX_NEW CBC_QRCoderECB(14, 122)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 47), + FX_NEW CBC_QRCoderECB(34, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(46, 24), + FX_NEW CBC_QRCoderECB(10, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 15), + FX_NEW CBC_QRCoderECB(64, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(37, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 122), + FX_NEW CBC_QRCoderECB(4, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(29, 46), + FX_NEW CBC_QRCoderECB(14, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(49, 24), + FX_NEW CBC_QRCoderECB(10, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(24, 15), + FX_NEW CBC_QRCoderECB(46, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(38, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 122), + FX_NEW CBC_QRCoderECB(18, 123)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(13, 46), + FX_NEW CBC_QRCoderECB(32, 47)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(48, 24), + FX_NEW CBC_QRCoderECB(14, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 15), + FX_NEW CBC_QRCoderECB(32, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(39, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 117), + FX_NEW CBC_QRCoderECB(4, 118)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(40, 47), + FX_NEW CBC_QRCoderECB(7, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(43, 24), + FX_NEW CBC_QRCoderECB(22, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 15), + FX_NEW CBC_QRCoderECB(67, 16)))); + VERSION->Add(FX_NEW CBC_QRCoderVersion(40, + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 118), + FX_NEW CBC_QRCoderECB(6, 119)), + FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(18, 47), + FX_NEW CBC_QRCoderECB(31, 48)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(34, 24), + FX_NEW CBC_QRCoderECB(34, 25)), + FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 15), + FX_NEW CBC_QRCoderECB(61, 16)))); + } + if(versionNumber < 1 || versionNumber > 40) { + e = BCExceptionIllegalArgument; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1]; +} +void CBC_QRCoderVersion::Destroy() +{ + FX_INT32 i; + for(i = 0; i < VERSION->GetSize(); i++) { + delete ( (CBC_QRCoderVersion*)(*VERSION)[i] ); + } +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h new file mode 100644 index 0000000000..b693dd6dd7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRCoderVersion.h @@ -0,0 +1,42 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRCODERVERSION_H_ +#define _BC_QRCODERVERSION_H_ +class CBC_QRCoderECBlocks; +class CBC_CommonBitMatrix; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRCoderVersion; +class CBC_QRCoderVersion : public CFX_Object +{ +private: + const static FX_INT32 VERSION_DECODE_INFO[34]; + static CFX_PtrArray *VERSION; + FX_INT32 m_versionNumber; + FX_INT32 m_totalCodeWords; + CFX_Int32Array m_alignmentPatternCenters; + CFX_PtrArray m_ecBlocks; + + CBC_QRCoderVersion(); + CBC_QRCoderVersion(FX_INT32 versionNumber, CBC_QRCoderECBlocks* ecBlocks1, CBC_QRCoderECBlocks* ecBlocks2, + CBC_QRCoderECBlocks* ecBlocks3, CBC_QRCoderECBlocks* ecBlocks4); +public: + virtual ~CBC_QRCoderVersion(); + static void Initialize(); + static void Finalize(); + + FX_INT32 GetVersionNumber(); + FX_INT32 GetTotalCodeWords(); + FX_INT32 GetDimensionForVersion(); + CBC_CommonBitMatrix *BuildFunctionPattern(FX_INT32 &e); + CFX_Int32Array* GetAlignmentPatternCenters(); + CBC_QRCoderECBlocks* GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel); + static CBC_QRCoderVersion* GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e); + static CBC_QRCoderVersion* GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e); + static CBC_QRCoderVersion* DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp new file mode 100644 index 0000000000..87c14deac9 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.cpp @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "BC_QRCoderECBlocks.h" +#include "BC_QRCoderECB.h" +#include "BC_QRDataBlock.h" +#include "BC_QRCoderVersion.h" +CBC_QRDataBlock::CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) + : m_numDataCodewords(numDataCodewords) + , m_codewords(codewords) +{ +} +CBC_QRDataBlock::~CBC_QRDataBlock() +{ + if(m_codewords != NULL) { + delete m_codewords; + m_codewords = NULL; + } +} +FX_INT32 CBC_QRDataBlock::GetNumDataCodewords() +{ + return m_numDataCodewords; +} +CFX_ByteArray *CBC_QRDataBlock::GetCodewords() +{ + return m_codewords; +} +CFX_PtrArray *CBC_QRDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) +{ + if(rawCodewords->GetSize() != version->GetTotalCodeWords()) { + e = BCExceptionIllegalArgument; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + CBC_QRCoderECBlocks *ecBlocks = version->GetECBlocksForLevel(ecLevel); + FX_INT32 totalBlocks = 0; + CFX_PtrArray* ecBlockArray = ecBlocks->GetECBlocks(); + FX_INT32 i = 0; + for(i = 0; i < ecBlockArray->GetSize(); i++) { + totalBlocks += ((CBC_QRCoderECB*)(*ecBlockArray)[i])->GetCount(); + } + CFX_PtrArray *datablock = FX_NEW CFX_PtrArray(); + datablock->SetSize(totalBlocks); + CBC_AutoPtr result(datablock); + FX_INT32 numResultBlocks = 0; + for(FX_INT32 j = 0; j < ecBlockArray->GetSize(); j++) { + CBC_QRCoderECB *ecBlock = (CBC_QRCoderECB*)(*ecBlockArray)[j]; + for(FX_INT32 k = 0; k < ecBlock->GetCount(); k++) { + FX_INT32 numDataCodewords = ecBlock->GetDataCodeWords(); + FX_INT32 numBlockCodewords = ecBlocks->GetECCodeWordsPerBlock() + numDataCodewords; + CFX_ByteArray *bytearray = FX_NEW CFX_ByteArray(); + bytearray->SetSize(numBlockCodewords); + (*result)[numResultBlocks++] = FX_NEW CBC_QRDataBlock(numDataCodewords, bytearray); + } + } + FX_INT32 shorterBlocksTotalCodewords = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); + FX_INT32 longerBlocksStartAt = result->GetSize() - 1; + while(longerBlocksStartAt >= 0) { + FX_INT32 numCodewords = ((CBC_QRDataBlock*)(*result)[longerBlocksStartAt])->m_codewords->GetSize(); + if(numCodewords == shorterBlocksTotalCodewords) { + break; + } + longerBlocksStartAt--; + } + longerBlocksStartAt++; + FX_INT32 shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks->GetECCodeWordsPerBlock(); + FX_INT32 rawCodewordsOffset = 0; + FX_INT32 x = 0; + for(FX_INT32 k = 0; k < shorterBlocksNumDataCodewords; k++) { + for(x = 0; x < numResultBlocks; x++) { + (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[k] = (*rawCodewords)[rawCodewordsOffset++]; + } + } + for(x = longerBlocksStartAt; x < numResultBlocks; x++) { + (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[shorterBlocksNumDataCodewords] = (*rawCodewords)[rawCodewordsOffset++]; + } + FX_INT32 max = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); + for(i = shorterBlocksNumDataCodewords; i < max; i++) { + for(FX_INT32 y = 0; y < numResultBlocks; y++) { + FX_INT32 iOffset = y < longerBlocksStartAt ? i : i + 1; + (*(((CBC_QRDataBlock*)(*result)[y])->m_codewords))[iOffset] = (*rawCodewords)[rawCodewordsOffset++]; + } + } + return result.release(); +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h new file mode 100644 index 0000000000..4f68c7a9f3 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDataBlock.h @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRDATABLOCK_H_ +#define _BC_QRDATABLOCK_H_ +class CBC_QRCoderVersion; +class CBC_QRCoderECBlocks; +class CBC_QRCoderECB; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_QRDataBlock; +class CBC_QRDataBlock : public CFX_Object +{ +private: + FX_INT32 m_numDataCodewords; + CFX_ByteArray *m_codewords; + CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); +public: + virtual ~CBC_QRDataBlock(); + FX_INT32 GetNumDataCodewords(); + CFX_ByteArray* GetCodewords(); + static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, + CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp new file mode 100644 index 0000000000..fd81b20f1b --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.cpp @@ -0,0 +1,149 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRDataMask.h" +static FX_INT32 N_DATA_MASKS = 0; +CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL; +void CBC_QRDataMask::Initialize() +{ + DATA_MASKS = FX_NEW CFX_PtrArray(); + N_DATA_MASKS = BuildDataMasks(); +} +void CBC_QRDataMask::Finalize() +{ + Destroy(); + delete DATA_MASKS; +} +void CBC_QRDataMask::Destroy() +{ + FX_INT32 i; + for(i = 0; i < N_DATA_MASKS; i++) { + CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i]; + if (p) { + delete p; + } + } +} +void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension) +{ + for(FX_INT32 i = 0; i < dimension; i++) { + for(FX_INT32 j = 0; j < dimension; j++) { + if(IsMasked(i, j)) { + bits->Flip(j, i); + } + } + } +} +CBC_QRDataMask* CBC_QRDataMask::ForReference(FX_INT32 reference, FX_INT32 &e) +{ + if(reference < 0 || reference > 7) { + e = BCExceptionReferenceMustBeBetween0And7; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + return (CBC_QRDataMask*)(*DATA_MASKS)[reference]; +} +class DataMask000 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return ((x + y) % 2) == 0; + } +}; +class DataMask001 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (x % 2) == 0; + } +}; +class DataMask010 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return y % 3 == 0; + } +}; +class DataMask011 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (x + y) % 3 == 0; + } +}; +class DataMask100 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return (((x >> 1) + (y / 3)) % 2) == 0; + } +}; +class DataMask101 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + size_t temp = x * y; + return (temp % 2) + (temp % 3) == 0; + } +}; +class DataMask110 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + size_t temp = x * y; + return (((temp % 2) + (temp % 3)) % 2) == 0; + } +}; +class DataMask111 : public CBC_QRDataMask +{ +public: + FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) + { + return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0; + } +}; +FX_INT32 CBC_QRDataMask::BuildDataMasks() +{ + DATA_MASKS->Add(FX_NEW DataMask000); + DATA_MASKS->Add(FX_NEW DataMask001); + DATA_MASKS->Add(FX_NEW DataMask010); + DATA_MASKS->Add(FX_NEW DataMask011); + DATA_MASKS->Add(FX_NEW DataMask100); + DATA_MASKS->Add(FX_NEW DataMask101); + DATA_MASKS->Add(FX_NEW DataMask110); + DATA_MASKS->Add(FX_NEW DataMask111); + return DATA_MASKS->GetSize(); +} +CBC_QRDataMask::CBC_QRDataMask() +{ +} +CBC_QRDataMask::~CBC_QRDataMask() +{ +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h new file mode 100644 index 0000000000..6fcc09d556 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDataMask.h @@ -0,0 +1,25 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRDATAMASK_H_ +#define _BC_QRDATAMASK_H_ +class CBC_CommonBitMatrix; +class CBC_QRDataMask; +class CBC_QRDataMask : public CFX_Object +{ +public: + static CFX_PtrArray *DATA_MASKS; + CBC_QRDataMask(); + virtual ~CBC_QRDataMask(); + static void Initialize(); + static void Finalize(); + virtual FX_BOOL IsMasked(FX_INT32 i, FX_INT32 j) = 0; + void UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension); + static CBC_QRDataMask* ForReference(FX_INT32 reference, FX_INT32 &e); + static FX_INT32 BuildDataMasks(); + static void Destroy(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp new file mode 100644 index 0000000000..0fe4d1b2b6 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.cpp @@ -0,0 +1,254 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_UtilCodingConvert.h" +#include "../common/BC_CommonBitSource.h" +#include "../common/BC_CommonECI.h" +#include "../common/BC_CommonCharacterSetECI.h" +#include "../common/BC_CommonDecoderResult.h" +#include "BC_QRCoderMode.h" +#include "BC_QRDecodedBitStreamParser.h" +FX_LPCSTR CBC_QRDecodedBitStreamParser::UTF_8 = "utf8"; +const FX_CHAR CBC_QRDecodedBitStreamParser::ALPHANUMERIC_CHARS[45] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ' ', '$', '%', '*', '+', '-', '.', '/', ':' +}; +CBC_QRDecodedBitStreamParser::CBC_QRDecodedBitStreamParser() +{ +} +CBC_QRDecodedBitStreamParser::~CBC_QRDecodedBitStreamParser() +{ +} +CBC_CommonDecoderResult* CBC_QRDecodedBitStreamParser::Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, + CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + CBC_CommonBitSource bits(bytes); + CFX_ByteString result; + CBC_CommonCharacterSetECI* currentCharacterSetECI = NULL; + FX_BOOL fc1Infact = FALSE; + CFX_Int32Array byteSegments; + CBC_QRCoderMode* mode = NULL; + do { + if(bits.Available() < 4) { + mode = CBC_QRCoderMode::sTERMINATOR; + } else { + FX_INT32 iTemp1 = bits.ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + mode = CBC_QRCoderMode::ForBits(iTemp1, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if(mode == NULL) { + e = BCExceptionUnSupportMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + if(!(mode == CBC_QRCoderMode::sTERMINATOR)) { + if(mode == CBC_QRCoderMode::sFNC1_FIRST_POSITION || mode == CBC_QRCoderMode::sFNC1_SECOND_POSITION) { + fc1Infact = TRUE; + } else if(mode == CBC_QRCoderMode::sSTRUCTURED_APPEND) { + bits.ReadBits(16, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sECI) { + FX_INT32 value = ParseECIValue(&bits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + currentCharacterSetECI = CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(value); + } else { + if(mode == CBC_QRCoderMode::sGBK) { + bits.ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 numBits = mode->GetCharacterCountBits(version, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 count = bits.ReadBits(numBits, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + if(mode == CBC_QRCoderMode::sNUMERIC) { + DecodeNumericSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { + DecodeAlphanumericSegment(&bits, result, count, fc1Infact, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sBYTE) { + DecodeByteSegment(&bits, result, count, currentCharacterSetECI, &byteSegments, byteModeDecode, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sGBK) { + DecodeGBKSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else if(mode == CBC_QRCoderMode::sKANJI) { + DecodeKanjiSegment(&bits, result, count, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } else { + e = BCExceptionUnSupportMode; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + } + } + } while (!(mode == CBC_QRCoderMode::sTERMINATOR)); + CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); + tempCd->Init(*bytes, result, byteSegments, ecLevel, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return tempCd; +} +void CBC_QRDecodedBitStreamParser::DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + CFX_ByteString buffer; + FX_INT32 offset = 0; + while (count > 0) { + FX_INT32 twoBytes = bits->ReadBits(13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); + if (assembledTwoBytes <= 0x0095d) { + assembledTwoBytes += 0x0a1a1; + } else { + assembledTwoBytes += 0x0a6a1; + } + buffer += (FX_BYTE) (assembledTwoBytes >> 8); + buffer += (FX_BYTE) assembledTwoBytes; + count--; + } + CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); +} +void CBC_QRDecodedBitStreamParser::DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + CFX_ByteString buffer; + while (count > 0) { + FX_INT32 twoBytes = bits->ReadBits(13, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + FX_INT32 assembledTwoBytes = ((twoBytes / 0x0c0) << 8) | (twoBytes % 0x0c0); + if (assembledTwoBytes <= 0x01f00) { + assembledTwoBytes += 0x08140; + } else { + assembledTwoBytes += 0x0c140; + } + buffer += (FX_BYTE) (assembledTwoBytes >> 8); + buffer += (FX_BYTE) assembledTwoBytes; + count--; + } + CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); +} +void CBC_QRDecodedBitStreamParser::DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, + CBC_CommonCharacterSetECI *currentCharacterSetECI, + CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e) +{ + if(count < 0) { + e = BCExceptionNotFound; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + if((count << 3) > bits->Available()) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + FX_BYTE *readBytes = FX_Alloc(FX_BYTE, count); + FXSYS_memset32(readBytes, 0x00, count); + for(FX_INT32 i = 0; i < count; i++) { + readBytes[i] = (FX_BYTE) bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + CFX_ByteString bs(readBytes, count); + result += bs; + FX_Free(readBytes); +} +void CBC_QRDecodedBitStreamParser::DecodeAlphanumericSegment(CBC_CommonBitSource* bits, + CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e) +{ + FX_INT32 start = result.GetLength(); + while(count > 1) { + FX_INT32 nextTwoCharsBits = bits->ReadBits(11, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits / 45]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits % 45]); + count -= 2; + } + if(count == 1) { + FX_INT32 itemp = bits->ReadBits(6, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[itemp]); + } + if(fac1InEffect) { + for(FX_INT32 i = start; i < result.GetLength(); i++) { + if(result[i] == '%') { + if((i < result.GetLength() - 1) && result[i + 1] == '%') { + result.Delete(i + 1, 1); + } else { + result.SetAt(i, (FX_CHAR)0x1d); + } + } + } + } +} +void CBC_QRDecodedBitStreamParser::DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) +{ + while(count >= 3) { + FX_INT32 threeDigitsBits = bits->ReadBits(10, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(threeDigitsBits >= 1000) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits / 100]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits % 10]); + count -= 3; + } + if(count == 2) { + FX_INT32 twoDigitBits = bits->ReadBits(7, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(twoDigitBits >= 100) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits / 10]); + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits % 10]); + } else if(count == 1) { + FX_INT32 digitBits = bits->ReadBits(4, e); + BC_EXCEPTION_CHECK_ReturnVoid(e); + if(digitBits >= 10) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[digitBits]); + } +} +const CFX_ByteString CBC_QRDecodedBitStreamParser::GuessEncoding(CFX_ByteArray *bytes) +{ + return *UTF_8; +} +FX_INT32 CBC_QRDecodedBitStreamParser::ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e) +{ + FX_INT32 firstByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + if((firstByte & 0x80) == 0) { + return firstByte & 0x7f; + } else if((firstByte & 0xc0) == 0x80) { + FX_INT32 secondByte = bits->ReadBits(8, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return ((firstByte & 0x3f) << 8) | secondByte; + } else if((firstByte & 0xe0) == 0xc0) { + FX_INT32 secondThirdByte = bits->ReadBits(16, e); + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return ((firstByte & 0x1f) << 16) | secondThirdByte; + } + e = BCExceptionBadECI; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + return 0; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h new file mode 100644 index 0000000000..b64485f788 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRDECODEDBITSTREAMPARSER_H_ +#define _BC_QRDECODEDBITSTREAMPARSER_H_ +class CBC_CommonDecoderResult; +class CBC_QRCoderErrorCorrectionLevel; +class CBC_CommonBitSource; +class CBC_QRCoderVersion; +class CBC_CommonCharacterSetECI; +class CBC_QRDecodedBitStreamParser; +class CBC_QRDecodedBitStreamParser : public CFX_Object +{ +private: + const static FX_CHAR ALPHANUMERIC_CHARS[45]; + static FX_LPCSTR UTF_8; + CBC_QRDecodedBitStreamParser(); +public: + virtual ~CBC_QRDecodedBitStreamParser(); + static CBC_CommonDecoderResult* Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, + CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e); + + static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes); + static FX_INT32 ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e); + static void DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); + static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e); + static void DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, CBC_CommonCharacterSetECI *currentCharacterSetECI, + CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp new file mode 100644 index 0000000000..01d90832b9 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDetector.cpp @@ -0,0 +1,264 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonBitMatrix.h" +#include "../BC_ResultPoint.h" +#include "BC_QRFinderPattern.h" +#include "BC_QRCoderVersion.h" +#include "BC_FinderPatternInfo.h" +#include "BC_QRGridSampler.h" +#include "BC_QRAlignmentPatternFinder.h" +#include "BC_QRFinderPatternFinder.h" +#include "BC_QRDetectorResult.h" +#include "BC_QRDetector.h" +CBC_QRDetector::CBC_QRDetector(CBC_CommonBitMatrix *image): m_image(image) +{ +} +CBC_QRDetector::~CBC_QRDetector() +{ +} +CBC_QRDetectorResult *CBC_QRDetector::Detect(FX_INT32 hints, FX_INT32 &e) +{ + CBC_QRFinderPatternFinder finder(m_image); + CBC_QRFinderPatternInfo* qpi = finder.Find(hints, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr info(qpi); + CBC_QRDetectorResult* qdr = ProcessFinderPatternInfo(info.get(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qdr; +} +CBC_QRDetectorResult* CBC_QRDetector::ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e) +{ + CBC_AutoPtr topLeft(info->GetTopLeft()); + CBC_AutoPtr topRight(info->GetTopRight()); + CBC_AutoPtr bottomLeft(info->GetBottomLeft()); + FX_FLOAT moduleSize = CalculateModuleSize(topLeft.get(), topRight.get(), bottomLeft.get()); + if(moduleSize < 1.0f) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 dimension = ComputeDimension(topLeft.get(), topRight.get(), bottomLeft.get(), moduleSize, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_QRCoderVersion *provisionalVersion = CBC_QRCoderVersion::GetProvisionalVersionForDimension(dimension, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + FX_INT32 modulesBetweenFPCenters = provisionalVersion->GetDimensionForVersion() - 7; + CBC_QRAlignmentPattern * alignmentPattern = NULL; + if(provisionalVersion->GetAlignmentPatternCenters()->GetSize() > 0) { + FX_FLOAT bottomRightX = topRight->GetX() - topLeft->GetX() + bottomLeft->GetX(); + FX_FLOAT bottomRightY = topRight->GetY() - topLeft->GetY() + bottomLeft->GetY(); + FX_FLOAT correctionToTopLeft = 1.0f - 3.0f / (FX_FLOAT) modulesBetweenFPCenters; + FX_FLOAT xtemp = (topLeft->GetX() + correctionToTopLeft * (bottomRightX - topLeft->GetX())); + FX_INT32 estAlignmentX = (FX_INT32)xtemp ; + FX_FLOAT ytemp = (topLeft->GetY() + correctionToTopLeft * (bottomRightY - topLeft->GetY())); + FX_INT32 estAlignmentY = (FX_INT32)ytemp; + for(FX_INT32 i = 4; i <= 16; i <<= 1) { + CBC_QRAlignmentPattern *temp = FindAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, (FX_FLOAT) i, e); + alignmentPattern = temp; + break; + } + } + CBC_CommonBitMatrix *bits = SampleGrid(m_image, topLeft.get(), topRight.get(), bottomLeft.get(), (CBC_ResultPoint*)(alignmentPattern), dimension, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CFX_PtrArray *points = FX_NEW CFX_PtrArray; + if(alignmentPattern == NULL) { + points->Add(bottomLeft.release()); + points->Add(topLeft.release()); + points->Add(topRight.release()); + } else { + points->Add(bottomLeft.release()); + points->Add(topLeft.release()); + points->Add(topRight.release()); + points->Add(alignmentPattern); + } + return FX_NEW CBC_QRDetectorResult(bits, points); +} +CBC_CommonBitMatrix *CBC_QRDetector::SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, + FX_INT32 dimension, FX_INT32 &e) +{ + FX_FLOAT dimMinusThree = (FX_FLOAT) dimension - 3.5f; + FX_FLOAT bottomRightX; + FX_FLOAT bottomRightY; + FX_FLOAT sourceBottomRightX; + FX_FLOAT sourceBottomRightY; + if (alignmentPattern != NULL) { + bottomRightX = alignmentPattern->GetX(); + bottomRightY = alignmentPattern->GetY(); + sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f; + } else { + bottomRightX = (topRight->GetX() - topLeft->GetX()) + bottomLeft->GetX(); + bottomRightY = (topRight->GetY() - topLeft->GetY()) + bottomLeft->GetY(); + sourceBottomRightX = sourceBottomRightY = dimMinusThree; + } + CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); + CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, + dimension, dimension, + 3.5f, + 3.5f, + dimMinusThree, + 3.5f, + sourceBottomRightX, + sourceBottomRightY, + 3.5f, + dimMinusThree, + topLeft->GetX(), + topLeft->GetY(), + topRight->GetX(), + topRight->GetY(), + bottomRightX, + bottomRightY, + bottomLeft->GetX(), + bottomLeft->GetY(), e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return cbm; +} +FX_INT32 CBC_QRDetector::ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e) +{ + FX_INT32 tltrCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, topRight) / moduleSize); + FX_INT32 tlblCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, bottomLeft) / moduleSize); + FX_INT32 dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; + switch(dimension & 0x03) { + case 0: + dimension++; + break; + case 2: + dimension--; + break; + case 3: { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, 0); + } + } + return dimension; +} +FX_FLOAT CBC_QRDetector::CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft) +{ + return (CalculateModuleSizeOneWay(topLeft, topRight) + CalculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f; +} +FX_FLOAT CBC_QRDetector::CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern) +{ + FX_FLOAT moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) pattern->GetX(), + (FX_INT32) pattern->GetY(), + (FX_INT32) otherPattern->GetX(), + (FX_INT32) otherPattern->GetY()); + FX_FLOAT moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) otherPattern->GetX(), + (FX_INT32) otherPattern->GetY(), + (FX_INT32) pattern->GetX(), + (FX_INT32) pattern->GetY()); + if (FXSYS_isnan(moduleSizeEst1)) { + return moduleSizeEst2; + } + if (FXSYS_isnan(moduleSizeEst2)) { + return moduleSizeEst1; + } + return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; +} +FX_INT32 CBC_QRDetector::Round(FX_FLOAT d) +{ + return (FX_INT32)(d + 0.5f); +} +FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) +{ + FX_FLOAT result = SizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); + FX_INT32 otherToX = fromX - (toX - fromX); + if (otherToX < 0) { + otherToX = -1; + } else if (otherToX >= m_image->GetWidth()) { + otherToX = m_image->GetWidth(); + } + FX_INT32 otherToY = fromY - (toY - fromY); + if (otherToY < 0) { + otherToY = -1; + } else if (otherToY >= m_image->GetHeight()) { + otherToY = m_image->GetHeight(); + } + result += SizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); + return result - 1.0f; +} +FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) +{ + FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); + if (steep) { + FX_INT32 temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + FX_INT32 dx = FXSYS_abs(toX - fromX); + FX_INT32 dy = FXSYS_abs(toY - fromY); + FX_INT32 error = -dx >> 1; + FX_INT32 ystep = fromY < toY ? 1 : -1; + FX_INT32 xstep = fromX < toX ? 1 : -1; + FX_INT32 state = 0; + for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { + FX_INT32 realX = steep ? y : x; + FX_INT32 realY = steep ? x : y; + if (state == 1) { + if (m_image->Get(realX, realY)) { + state++; + } + } else { + if (!m_image->Get(realX, realY)) { + state++; + } + } + if (state == 3) { + FX_INT32 diffX = x - fromX; + FX_INT32 diffY = y - fromY; + return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); + } + error += dy; + if (error > 0) { + y += ystep; + error -= dx; + } + } + FX_INT32 diffX = toX - fromX; + FX_INT32 diffY = toY - fromY; + return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); +} +CBC_QRAlignmentPattern *CBC_QRDetector::FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, + FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e) +{ + FX_INT32 allowance = (FX_INT32) (allowanceFactor * overallEstModuleSize); + FX_INT32 alignmentAreaLeftX = FX_MAX(0, estAlignmentX - allowance); + FX_INT32 alignmentAreaRightX = FX_MIN(m_image->GetWidth() - 1, estAlignmentX + allowance); + if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_INT32 alignmentAreaTopY = FX_MAX(0, estAlignmentY - allowance); + FX_INT32 alignmentAreaBottomY = FX_MIN(m_image->GetHeight() - 1, estAlignmentY + allowance); + CBC_QRAlignmentPatternFinder alignmentFinder(m_image, + alignmentAreaLeftX, + alignmentAreaTopY, + alignmentAreaRightX - alignmentAreaLeftX, + alignmentAreaBottomY - alignmentAreaTopY, + overallEstModuleSize); + CBC_QRAlignmentPattern *qap = alignmentFinder.Find(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return qap; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetector.h b/xfa/src/fxbarcode/qrcode/BC_QRDetector.h new file mode 100644 index 0000000000..60c301cb7b --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDetector.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRDETECTOR_H_ +#define _BC_QRDETECTOR_H_ +class CBC_ResultPoint; +class CBC_CommonBitMatrix; +class CBC_QRDetectorResult; +class CBC_QRFinderPatternInfo; +class CBC_QRAlignmentPattern; +class CBC_QRFinderPatternFinder; +class CBC_QRCoderVersion; +class CBC_QRGridSampler; +class CBC_QRAlignmentPatternFinder; +class CBC_QRAlignmentPattern; +class CBC_QRDetector; +class CBC_QRDetector +{ +private: + CBC_CommonBitMatrix *m_image; +public: + CBC_QRDetector(CBC_CommonBitMatrix *image); + virtual ~CBC_QRDetector(); + + CBC_CommonBitMatrix* GetImage(); + CBC_QRDetectorResult* Detect(FX_INT32 hints, FX_INT32 &e); + CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e); + FX_FLOAT CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft); + FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern); + FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); + FX_FLOAT SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); + CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e); + static FX_INT32 Round(FX_FLOAT d); + static FX_INT32 ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e); + static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, + CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, FX_INT32 dimension, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp new file mode 100644 index 0000000000..369dc3a527 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.cpp @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRDetectorResult.h" +CBC_QRDetectorResult::CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points): + m_bits(bits), m_points(points) +{ +} +CBC_QRDetectorResult::~CBC_QRDetectorResult() +{ + for(FX_INT32 i = 0; i < m_points->GetSize(); i++) { + delete (CBC_ResultPoint*) (*m_points)[i]; + } + m_points->RemoveAll(); + delete m_points; + m_points = NULL; + if(m_bits != NULL) { + delete m_bits; + } + m_bits = NULL; +} +CBC_CommonBitMatrix* CBC_QRDetectorResult::GetBits() +{ + return m_bits; +} +CFX_PtrArray *CBC_QRDetectorResult::GetPoints() +{ + return m_points; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h new file mode 100644 index 0000000000..13f6d3dc46 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRDetectorResult.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRDETECTORRESULT_H_ +#define _BC_QRDETECTORRESULT_H_ +class CBC_CommonBitMatrix; +class CBC_ResultPoint; +class CBC_QRDetectorResult; +class CBC_QRDetectorResult : public CFX_Object +{ +private: + CBC_CommonBitMatrix *m_bits; + CFX_PtrArray *m_points; +public: + CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points); + virtual ~CBC_QRDetectorResult(); + CBC_CommonBitMatrix *GetBits(); + CFX_PtrArray *GetPoints(); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp new file mode 100644 index 0000000000..8d1385e99a --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.cpp @@ -0,0 +1,71 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "BC_QRFinderPattern.h" +CBC_QRFinderPattern::CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize): + CBC_ResultPoint(x, posY), + m_estimatedModuleSize(estimatedModuleSize), m_count(1) +{ +} +CBC_QRFinderPattern::~CBC_QRFinderPattern() +{ + m_count = 0; + m_x = 0.0f; + m_y = 0.0f; + m_estimatedModuleSize = 0.0f; +} +CBC_QRFinderPattern *CBC_QRFinderPattern::Clone() +{ + CBC_QRFinderPattern *temp = FX_NEW CBC_QRFinderPattern(m_x, m_y, m_estimatedModuleSize); + temp->m_count = m_count; + return temp; +} +FX_FLOAT CBC_QRFinderPattern::GetEstimatedModuleSize() +{ + return m_estimatedModuleSize; +} +FX_INT32 CBC_QRFinderPattern::GetCount() +{ + return m_count; +} +void CBC_QRFinderPattern::IncrementCount() +{ + m_count++; +} +FX_BOOL CBC_QRFinderPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) +{ + if((fabs(i - GetY()) <= moduleSize) && (fabs(j - GetX()) <= moduleSize)) { + FX_FLOAT moduleSizeDiff = fabs(moduleSize - m_estimatedModuleSize); + return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_estimatedModuleSize <= 1.0f); + } + return false; +} +FX_FLOAT CBC_QRFinderPattern::GetX() +{ + return m_x; +} +FX_FLOAT CBC_QRFinderPattern::GetY() +{ + return m_y; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h new file mode 100644 index 0000000000..af88a727d9 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRFinderPattern.h @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRFINDERPATTERN_H_ +#define _BC_QRFINDERPATTERN_H_ +class CBC_ResultPoint; +class CBC_QRFinderPattern; +class CBC_QRFinderPattern : public CBC_ResultPoint +{ +private: + FX_FLOAT m_estimatedModuleSize; + FX_INT32 m_count; +public: + CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize); + virtual ~CBC_QRFinderPattern(); + + FX_INT32 GetCount(); + FX_FLOAT GetX(); + FX_FLOAT GetY(); + FX_FLOAT GetEstimatedModuleSize(); + void IncrementCount(); + FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); + CBC_QRFinderPattern *Clone(); +}; +typedef CBC_QRFinderPattern FinderPattern; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp new file mode 100644 index 0000000000..da2d1231f8 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.cpp @@ -0,0 +1,451 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../BC_ResultPoint.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRFinderPatternFinder.h" +#include "BC_FinderPatternInfo.h" +#include "BC_QRFinderPattern.h" +const FX_INT32 CBC_QRFinderPatternFinder::CENTER_QUORUM = 2; +const FX_INT32 CBC_QRFinderPatternFinder::MIN_SKIP = 3; +const FX_INT32 CBC_QRFinderPatternFinder::MAX_MODULES = 57; +const FX_INT32 CBC_QRFinderPatternFinder::INTEGER_MATH_SHIFT = 8; +CBC_QRFinderPatternFinder::CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image) +{ + m_image = image; + m_crossCheckStateCount.SetSize(5); + m_hasSkipped = FALSE; +} +CBC_QRFinderPatternFinder::~CBC_QRFinderPatternFinder() +{ + for(FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { + delete (CBC_QRFinderPattern*)m_possibleCenters[i]; + } + m_possibleCenters.RemoveAll(); +} +class ClosestToAverageComparator +{ +private: + FX_FLOAT m_averageModuleSize; +public: + ClosestToAverageComparator(FX_FLOAT averageModuleSize) : m_averageModuleSize(averageModuleSize) + { + } + FX_INT32 operator()(FinderPattern *a, FinderPattern *b) + { + FX_FLOAT dA = (FX_FLOAT)fabs(a->GetEstimatedModuleSize() - m_averageModuleSize); + FX_FLOAT dB = (FX_FLOAT)fabs(b->GetEstimatedModuleSize() - m_averageModuleSize); + return dA < dB ? -1 : dA > dB ? 1 : 0; + } +}; +class CenterComparator +{ +public: + FX_INT32 operator()(FinderPattern *a, FinderPattern *b) + { + return b->GetCount() - a->GetCount(); + } +}; +CBC_CommonBitMatrix *CBC_QRFinderPatternFinder::GetImage() +{ + return m_image; +} +CFX_Int32Array &CBC_QRFinderPatternFinder::GetCrossCheckStateCount() +{ + m_crossCheckStateCount[0] = 0; + m_crossCheckStateCount[1] = 0; + m_crossCheckStateCount[2] = 0; + m_crossCheckStateCount[3] = 0; + m_crossCheckStateCount[4] = 0; + return m_crossCheckStateCount; +} +CFX_PtrArray *CBC_QRFinderPatternFinder::GetPossibleCenters() +{ + return &m_possibleCenters; +} +CBC_QRFinderPatternInfo* CBC_QRFinderPatternFinder::Find(FX_INT32 hint, FX_INT32 &e) +{ + FX_INT32 maxI = m_image->GetHeight(); + FX_INT32 maxJ = m_image->GetWidth(); + FX_INT32 iSkip = (3 * maxI) / (4 * MAX_MODULES); + if(iSkip < MIN_SKIP || 0) { + iSkip = MIN_SKIP; + } + FX_BOOL done = FALSE; + CFX_Int32Array stateCount; + stateCount.SetSize(5); + for(FX_INT32 i = iSkip - 1; i < maxI && !done; i += iSkip) { + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + FX_INT32 currentState = 0; + for(FX_INT32 j = 0; j < maxJ; j++) { + if(m_image->Get(j, i)) { + if((currentState & 1) == 1) { + currentState++; + } + stateCount[currentState]++; + } else { + if((currentState & 1) == 0) { + if(currentState == 4) { + if(FoundPatternCross(stateCount)) { + FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, j); + if(confirmed) { + iSkip = 2; + if(m_hasSkipped) { + done = HaveMultiplyConfirmedCenters(); + } else { + FX_INT32 rowSkip = FindRowSkip(); + if(rowSkip > stateCount[2]) { + i += rowSkip - stateCount[2] - iSkip; + j = maxJ - 1; + } + } + } else { + do { + j++; + } while (j < maxJ && !m_image->Get(j, i)); + j--; + } + currentState = 0; + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + } else { + stateCount[0] = stateCount[2]; + stateCount[1] = stateCount[3]; + stateCount[2] = stateCount[4]; + stateCount[3] = 1; + stateCount[4] = 0; + currentState = 3; + } + } else { + stateCount[++currentState]++; + } + } else { + stateCount[currentState]++; + } + } + } + if(FoundPatternCross(stateCount)) { + FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, maxJ); + if(confirmed) { + iSkip = stateCount[0]; + if(m_hasSkipped) { + done = HaveMultiplyConfirmedCenters(); + } + } + } + } + CFX_PtrArray* ptr = SelectBestpatterns(e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + CBC_AutoPtr patternInfo(ptr); + OrderBestPatterns(patternInfo.get()); + return new CBC_QRFinderPatternInfo(patternInfo.get()); +} +void CBC_QRFinderPatternFinder::OrderBestPatterns(CFX_PtrArray *patterns) +{ + FX_FLOAT abDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); + FX_FLOAT bcDistance = Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); + FX_FLOAT acDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); + CBC_QRFinderPattern *topLeft, *topRight, *bottomLeft; + if (bcDistance >= abDistance && bcDistance >= acDistance) { + topLeft = (CBC_QRFinderPattern *)(*patterns)[0]; + topRight = (CBC_QRFinderPattern *)(*patterns)[1]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + } else if (acDistance >= bcDistance && acDistance >= abDistance) { + topLeft = (CBC_QRFinderPattern *)(*patterns)[1]; + topRight = (CBC_QRFinderPattern *)(*patterns)[0]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + } else { + topLeft = (CBC_QRFinderPattern *)(*patterns)[2]; + topRight = (CBC_QRFinderPattern *)(*patterns)[0]; + bottomLeft = (CBC_QRFinderPattern *)(*patterns)[1]; + } + if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() + - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { + CBC_QRFinderPattern* temp = topRight; + topRight = bottomLeft; + bottomLeft = temp; + } + (*patterns)[0] = bottomLeft; + (*patterns)[1] = topLeft; + (*patterns)[2] = topRight; +} +FX_FLOAT CBC_QRFinderPatternFinder::Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2) +{ + FX_FLOAT dx = point1->GetX() - point2->GetX(); + FX_FLOAT dy = point1->GetY() - point2->GetY(); + return (FX_FLOAT)FXSYS_sqrt(dx * dx + dy * dy); +} +FX_FLOAT CBC_QRFinderPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) +{ + return (FX_FLOAT)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; +} +FX_BOOL CBC_QRFinderPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) +{ + FX_INT32 totalModuleSize = 0; + for (FX_INT32 i = 0; i < 5; i++) { + FX_INT32 count = stateCount[i]; + if (count == 0) { + return FALSE; + } + totalModuleSize += count; + } + if (totalModuleSize < 7) { + return FALSE; + } + FX_INT32 moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7; + FX_INT32 maxVariance = moduleSize / 2; + return FXSYS_abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance && + FXSYS_abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance && + FXSYS_abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; +} +FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, + FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxI = image->GetHeight(); + CFX_Int32Array &stateCount = GetCrossCheckStateCount(); + FX_INT32 i = startI; + while(i >= 0 && image->Get(centerJ, i)) { + stateCount[2]++; + i--; + } + if(i < 0) { + return FXSYS_nan(); + } + while(i >= 0 && !image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if(i < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while(i >= 0 && image->Get(centerJ, i) && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if(stateCount[0] > maxCount) { + return FXSYS_nan(); + } + i = startI + 1; + while(i < maxI && image->Get(centerJ, i)) { + stateCount[2]++; + i++; + } + if(i == maxI) { + return FXSYS_nan(); + } + while (i < maxI && !image->Get(centerJ, i) && stateCount[3] < maxCount) { + stateCount[3]++; + i++; + } + if (i == maxI || stateCount[3] >= maxCount) { + return FXSYS_nan(); + } + while (i < maxI && image->Get(centerJ, i) && stateCount[4] < maxCount) { + stateCount[4]++; + i++; + } + if (stateCount[4] >= maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); +} +FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 centerI, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) +{ + CBC_CommonBitMatrix *image = m_image; + FX_INT32 maxJ = image->GetWidth(); + CFX_Int32Array &stateCount = GetCrossCheckStateCount(); + FX_INT32 j = startJ; + while (j >= 0 && image->Get(j, centerI)) { + stateCount[2]++; + j--; + } + if (j < 0) { + return FXSYS_nan(); + } + while (j >= 0 && !image->Get(j, centerI) && stateCount[1] <= maxCount) { + stateCount[1]++; + j--; + } + if (j < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (j >= 0 && image->Get(j, centerI) && stateCount[0] <= maxCount) { + stateCount[0]++; + j--; + } + if (stateCount[0] > maxCount) { + return FXSYS_nan(); + } + j = startJ + 1; + while (j < maxJ && image->Get(j, centerI)) { + stateCount[2]++; + j++; + } + if (j == maxJ) { + return FXSYS_nan(); + } + while (j < maxJ && !image->Get(j, centerI) && stateCount[3] < maxCount) { + stateCount[3]++; + j++; + } + if (j == maxJ || stateCount[3] >= maxCount) { + return FXSYS_nan(); + } + while (j < maxJ && image->Get(j, centerI) && stateCount[4] < maxCount) { + stateCount[4]++; + j++; + } + if (stateCount[4] >= maxCount) { + return FXSYS_nan(); + } + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + + stateCount[2] + stateCount[3] + + stateCount[4]; + if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j) : FXSYS_nan(); +} +FX_BOOL CBC_QRFinderPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) +{ + FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + FX_FLOAT centerJ = CenterFromEnd(stateCount, j); + FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, stateCount[2], stateCountTotal); + if(!FXSYS_isnan(centerI)) { + centerJ = CrossCheckHorizontal((FX_INT32) centerJ, (FX_INT32) centerI, stateCount[2], stateCountTotal); + if(!FXSYS_isnan(centerJ)) { + FX_FLOAT estimatedModuleSize = (FX_FLOAT) stateCountTotal / 7.0f; + FX_BOOL found = FALSE; + FX_INT32 max = m_possibleCenters.GetSize(); + for(FX_INT32 index = 0; index < max; index++) { + CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)(m_possibleCenters[index]); + if(center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { + center->IncrementCount(); + found = TRUE; + break; + } + } + if(!found) { + m_possibleCenters.Add(FX_NEW CBC_QRFinderPattern(centerJ, centerI, estimatedModuleSize)); + } + return TRUE; + } + } + return FALSE; +} +FX_INT32 CBC_QRFinderPatternFinder::FindRowSkip() +{ + FX_INT32 max = m_possibleCenters.GetSize(); + if (max <= 1) { + return 0; + } + FinderPattern *firstConfirmedCenter = NULL; + for (FX_INT32 i = 0; i < max; i++) { + CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)m_possibleCenters[i]; + if (center->GetCount() >= CENTER_QUORUM) { + if (firstConfirmedCenter == NULL) { + firstConfirmedCenter = center; + } else { + m_hasSkipped = TRUE; + return (FX_INT32) ((fabs(firstConfirmedCenter->GetX() - center->GetX()) - + fabs(firstConfirmedCenter->GetY() - center->GetY())) / 2); + } + } + } + return 0; +} +FX_BOOL CBC_QRFinderPatternFinder::HaveMultiplyConfirmedCenters() +{ + FX_INT32 confirmedCount = 0; + FX_FLOAT totalModuleSize = 0.0f; + FX_INT32 max = m_possibleCenters.GetSize(); + FX_INT32 i; + for (i = 0; i < max; i++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; + if (pattern->GetCount() >= CENTER_QUORUM) { + confirmedCount++; + totalModuleSize += pattern->GetEstimatedModuleSize(); + } + } + if (confirmedCount < 3) { + return FALSE; + } + FX_FLOAT average = totalModuleSize / (FX_FLOAT) max; + FX_FLOAT totalDeviation = 0.0f; + for (i = 0; i < max; i++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; + totalDeviation += fabs(pattern->GetEstimatedModuleSize() - average); + } + return totalDeviation <= 0.05f * totalModuleSize; +} +inline FX_BOOL centerComparator(FX_LPVOID a, FX_LPVOID b) +{ + return ((CBC_QRFinderPattern*)b)->GetCount() < ((CBC_QRFinderPattern*)a)->GetCount(); +} +CFX_PtrArray *CBC_QRFinderPatternFinder::SelectBestpatterns(FX_INT32 &e) +{ + FX_INT32 startSize = m_possibleCenters.GetSize(); + if(m_possibleCenters.GetSize() < 3) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + } + FX_FLOAT average = 0.0f; + if(startSize > 3) { + FX_FLOAT totalModuleSize = 0.0f; + for(FX_INT32 i = 0; i < startSize; i++) { + totalModuleSize += ((CBC_QRFinderPattern*)m_possibleCenters[i])->GetEstimatedModuleSize(); + } + average = totalModuleSize / (FX_FLOAT)startSize; + for(FX_INT32 j = 0; j < m_possibleCenters.GetSize() && m_possibleCenters.GetSize() > 3; j++) { + CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[j]; + if(fabs(pattern->GetEstimatedModuleSize() - average) > 0.2f * average) { + delete pattern; + m_possibleCenters.RemoveAt(j); + j--; + } + } + } + if(m_possibleCenters.GetSize() > 3) { + BC_FX_PtrArray_Sort(m_possibleCenters, centerComparator); + } + CFX_PtrArray *vec = FX_NEW CFX_PtrArray(); + vec->SetSize(3); + (*vec)[0] = ((CBC_QRFinderPattern*)m_possibleCenters[0])->Clone(); + (*vec)[1] = ((CBC_QRFinderPattern*)m_possibleCenters[1])->Clone(); + (*vec)[2] = ((CBC_QRFinderPattern*)m_possibleCenters[2])->Clone(); + return vec; +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h new file mode 100644 index 0000000000..7470b553ee --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRFinderPatternFinder.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRFINDERPATTERNFINDER_H_ +#define _BC_QRFINDERPATTERNFINDER_H_ +class CBC_CommonBitMatrix; +class CBC_QRFinderPattern; +class CBC_ResultPoint; +class CBC_QRFinderPatternInfo; +class CBC_QRFinderPatternFinder; +class CBC_QRFinderPatternFinder : public CFX_Object +{ +private: + const static FX_INT32 CENTER_QUORUM; + const static FX_INT32 MIN_SKIP; + const static FX_INT32 MAX_MODULES; + const static FX_INT32 INTEGER_MATH_SHIFT; + FX_BOOL m_hasSkipped; + CBC_CommonBitMatrix* m_image; + CFX_Int32Array m_crossCheckStateCount; + CFX_PtrArray m_possibleCenters; +public: + CBC_QRFinderPatternFinder(CBC_CommonBitMatrix *image); + virtual ~CBC_QRFinderPatternFinder(); + FX_INT32 FindRowSkip(); + CBC_CommonBitMatrix* GetImage(); + CBC_QRFinderPatternInfo* Find(FX_INT32 hint, FX_INT32 &e); + + CFX_Int32Array &GetCrossCheckStateCount(); + CFX_PtrArray *GetPossibleCenters(); + CFX_PtrArray *SelectBestpatterns(FX_INT32 &e); + + FX_BOOL HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); + FX_BOOL HaveMultiplyConfirmedCenters(); + FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); + FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); + FX_FLOAT CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 CenterI, FX_INT32 maxCOunt, FX_INT32 originalStateCountTotal); + static void OrderBestPatterns(CFX_PtrArray *patterns); + static FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); + static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2); +}; +#endif diff --git a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp new file mode 100644 index 0000000000..8783078690 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.cpp @@ -0,0 +1,128 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +// Original code is licensed as follows: +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../barcode.h" +#include "../common/BC_CommonPerspectiveTransform.h" +#include "../common/BC_CommonBitMatrix.h" +#include "BC_QRGridSampler.h" +CBC_QRGridSampler CBC_QRGridSampler::m_gridSampler; +CBC_QRGridSampler::CBC_QRGridSampler() +{ +} +CBC_QRGridSampler::~CBC_QRGridSampler() +{ +} +CBC_QRGridSampler &CBC_QRGridSampler::GetInstance() +{ + return m_gridSampler; +} +void CBC_QRGridSampler::CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e) +{ + FX_INT32 width = image->GetWidth(); + FX_INT32 height = image->GetHeight(); + FX_BOOL nudged = TRUE; + FX_INT32 offset; + for (offset = 0; offset < points->GetSize() && nudged; offset += 2) { + FX_INT32 x = (FX_INT32) (*points)[offset]; + FX_INT32 y = (FX_INT32) (*points)[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + nudged = FALSE; + if (x == -1) { + (*points)[offset] = 0.0f; + nudged = TRUE; + } else if (x == width) { + (*points)[offset] = (FX_FLOAT)(width - 1); + nudged = TRUE; + } + if (y == -1) { + (*points)[offset + 1] = 0.0f; + nudged = TRUE; + } else if (y == height) { + (*points)[offset + 1] = (FX_FLOAT)(height - 1); + nudged = TRUE; + } + } + nudged = TRUE; + for (offset = (*points).GetSize() - 2; offset >= 0 && nudged; offset -= 2) { + FX_INT32 x = (FX_INT32) (*points)[offset]; + FX_INT32 y = (FX_INT32) (*points)[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnVoid(e); + } + nudged = FALSE; + if (x == -1) { + (*points)[offset] = 0.0f; + nudged = TRUE; + } else if (x == width) { + (*points)[offset] = (FX_FLOAT)(width - 1); + nudged = TRUE; + } + if (y == -1) { + (*points)[offset + 1] = 0.0f; + nudged = TRUE; + } else if (y == height) { + (*points)[offset + 1] = (FX_FLOAT)(height - 1); + nudged = TRUE; + } + } +} +CBC_CommonBitMatrix *CBC_QRGridSampler::SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, + FX_FLOAT p1ToX, FX_FLOAT p1ToY, + FX_FLOAT p2ToX, FX_FLOAT p2ToY, + FX_FLOAT p3ToX, FX_FLOAT p3ToY, + FX_FLOAT p4ToX, FX_FLOAT p4ToY, + FX_FLOAT p1FromX, FX_FLOAT p1FromY, + FX_FLOAT p2FromX, FX_FLOAT p2FromY, + FX_FLOAT p3FromX, FX_FLOAT p3FromY, + FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e) +{ + CBC_AutoPtr transform(CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral( + p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, + p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY)); + CBC_CommonBitMatrix *tempBitM = FX_NEW CBC_CommonBitMatrix(); + tempBitM->Init(dimensionX, dimensionY); + CBC_AutoPtr bits(tempBitM); + CFX_FloatArray points; + points.SetSize(dimensionX << 1); + for (FX_INT32 y = 0; y < dimensionY; y++) { + FX_INT32 max = points.GetSize(); + FX_FLOAT iValue = (FX_FLOAT) (y + 0.5f); + FX_INT32 x; + for (x = 0; x < max; x += 2) { + points[x] = (FX_FLOAT) ((x >> 1) + 0.5f); + points[x + 1] = iValue; + } + transform->TransformPoints(&points); + CheckAndNudgePoints(image, &points, e); + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + for (x = 0; x < max; x += 2) { + if (image->Get((FX_INT32) points[x], (FX_INT32) points[x + 1])) { + bits->Set(x >> 1, y); + } + } + } + return bits.release(); +} diff --git a/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h new file mode 100644 index 0000000000..0b8c7d3ab7 --- /dev/null +++ b/xfa/src/fxbarcode/qrcode/BC_QRGridSampler.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_QRGRIDSAMPLER_H_ +#define _BC_QRGRIDSAMPLER_H_ +class CBC_CommonBitMatrix; +class CBC_CommonPerspectiveTransform; +class CBC_CommonDefaultGridSampler; +class CBC_QRGridSampler; +class CBC_QRGridSampler +{ +private: + static CBC_QRGridSampler m_gridSampler; +public: + CBC_QRGridSampler(); + virtual ~CBC_QRGridSampler(); + virtual CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, + FX_FLOAT p1ToX, FX_FLOAT p1ToY, + FX_FLOAT p2ToX, FX_FLOAT p2ToY, + FX_FLOAT p3ToX, FX_FLOAT p3ToY, + FX_FLOAT p4ToX, FX_FLOAT p4ToY, + FX_FLOAT p1FromX, FX_FLOAT p1FromY, + FX_FLOAT p2FromX, FX_FLOAT p2FromY, + FX_FLOAT p3FromX, FX_FLOAT p3FromY, + FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e); + + static CBC_QRGridSampler &GetInstance(); + static void CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e); +}; +#endif diff --git a/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp b/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp deleted file mode 100644 index dabed3699e..0000000000 --- a/xfa/src/fxbarcode/src/BC_ASCIIEncoder.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_ASCIIEncoder.h" -CBC_ASCIIEncoder::CBC_ASCIIEncoder() -{ -} -CBC_ASCIIEncoder::~CBC_ASCIIEncoder() -{ -} -FX_INT32 CBC_ASCIIEncoder::getEncodingMode() -{ - return ASCII_ENCODATION; -} -void CBC_ASCIIEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) -{ - FX_INT32 n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(context.m_msg, context.m_pos); - if (n >= 2) { - FX_WCHAR code = encodeASCIIDigits(context.m_msg.GetAt(context.m_pos), context.m_msg.GetAt(context.m_pos + 1), e); - if (e != BCExceptionNO) { - return; - } - context.writeCodeword(code); - context.m_pos += 2; - } else { - FX_WCHAR c = context.getCurrentChar(); - FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - switch (newMode) { - case BASE256_ENCODATION: - context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256); - context.signalEncoderChange(BASE256_ENCODATION); - return; - case C40_ENCODATION: - context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40); - context.signalEncoderChange(C40_ENCODATION); - return; - case X12_ENCODATION: - context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12); - context.signalEncoderChange(X12_ENCODATION); - break; - case TEXT_ENCODATION: - context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT); - context.signalEncoderChange(TEXT_ENCODATION); - break; - case EDIFACT_ENCODATION: - context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT); - context.signalEncoderChange(EDIFACT_ENCODATION); - break; - default: - e = BCExceptionIllegalStateIllegalMode; - return; - } - } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) { - context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT); - context.writeCodeword((FX_WCHAR) (c - 128 + 1)); - context.m_pos++; - } else { - context.writeCodeword((FX_WCHAR) (c + 1)); - context.m_pos++; - } - } -} -FX_WCHAR CBC_ASCIIEncoder::encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e) -{ - if (CBC_HighLevelEncoder::isDigit(digit1) && CBC_HighLevelEncoder::isDigit(digit2)) { - FX_INT32 num = (digit1 - 48) * 10 + (digit2 - 48); - FX_WCHAR a = (FX_WCHAR) (num + 130); - return (FX_WCHAR) (num + 130); - } - e = BCExceptionIllegalArgumentNotGigits; - return 0; -} diff --git a/xfa/src/fxbarcode/src/BC_BarCode.cpp b/xfa/src/fxbarcode/src/BC_BarCode.cpp deleted file mode 100644 index 099644bb13..0000000000 --- a/xfa/src/fxbarcode/src/BC_BarCode.cpp +++ /dev/null @@ -1,872 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_Writer.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedCode39Reader.h" -#include "include/BC_OnedCode39Writer.h" -#include "include/BC_OnedCodaBarReader.h" -#include "include/BC_OnedCodaBarWriter.h" -#include "include/BC_OnedCode128Reader.h" -#include "include/BC_OnedCode128Writer.h" -#include "include/BC_OnedEAN8Reader.h" -#include "include/BC_OnedEAN8Writer.h" -#include "include/BC_OnedEAN13Reader.h" -#include "include/BC_OnedEAN13Writer.h" -#include "include/BC_OnedUPCAReader.h" -#include "include/BC_OnedUPCAWriter.h" -#include "include/BC_QRCodeReader.h" -#include "include/BC_QRCodeWriter.h" -#include "include/BC_PDF417Compaction.h" -#include "include/BC_PDF417.h" -#include "include/BC_PDF417Writer.h" -#include "include/BC_DataMatrixReader.h" -#include "include/BC_DataMatrixWriter.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_BufferedImageLuminanceSource.h" -#include "include/BC_Binarizer.h" -#include "include/BC_GlobalHistogramBinarizer.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_UtilCodingConvert.h" -#include "include/BC_PDF417HighLevelEncoder.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_PDF417Detector.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_DecoderResult.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417BarcodeValue.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -#include "include/BC_PDF417DetectionResult.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417CodewordDecoder.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECErrorCorrection.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_PDF417ScanningDecoder.h" -#include "include/BC_PDF417Reader.h" -CBC_CodeBase :: CBC_CodeBase() -{ -} -CBC_CodeBase :: ~CBC_CodeBase() -{ -} -FX_BOOL CBC_CodeBase::SetCharEncoding(FX_INT32 encoding) -{ - if (m_pBCWriter) { - return m_pBCWriter->SetCharEncoding(encoding); - } - return FALSE; -} -FX_BOOL CBC_CodeBase::SetModuleHeight(FX_INT32 moduleHeight) -{ - if (m_pBCWriter) { - return m_pBCWriter->SetModuleHeight(moduleHeight); - } - return FALSE; -} -FX_BOOL CBC_CodeBase::SetModuleWidth(FX_INT32 moduleWidth) -{ - if (m_pBCWriter) { - return m_pBCWriter->SetModuleWidth(moduleWidth); - } - return FALSE; -} -FX_BOOL CBC_CodeBase::SetHeight(FX_INT32 height) -{ - if (m_pBCWriter) { - return m_pBCWriter->SetHeight(height); - } - return FALSE; -} -FX_BOOL CBC_CodeBase::SetWidth(FX_INT32 width) -{ - if (m_pBCWriter) { - return m_pBCWriter->SetWidth(width); - } - return FALSE; -} -void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) -{ - if (m_pBCWriter) { - m_pBCWriter->SetBackgroundColor(backgroundColor); - } -} -void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) -{ - if (m_pBCWriter) { - m_pBCWriter->SetBarcodeColor(foregroundColor); - } -} -CBC_OneCode::CBC_OneCode() -{ -}; -CBC_OneCode::~CBC_OneCode() -{ -} -FX_BOOL CBC_OneCode::CheckContentValidity(FX_WSTR contents) -{ - if (m_pBCWriter) { - return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents); - } - return FALSE; -} -CFX_WideString CBC_OneCode::FilterContents(FX_WSTR contents) -{ - CFX_WideString tmp; - if (m_pBCWriter == NULL) { - return tmp; - } - return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); -} -void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum); - } -} -void CBC_OneCode::SetDataLength(FX_INT32 length) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length); - } -} -void CBC_OneCode::SetCalChecksum(FX_BOOL calc) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc); - } -} -FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) -{ - if (m_pBCWriter) { - return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont); - } - return FALSE; -} -void CBC_OneCode::SetFontSize(FX_FLOAT size) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size); - } -} -void CBC_OneCode::SetFontStyle(FX_INT32 style) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style); - } -} -void CBC_OneCode::SetFontColor(FX_ARGB color) -{ - if (m_pBCWriter) { - ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color); - } -} -CBC_Code39::CBC_Code39() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCode39Reader); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCode39Writer); -} -CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) -{ - m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit); - m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer; -} -CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) -{ - m_pBCReader = (CBC_Reader*) FX_NEW CBC_OnedCode39Reader(usingCheckDigit, extendedMode); - m_pBCWriter = (CBC_Writer*) FX_NEW CBC_OnedCode39Writer(extendedMode); -} -CBC_Code39::~CBC_Code39() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_Code39::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_CODE_39; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString filtercontents = ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents); - CFX_WideString renderContents = ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents); - m_renderContents = renderContents; - CFX_ByteString byteString = filtercontents.UTF8Encode(); - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(renderContents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)->encodedContents(m_renderContents, e); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_Code39::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_Code39::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) -{ - if (m_pBCWriter) { - return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location); - } - return FALSE; -} -FX_BOOL CBC_Code39::SetWideNarrowRatio(FX_INT32 ratio) -{ - if (m_pBCWriter) { - return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio); - } - return FALSE; -} -CBC_Codabar::CBC_Codabar() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedCodaBarReader); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedCodaBarWriter); -} -CBC_Codabar::~CBC_Codabar() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) -{ - if (m_pBCWriter) { - return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start); - } - return FALSE; -} -FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) -{ - if (m_pBCWriter) { - return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end); - } - return FALSE; -} -FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) -{ - return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetTextLocation(location); -} -FX_BOOL CBC_Codabar::SetWideNarrowRatio(FX_INT32 ratio) -{ - if (m_pBCWriter) { - return ((CBC_OnedCodaBarWriter*) m_pBCWriter)->SetWideNarrowRatio(ratio); - } - return FALSE; -} -FX_BOOL CBC_Codabar::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_CODABAR; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString filtercontents = ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents); - CFX_ByteString byteString = filtercontents.UTF8Encode(); - m_renderContents = filtercontents; - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(filtercontents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, renderCon, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - CFX_WideString renderCon = ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, renderCon, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_Codabar::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -CBC_Code128::CBC_Code128(BC_TYPE type) -{ - m_pBCReader = (CBC_Reader *) FX_NEW (CBC_OnedCode128Reader); - m_pBCWriter = (CBC_Writer *) FX_NEW CBC_OnedCode128Writer(type); -} -CBC_Code128::~CBC_Code128() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) -{ - if (m_pBCWriter) { - return (( CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location); - } - return FALSE; -} -FX_BOOL CBC_Code128::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_CODE_128; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString content = contents; - if (contents.GetLength() % 2 && ((CBC_OnedCode128Writer *)m_pBCWriter)->GetType() == BC_CODE128_C) { - content += '0'; - } - CFX_WideString encodeContents = ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content); - m_renderContents = encodeContents; - CFX_ByteString byteString = encodeContents.UTF8Encode(); - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_Code128::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_Code128::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -CBC_EAN8::CBC_EAN8() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN8Reader); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN8Writer); -} -CBC_EAN8::~CBC_EAN8() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -CFX_WideString CBC_EAN8::Preprocess(FX_WSTR contents) -{ - CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); - FX_INT32 length = encodeContents.GetLength(); - if (length <= 7) { - for (FX_INT32 i = 0; i < 7 - length; i++) { - encodeContents = FX_WCHAR('0') + encodeContents; - } - CFX_ByteString byteString = encodeContents.UTF8Encode(); - FX_INT32 checksum = ((CBC_OnedEAN8Writer *)m_pBCWriter)->CalcChecksum(byteString); - encodeContents += FX_WCHAR(checksum - 0 + '0'); - } - if (length > 8) { - encodeContents = encodeContents.Mid(0, 8); - } - return encodeContents; -} -FX_BOOL CBC_EAN8::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_EAN_8; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString encodeContents = Preprocess(contents); - CFX_ByteString byteString = encodeContents.UTF8Encode(); - m_renderContents = encodeContents; - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_EAN8::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -CBC_EAN13::CBC_EAN13() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedEAN13Reader); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedEAN13Writer); -} -CBC_EAN13::~CBC_EAN13() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -CFX_WideString CBC_EAN13::Preprocess(FX_WSTR contents) -{ - CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); - FX_INT32 length = encodeContents.GetLength(); - if (length <= 12) { - for (FX_INT32 i = 0; i < 12 - length; i++) { - encodeContents = FX_WCHAR('0') + encodeContents; - } - CFX_ByteString byteString = encodeContents.UTF8Encode(); - FX_INT32 checksum = ((CBC_OnedEAN13Writer *)m_pBCWriter)->CalcChecksum(byteString); - byteString += checksum - 0 + '0'; - encodeContents = byteString.UTF8Decode(); - } - if (length > 13) { - encodeContents = encodeContents.Mid(0, 13); - } - return encodeContents; -} -FX_BOOL CBC_EAN13::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_EAN_13; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString encodeContents = Preprocess(contents); - CFX_ByteString byteString = encodeContents.UTF8Encode(); - m_renderContents = encodeContents; - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_EAN13::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -CBC_UPCA::CBC_UPCA() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_OnedUPCAReader); - ((CBC_OnedUPCAReader *)m_pBCReader)->Init(); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_OnedUPCAWriter); -} -CBC_UPCA::~CBC_UPCA() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -CFX_WideString CBC_UPCA::Preprocess(FX_WSTR contents) -{ - CFX_WideString encodeContents = ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents); - FX_INT32 length = encodeContents.GetLength(); - if (length <= 11) { - for (FX_INT32 i = 0; i < 11 - length; i++) { - encodeContents = FX_WCHAR('0') + encodeContents; - } - CFX_ByteString byteString = encodeContents.UTF8Encode(); - FX_INT32 checksum = ((CBC_OnedUPCAWriter *)m_pBCWriter)->CalcChecksum(byteString); - byteString += checksum - 0 + '0'; - encodeContents = byteString.UTF8Decode(); - } - if (length > 12) { - encodeContents = encodeContents.Mid(0, 12); - } - return encodeContents; -} -FX_BOOL CBC_UPCA::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - if(contents.IsEmpty()) { - e = BCExceptionNoContents; - return FALSE; - } - BCFORMAT format = BCFORMAT_UPC_A; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - CFX_WideString encodeContents = Preprocess(contents); - CFX_ByteString byteString = encodeContents.UTF8Encode(); - m_renderContents = encodeContents; - ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init(); - FX_BYTE *data = m_pBCWriter->Encode(byteString, format, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_OneDimWriter*)m_pBCWriter)->RenderResult(encodeContents, data, outWidth, isDevice, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_OneDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, m_renderContents, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_UPCA::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(str, str.GetLength()); -} -CBC_QRCode::CBC_QRCode() -{ - m_pBCReader = (CBC_Reader *) FX_NEW (CBC_QRCodeReader); - ((CBC_QRCodeReader*)m_pBCReader)->Init(); - m_pBCWriter = (CBC_Writer *) FX_NEW (CBC_QRCodeWriter); -} -CBC_QRCode ::~CBC_QRCode() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_QRCode::SetVersion(FX_INT32 version) -{ - if (version < 0 || version > 40) { - return FALSE; - } - if (m_pBCWriter == NULL) { - return FALSE; - } - return((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version); -} -FX_BOOL CBC_QRCode::SetErrorCorrectionLevel (FX_INT32 level) -{ - if (level < 0 || level > 3) { - return FALSE; - } - if (m_pBCWriter == NULL) { - return FALSE; - } - return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level); -} -FX_BOOL CBC_QRCode::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - FX_BYTE *data = ((CBC_QRCodeWriter*)m_pBCWriter)->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)->GetErrorCorrectionLevel(), outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); - return TRUE; -} -FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_QRCode::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); -} -CBC_PDF417I::CBC_PDF417I() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_PDF417Reader); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_PDF417Writer); -} -CBC_PDF417I::~CBC_PDF417I() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel (FX_INT32 level) -{ - ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level); - return TRUE; -} -void CBC_PDF417I::SetTruncated(FX_BOOL truncated) -{ - ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated); -} -FX_BOOL CBC_PDF417I::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - BCFORMAT format = BCFORMAT_PDF_417; - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - FX_BYTE *data = ((CBC_PDF417Writer*)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); - return TRUE; -} -FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_PDF417I::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength()); -} -CBC_DataMatrix::CBC_DataMatrix() -{ - m_pBCReader = (CBC_Reader*) FX_NEW (CBC_DataMatrixReader); - ((CBC_DataMatrixReader*)m_pBCReader)->Init(); - m_pBCWriter = (CBC_Writer*) FX_NEW (CBC_DataMatrixWriter); -} -CBC_DataMatrix::~CBC_DataMatrix() -{ - if(m_pBCReader) { - delete(m_pBCReader); - m_pBCReader = NULL; - } - if(m_pBCWriter) { - delete(m_pBCWriter); - m_pBCWriter = NULL; - } -} -FX_BOOL CBC_DataMatrix::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e) -{ - FX_INT32 outWidth = 0; - FX_INT32 outHeight = 0; - FX_BYTE *data = ((CBC_DataMatrixWriter *)m_pBCWriter)->Encode(contents, outWidth, outHeight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e); - FX_Free(data); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx); - return TRUE; -} -FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e) -{ - ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return TRUE; -} -CFX_WideString CBC_DataMatrix::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 hight, FX_INT32 &e) -{ - CFX_WideString str; - return str; -} -CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - return CFX_WideString::FromUTF8(retStr, retStr.GetLength()); -} diff --git a/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp b/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp deleted file mode 100644 index bb954f2543..0000000000 --- a/xfa/src/fxbarcode/src/BC_Base256Encoder.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_Base256Encoder.h" -CBC_Base256Encoder::CBC_Base256Encoder() -{ -} -CBC_Base256Encoder::~CBC_Base256Encoder() -{ -} -FX_INT32 CBC_Base256Encoder::getEncodingMode() -{ - return BASE256_ENCODATION; -} -void CBC_Base256Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) -{ - CFX_WideString buffer; - buffer += (FX_WCHAR)'\0'; - while (context.hasMoreCharacters()) { - FX_WCHAR c = context.getCurrentChar(); - buffer += c; - context.m_pos++; - FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - FX_INT32 dataCount = buffer.GetLength() - 1; - FX_CHAR buf[128]; -#if defined(_FX_WINAPI_PARTITION_APP_) - memset(buf, 0, sizeof(FX_CHAR) * 128); - _itoa_s(dataCount, buf, 128, 10); -#else - FXSYS_itoa(dataCount, buf, 10); -#endif - buffer.SetAt(0, FX_WCHAR(*buf) - '0'); - FX_INT32 lengthFieldSize = 1; - FX_INT32 currentSize = context.getCodewordCount() + dataCount + lengthFieldSize; - context.updateSymbolInfo(currentSize, e); - if (e != BCExceptionNO) { - return; - } - FX_BOOL mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0; - if (context.hasMoreCharacters() || mustPad) { - if (dataCount <= 249) { - buffer.SetAt(0, (FX_WCHAR) dataCount); - } else if (dataCount > 249 && dataCount <= 1555) { - buffer.SetAt(0, (FX_WCHAR) ((dataCount / 250) + 249)); - buffer.Insert(1, (FX_WCHAR) (dataCount % 250)); - } else { - e = BCExceptionIllegalStateMessageLengthInvalid; - return; - } - } - for (FX_INT32 i = 0, c = buffer.GetLength(); i < c; i++) { - context.writeCodeword(randomize255State(buffer.GetAt(i), context.getCodewordCount() + 1)); - } -} -FX_WCHAR CBC_Base256Encoder::randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition) -{ - FX_INT32 pseudoRandom = ((149 * codewordPosition) % 255) + 1; - FX_INT32 tempVariable = ch + pseudoRandom; - if (tempVariable <= 255) { - return (FX_WCHAR) tempVariable; - } else { - return (FX_WCHAR) (tempVariable - 256); - } -} diff --git a/xfa/src/fxbarcode/src/BC_Binarizer.cpp b/xfa/src/fxbarcode/src/BC_Binarizer.cpp deleted file mode 100644 index daf450c483..0000000000 --- a/xfa/src/fxbarcode/src/BC_Binarizer.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_Binarizer.h" -CBC_Binarizer::CBC_Binarizer(CBC_LuminanceSource *source) -{ - m_source = source; -} -CBC_Binarizer::~CBC_Binarizer() -{ -} -CBC_LuminanceSource *CBC_Binarizer::GetLuminanceSource() -{ - return m_source; -} diff --git a/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp b/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp deleted file mode 100644 index 707b5c859c..0000000000 --- a/xfa/src/fxbarcode/src/BC_BinaryBitmap.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Binarizer.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_BinaryBitmap.h" -CBC_BinaryBitmap::CBC_BinaryBitmap(CBC_Binarizer *binarizer): m_binarizer(binarizer), m_matrix(NULL) -{ -} -CBC_BinaryBitmap::~CBC_BinaryBitmap() -{ - if (m_matrix != NULL) { - delete m_matrix; - } - m_matrix = NULL; -} -FX_INT32 CBC_BinaryBitmap::GetHeight() -{ - return m_binarizer->GetLuminanceSource()->GetHeight(); -} -FX_INT32 CBC_BinaryBitmap::GetWidth() -{ - return m_binarizer->GetLuminanceSource()->GetWidth(); -} -CBC_CommonBitMatrix *CBC_BinaryBitmap::GetMatrix(FX_INT32 &e) -{ - if (m_matrix == NULL) { - m_matrix = m_binarizer->GetBlackMatrix(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return m_matrix; -} -FX_BOOL CBC_BinaryBitmap::IsCropSupported() -{ - return m_binarizer->GetLuminanceSource()->IsCropSupported(); -} -FX_BOOL CBC_BinaryBitmap::IsRotateSupported() -{ - return m_binarizer->GetLuminanceSource()->IsRotateSupported(); -} -CBC_CommonBitArray *CBC_BinaryBitmap::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) -{ - CBC_CommonBitArray *temp = m_binarizer->GetBlackRow(y, row, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CBC_CommonBitMatrix *CBC_BinaryBitmap::GetBlackMatrix(FX_INT32 &e) -{ - if (m_matrix == NULL) { - m_matrix = m_binarizer->GetBlackMatrix(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return m_matrix; -} diff --git a/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp b/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp deleted file mode 100644 index 475eed06a6..0000000000 --- a/xfa/src/fxbarcode/src/BC_BufferedImageLuminanceSource.cpp +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_BufferedImageLuminanceSource.h" -class CBC_Pause : public IFX_Pause -{ -public: - virtual FX_BOOL NeedToPauseNow() - { - return TRUE; - } -}; -static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread) -{ - CFX_DIBitmap* bitmap = NULL; - CCodec_ModuleMgr* pCodecMgr = NULL; - ICodec_ProgressiveDecoder* pImageCodec = NULL; - pCodecMgr = CCodec_ModuleMgr::Create(); - pImageCodec = pCodecMgr->CreateProgressiveDecoder(); - FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH; - status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN); - if (status != FXCODEC_STATUS_FRAME_READY) { - return NULL; - } - bitmap = FX_NEW CFX_DIBitmap; - bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb); - bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF)); - CBC_Pause pause; - FX_INT32 frames; - status = pImageCodec->GetFrames(frames, &pause); - while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) { - status = pImageCodec->GetFrames(frames, &pause); - } - if (status != FXCODEC_STATUS_DECODE_READY) { - goto except; - } - status = pImageCodec->StartDecode(bitmap, - 0, - 0, - bitmap->GetWidth(), - bitmap->GetHeight(), - 0, - FALSE); - if (status == FXCODEC_STATUS_ERR_PARAMS) { - goto except; - } - if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) { - goto except; - } - while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { - status = pImageCodec->ContinueDecode(&pause); - } - if (status != FXCODEC_STATUS_DECODE_FINISH) { - goto except; - } - if (pImageCodec) { - delete pImageCodec; - pImageCodec = NULL; - } - if (pCodecMgr) { - pCodecMgr->Destroy(); - pCodecMgr = NULL; - } - return bitmap; -except: - if (pImageCodec) { - delete pImageCodec; - pImageCodec = NULL; - } - if (pCodecMgr) { - pCodecMgr->Destroy(); - pCodecMgr = NULL; - } - if (bitmap) { - delete bitmap; - } - return NULL; -} -CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename) -{ - m_height = 0; - m_width = 0; - m_bytesPerLine = 0; - m_top = 0; - m_left = 0; -} -void CBC_BufferedImageLuminanceSource::Init(FX_INT32 &e) -{ - IFX_FileRead* fileread = FX_CreateFileRead(m_filename); - m_pBitmap = CreateDIBSource(fileread); - if (m_pBitmap == NULL) { - e = BCExceptionLoadFile; - return; - } - m_pBitmap->ConvertFormat(FXDIB_Argb); - m_height = m_pBitmap->GetHeight(); - m_width = m_pBitmap->GetWidth(); - m_rgbData.SetSize(m_height * m_width); - m_bytesPerLine = m_width * 4; - m_top = 0; - m_left = 0; -} -CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0) -{ - m_pBitmap = pBitmap->Clone(); - m_pBitmap->ConvertFormat(FXDIB_Argb); - m_height = m_pBitmap->GetHeight(); - m_width = m_pBitmap->GetWidth(); - m_rgbData.SetSize(m_height * m_width); - m_bytesPerLine = m_width * 4; - m_top = 0; - m_left = 0; -} -CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource() -{ - delete m_pBitmap; - m_pBitmap = NULL; -} -CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) -{ - if (y < 0 || y >= m_height) { - e = BCExceptionRequestedRowIsOutSizeTheImage; - return NULL; - } - FX_INT32 width = m_width; - if(row.GetSize() == 0 || row.GetSize() < width) { - row.SetSize(width); - } - if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) { - m_rgbData.SetSize(width); - } - FX_INT32* rowLine = (FX_INT32*)m_pBitmap->GetScanline(y); - FX_INT32 x; - for (x = 0; x < width; x++) { - FX_INT32 pixel = rowLine[x]; - FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + - 601 * ((pixel >> 8) & 0xFF) + - 117 * (pixel & 0xFF)) >> 10; - row[x] = (FX_BYTE) luminance; - } - return &row; -} -CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix() -{ - CFX_ByteArray *matirx = FX_NEW CFX_ByteArray(); - matirx->SetSize(m_bytesPerLine * m_height); - FX_INT32 *rgb = (FX_INT32*)m_pBitmap->GetBuffer(); - FX_INT32 y; - for(y = 0; y < m_height; y++) { - FX_INT32 offset = y * m_width; - FX_INT32 x; - for(x = 0; x < m_width; x++) { - FX_INT32 pixel = rgb[offset + x]; - FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) + - 601 * ((pixel >> 8) & 0xFF) + - 117 * (pixel & 0xFF)) >> 10; - (*matirx)[offset + x] = (FX_BYTE) luminance; - } - } - return matirx; -} -FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported() -{ - return TRUE; -} -FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported() -{ - return TRUE; -} -CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height) -{ - return NULL; -} -CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(FX_INT32 &e) -{ - if (!IsRotateSupported()) { - e = BCExceptionRotateNotSupported; - return NULL; - } - FX_INT32 sourceWidth = m_width; - FX_INT32 sourceHeight = m_height; - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_C40Encoder.cpp b/xfa/src/fxbarcode/src/BC_C40Encoder.cpp deleted file mode 100644 index 685f1d80fd..0000000000 --- a/xfa/src/fxbarcode/src/BC_C40Encoder.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_Dimension.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_C40Encoder.h" -CBC_C40Encoder::CBC_C40Encoder() -{ -} -CBC_C40Encoder::~CBC_C40Encoder() -{ -} -FX_INT32 CBC_C40Encoder::getEncodingMode() -{ - return C40_ENCODATION; -} -void CBC_C40Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) -{ - CFX_WideString buffer; - while (context.hasMoreCharacters()) { - FX_WCHAR c = context.getCurrentChar(); - context.m_pos++; - FX_INT32 lastCharSize = encodeChar(c, buffer, e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; - FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; - context.updateSymbolInfo(curCodewordCount, e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; - if (!context.hasMoreCharacters()) { - CFX_WideString removed; - if ((buffer.GetLength() % 3) == 2) { - if (available < 2 || available > 2) { - lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); - if (e != BCExceptionNO) { - return; - } - } - } - while ((buffer.GetLength() % 3) == 1 - && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { - lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize, e); - if (e != BCExceptionNO) { - return; - } - } - break; - } - FX_INT32 count = buffer.GetLength(); - if ((count % 3) == 0) { - FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - } - handleEOD(context, buffer, e); -} -void CBC_C40Encoder::writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer) -{ - context.writeCodewords(encodeToCodewords(buffer, 0)); - buffer.Delete(0, 3); -} -void CBC_C40Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) -{ - FX_INT32 unwritten = (buffer.GetLength() / 3) * 2; - FX_INT32 rest = buffer.GetLength() % 3; - FX_INT32 curCodewordCount = context.getCodewordCount() + unwritten; - context.updateSymbolInfo(curCodewordCount, e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 available = context.m_symbolInfo->m_dataCapacity - curCodewordCount; - if (rest == 2) { - buffer += (FX_WCHAR)'\0'; - while (buffer.GetLength() >= 3) { - writeNextTriplet(context, buffer); - } - if (context.hasMoreCharacters()) { - context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); - } - } else if (available == 1 && rest == 1) { - while (buffer.GetLength() >= 3) { - writeNextTriplet(context, buffer); - } - if (context.hasMoreCharacters()) { - context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); - } - context.m_pos--; - } else if (rest == 0) { - while (buffer.GetLength() >= 3) { - writeNextTriplet(context, buffer); - } - if (available > 0 || context.hasMoreCharacters()) { - context.writeCodeword(CBC_HighLevelEncoder::C40_UNLATCH); - } - } else { - e = BCExceptionIllegalStateUnexpectedCase; - return; - } - context.signalEncoderChange(ASCII_ENCODATION); -} -FX_INT32 CBC_C40Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) -{ - if (c == ' ') { - sb += (FX_WCHAR)'\3'; - return 1; - } else if ((c >= '0') && (c <= '9')) { - sb += (FX_WCHAR)(c - 48 + 4); - return 1; - } else if ((c >= 'A') && (c <= 'Z')) { - sb += (FX_WCHAR)(c - 65 + 14); - return 1; - } else if ((c >= '\0') && (c <= 0x1f)) { - sb += (FX_WCHAR)'\0'; - sb += c; - return 2; - } else if ((c >= '!') && (c <= '/')) { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR)(c - 33); - return 2; - } else if ((c >= ':') && (c <= '@')) { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR)(c - 58 + 15); - return 2; - } else if ((c >= '[') && (c <= '_')) { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR)(c - 91 + 22); - return 2; - } else if ((c >= 60) && (c <= 0x7f)) { - sb += (FX_WCHAR)'\2'; - sb += (FX_WCHAR)(c - 96); - return 2; - } else if (c >= 80) { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR)0x001e; - FX_INT32 len = 2; - len += encodeChar((c - 128), sb, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - return len; - } else { - e = BCExceptionIllegalArgument; - return 0; - } -} -FX_INT32 CBC_C40Encoder::backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e) -{ - FX_INT32 count = buffer.GetLength(); - buffer.Delete(count - lastCharSize, count); - context.m_pos--; - FX_WCHAR c = context.getCurrentChar(); - lastCharSize = encodeChar(c, removed, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - context.resetSymbolInfo(); - return lastCharSize; -} -CFX_WideString CBC_C40Encoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos) -{ - FX_WCHAR c1 = sb.GetAt(startPos); - FX_WCHAR c2 = sb.GetAt(startPos + 1); - FX_WCHAR c3 = sb.GetAt(startPos + 2); - FX_INT32 v = (1600 * c1) + (40 * c2) + c3 + 1; - FX_WCHAR cw1 = (FX_WCHAR) (v / 256); - FX_WCHAR cw2 = (FX_WCHAR) (v % 256); - CFX_WideString b1(cw1); - CFX_WideString b2(cw2); - return b1 + b2; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp b/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp deleted file mode 100644 index 617c7c91d5..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonBitArray.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitArray.h" -CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array) -{ - m_size = array->GetSize(); - m_bits.Copy(array->GetBits()); -} -CBC_CommonBitArray::CBC_CommonBitArray() -{ - m_bits.SetSize(1); - m_size = 0; -} -CBC_CommonBitArray::CBC_CommonBitArray(FX_INT32 size) -{ - m_bits.SetSize((size + 31) >> 5); - m_size = size; -} -CBC_CommonBitArray::~CBC_CommonBitArray() -{ - m_size = 0; -} -FX_INT32 CBC_CommonBitArray::GetSize() -{ - return m_size; -} -CFX_Int32Array& CBC_CommonBitArray::GetBits() -{ - return m_bits; -} -FX_INT32 CBC_CommonBitArray::GetSizeInBytes() -{ - return (m_size + 7) >> 3; -} -FX_BOOL CBC_CommonBitArray::Get(FX_INT32 i) -{ - return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0; -} -void CBC_CommonBitArray::Set(FX_INT32 i) -{ - m_bits[i >> 5] |= 1 << (i & 0x1F); -} -void CBC_CommonBitArray::Flip(FX_INT32 i) -{ - m_bits[i >> 5] ^= 1 << (i & 0x1F); -} -void CBC_CommonBitArray::SetBulk(FX_INT32 i, FX_INT32 newBits) -{ - m_bits[i >> 5] = newBits; -} -void CBC_CommonBitArray::Clear() -{ - FXSYS_memset32(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(FX_INT32)); -} -FX_BOOL CBC_CommonBitArray::IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e) -{ - if (end < start) { - e = BCExceptionEndLessThanStart; - return FALSE; - } - if (end == start) { - return TRUE; - } - end--; - FX_INT32 firstInt = start >> 5; - FX_INT32 lastInt = end >> 5; - FX_INT32 i; - for (i = firstInt; i <= lastInt; i++) { - FX_INT32 firstBit = i > firstInt ? 0 : start & 0x1F; - FX_INT32 lastBit = i < lastInt ? 31 : end & 0x1F; - FX_INT32 mask; - if (firstBit == 0 && lastBit == 31) { - mask = -1; - } else { - mask = 0; - for (FX_INT32 j = firstBit; j <= lastBit; j++) { - mask |= 1 << j; - } - } - if ((m_bits[i] & mask) != (value ? mask : 0)) { - return FALSE; - } - } - return TRUE; -} -FX_INT32* CBC_CommonBitArray::GetBitArray() -{ - return &m_bits[0]; -} -void CBC_CommonBitArray::Reverse() -{ - FX_INT32* newBits = FX_Alloc(FX_INT32, m_bits.GetSize()); - FXSYS_memset32(newBits, 0x00, m_bits.GetSize() * sizeof(FX_INT32)); - FX_INT32 size = m_size; - FX_INT32 i; - for (i = 0; i < size; i++) { - if (Get(size - i - 1)) { - newBits[i >> 5] |= 1 << (i & 0x1F); - } - } - FXSYS_memcpy32(&m_bits[0], newBits, m_bits.GetSize() * sizeof(FX_INT32)); - FX_Free(newBits); -} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp b/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp deleted file mode 100644 index 222de565c0..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonBitMatrix.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_CommonBitMatrix.h" -CBC_CommonBitMatrix::CBC_CommonBitMatrix() -{ - m_width = 0; - m_height = 0; - m_rowSize = 0; - m_bits = NULL; -} -void CBC_CommonBitMatrix::Init(FX_INT32 dimension) -{ - m_width = dimension; - m_height = dimension; - FX_INT32 rowSize = (m_height + 31) >> 5; - m_rowSize = rowSize; - m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); - FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); -} -void CBC_CommonBitMatrix::Init(FX_INT32 width, FX_INT32 height) -{ - m_width = width; - m_height = height; - FX_INT32 rowSize = (width + 31) >> 5; - m_rowSize = rowSize; - m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height); - FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); -} -CBC_CommonBitMatrix::~CBC_CommonBitMatrix() -{ - if (m_bits != NULL) { - FX_Free(m_bits); - } - m_bits = NULL; - m_height = m_width = m_rowSize = 0; -} -FX_BOOL CBC_CommonBitMatrix::Get(FX_INT32 x, FX_INT32 y) -{ - FX_INT32 offset = y * m_rowSize + (x >> 5); - if (offset >= m_rowSize * m_height || offset < 0) { - return false; - } - return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0; -} -FX_INT32* CBC_CommonBitMatrix::GetBits() -{ - return m_bits; -} -void CBC_CommonBitMatrix::Set(FX_INT32 x, FX_INT32 y) -{ - FX_INT32 offset = y * m_rowSize + (x >> 5); - if (offset >= m_rowSize * m_height || offset < 0) { - return; - } - m_bits[offset] |= 1 << (x & 0x1f); -} -void CBC_CommonBitMatrix::Flip(FX_INT32 x, FX_INT32 y) -{ - FX_INT32 offset = y * m_rowSize + (x >> 5); - m_bits[offset] ^= 1 << (x & 0x1f); -} -void CBC_CommonBitMatrix::Clear() -{ - FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32)); -} -void CBC_CommonBitMatrix::SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e) -{ - if (top < 0 || left < 0) { - e = BCExceptionLeftAndTopMustBeNonnegative; - return; - } - if (height < 1 || width < 1) { - e = BCExceptionHeightAndWidthMustBeAtLeast1; - return; - } - FX_INT32 right = left + width; - FX_INT32 bottom = top + height; - if (m_height < bottom || m_width < right) { - e = BCExceptionRegionMustFitInsideMatrix; - return; - } - FX_INT32 y; - for (y = top; y < bottom; y++) { - FX_INT32 offset = y * m_rowSize; - FX_INT32 x; - for (x = left; x < right; x++) { - m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f); - } - } -} -CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(FX_INT32 y, CBC_CommonBitArray* row) -{ - CBC_CommonBitArray* rowArray = NULL; - if (row == NULL || row->GetSize() < m_width) { - rowArray = FX_NEW CBC_CommonBitArray(m_width); - } else { - rowArray = FX_NEW CBC_CommonBitArray(row); - } - FX_INT32 offset = y * m_rowSize; - FX_INT32 x; - for (x = 0; x < m_rowSize; x++) { - rowArray->SetBulk(x << 5, m_bits[offset + x]); - } - return rowArray; -} -void CBC_CommonBitMatrix::SetRow(FX_INT32 y, CBC_CommonBitArray* row) -{ - FX_INT32 l = y * m_rowSize; - for (FX_INT32 i = 0; i < m_rowSize; i++) { - m_bits[l] = row->GetBitArray()[i]; - l++; - } -} -void CBC_CommonBitMatrix::SetCol(FX_INT32 y, CBC_CommonBitArray* col) -{ - for (FX_INT32 i = 0; i < col->GetBits().GetSize(); i++) { - m_bits[i * m_rowSize + y] = col->GetBitArray()[i]; - } -} -FX_INT32 CBC_CommonBitMatrix::GetWidth() -{ - return m_width; -} -FX_INT32 CBC_CommonBitMatrix::GetHeight() -{ - return m_height; -} -FX_INT32 CBC_CommonBitMatrix::GetRowSize() -{ - return m_rowSize; -} -FX_INT32 CBC_CommonBitMatrix::GetDimension(FX_INT32 &e) -{ - if (m_width != m_height) { - e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; - return 0; - } - return m_width; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp b/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp deleted file mode 100644 index 43df2958fd..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonBitSource.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitSource.h" -CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) -{ - m_bytes.Copy((*bytes)); - m_bitOffset = 0; - m_byteOffset = 0; -} -CBC_CommonBitSource::~CBC_CommonBitSource() -{ -} -FX_INT32 CBC_CommonBitSource::ReadBits(FX_INT32 numBits, FX_INT32 &e) -{ - if (numBits < 1 || numBits > 32) { - e = BCExceptionIllegalArgument; - return 0; - } - FX_INT32 result = 0; - if (m_bitOffset > 0) { - FX_INT32 bitsLeft = 8 - m_bitOffset; - FX_INT32 toRead = numBits < bitsLeft ? numBits : bitsLeft; - FX_INT32 bitsToNotRead = bitsLeft - toRead; - FX_INT32 mask = (0xff >> (8 - toRead)) << bitsToNotRead; - result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead; - numBits -= toRead; - m_bitOffset += toRead; - if (m_bitOffset == 8) { - m_bitOffset = 0; - m_byteOffset++; - } - } - if (numBits > 0) { - while(numBits >= 8) { - result = (result << 8) | (m_bytes[m_byteOffset] & 0xff); - m_byteOffset++; - numBits -= 8; - } - if (numBits > 0) { - FX_INT32 bitsToNotRead = 8 - numBits; - FX_INT32 mask = (0xff >> bitsToNotRead) << bitsToNotRead; - result = (result << numBits) | ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead); - m_bitOffset += numBits; - } - } - return result; -} -FX_INT32 CBC_CommonBitSource::Available() -{ - return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset; -} -FX_INT32 CBC_CommonBitSource::getByteOffset() -{ - return m_byteOffset; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp b/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp deleted file mode 100644 index 9d5c52a454..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonByteArray.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonByteArray.h" -CBC_CommonByteArray::CBC_CommonByteArray() -{ - m_bytes = NULL; - m_size = 0; - m_index = 0; -} -CBC_CommonByteArray::CBC_CommonByteArray(FX_INT32 size) -{ - m_size = size; - m_bytes = FX_Alloc(FX_BYTE, size); - FXSYS_memset32(m_bytes, 0, size); - m_index = 0; -} -CBC_CommonByteArray::CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size) -{ - m_size = size; - m_bytes = FX_Alloc(FX_BYTE, size); - FXSYS_memcpy32(m_bytes, byteArray, size); - m_index = size; -} -CBC_CommonByteArray::~CBC_CommonByteArray() -{ - if ( m_bytes != NULL) { - FX_Free( m_bytes ); - m_bytes = NULL; - } - m_index = 0; - m_size = 0; -} -FX_INT32 CBC_CommonByteArray::At(FX_INT32 index) -{ - return m_bytes[index] & 0xff; -} -void CBC_CommonByteArray::Set(FX_INT32 index, FX_INT32 value) -{ - m_bytes[index] = (FX_BYTE) value; -} -FX_INT32 CBC_CommonByteArray::Size() -{ - return m_size; -} -FX_BOOL CBC_CommonByteArray::IsEmpty() -{ - return m_size == 0; -} -void CBC_CommonByteArray::AppendByte(FX_INT32 value) -{ - if (m_size == 0 || m_index >= m_size) { - FX_INT32 newSize = FX_MAX(32, m_size << 1); - Reserve(newSize); - } - m_bytes[m_index] = (FX_BYTE)value; - m_index++; -} -void CBC_CommonByteArray::Reserve(FX_INT32 capacity) -{ - if (m_bytes == NULL || m_size < capacity) { - FX_BYTE *newArray = FX_Alloc(FX_BYTE, capacity); - FXSYS_memset32(newArray, 0, capacity); - if (m_bytes != NULL) { - FXSYS_memcpy32(newArray, m_bytes, m_size); - FX_Free( m_bytes ); - } - m_bytes = newArray; - m_size = capacity; - } -} -void CBC_CommonByteArray::Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count) -{ - if (m_bytes != NULL) { - FX_Free( m_bytes ); - } - m_bytes = FX_Alloc(FX_BYTE, count); - m_size = count; - FXSYS_memcpy32(m_bytes, source + offset, count); - m_index = count; -} -void CBC_CommonByteArray::Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count) -{ - if (m_bytes != NULL) { - FX_Free( m_bytes ); - } - m_bytes = FX_Alloc(FX_BYTE, count); - m_size = count; - FX_INT32 i; - for(i = 0; i < count; i++) { - m_bytes[i] = source->operator [](i + offset); - } - m_index = m_size; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp b/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp deleted file mode 100644 index de10f9e401..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonByteMatrix.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonByteMatrix.h" -CBC_CommonByteMatrix::CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height) -{ - m_height = height; - m_width = width; - m_bytes = NULL; -} -void CBC_CommonByteMatrix::Init() -{ - m_bytes = FX_Alloc(FX_BYTE, m_height * m_width); - FXSYS_memset8(m_bytes, 0xff, m_height * m_width); -} -CBC_CommonByteMatrix::~CBC_CommonByteMatrix() -{ - if(m_bytes != NULL) { - FX_Free(m_bytes); - m_bytes = NULL; - } -} -FX_INT32 CBC_CommonByteMatrix::GetHeight() -{ - return m_height; -} -FX_INT32 CBC_CommonByteMatrix::GetWidth() -{ - return m_width; -} -FX_BYTE CBC_CommonByteMatrix::Get(FX_INT32 x, FX_INT32 y) -{ - return m_bytes[y * m_width + x]; -} -void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_INT32 value) -{ - m_bytes[y * m_width + x] = (FX_BYTE)value; -} -void CBC_CommonByteMatrix::Set(FX_INT32 x, FX_INT32 y, FX_BYTE value) -{ - m_bytes[y * m_width + x] = value; -} -void CBC_CommonByteMatrix::clear(FX_BYTE value) -{ - FX_INT32 y; - for(y = 0; y < m_height; y++) { - FX_INT32 x; - for(x = 0; x < m_width; x++) { - m_bytes[y * m_width + x] = value; - } - } -} -FX_BYTE* CBC_CommonByteMatrix::GetArray() -{ - return m_bytes; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp b/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp deleted file mode 100644 index 07a2a77683..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonCharacterSetECI.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonECI.h" -#include "include/BC_CommonCharacterSetECI.h" -void CBC_CommonCharacterSetECI::initialize() -{ -} -CBC_CommonCharacterSetECI::CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName): - CBC_CommonECI(value), m_encodingName(encodingName) -{ -} -CBC_CommonCharacterSetECI::~CBC_CommonCharacterSetECI() -{ -} -CFX_ByteString CBC_CommonCharacterSetECI::GetEncodingName() -{ - return m_encodingName; -} -void CBC_CommonCharacterSetECI::AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName) -{ -} -CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(FX_INT32 value) -{ - return NULL; -} -CBC_CommonCharacterSetECI* CBC_CommonCharacterSetECI::GetCharacterSetECIByName(const CFX_ByteString& name) -{ - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp b/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp deleted file mode 100644 index 28d99b1382..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonDecoderResult.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_PDF417ResultMetadata.h" -#include "include/BC_CommonDecoderResult.h" -CBC_CommonDecoderResult::CBC_CommonDecoderResult() -{ -} -void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) -{ - if(text.IsEmpty()) { - e = BCExceptionIllegalArgument; - return; - } - m_rawBytes.Copy(rawBytes); - m_text = text; - m_byteSegments.Copy(byteSegments); - m_ecLevel = ecLevel; - m_other = NULL; -} -void CBC_CommonDecoderResult::Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e) -{ - if(text.IsEmpty()) { - e = BCExceptionIllegalArgument; - return; - } - m_rawBytes.Copy(rawBytes); - m_text = text; - m_pdf417byteSegments.Copy(byteSegments); - m_pdf417ecLevel = ecLevel; - m_other = NULL; -} -void CBC_CommonDecoderResult::setOther(CBC_PDF417ResultMetadata* other) -{ - m_other = other; -} -CBC_CommonDecoderResult::~CBC_CommonDecoderResult() -{ - if (m_other != NULL) { - delete m_other; - } -} -const CFX_ByteArray& CBC_CommonDecoderResult::GetRawBytes() -{ - return m_rawBytes; -} -const CFX_Int32Array& CBC_CommonDecoderResult::GetByteSegments() -{ - return m_byteSegments; -} -const CFX_ByteString& CBC_CommonDecoderResult::GetText() -{ - return m_text; -} -CBC_QRCoderErrorCorrectionLevel* CBC_CommonDecoderResult::GetECLevel() -{ - return m_ecLevel; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonECI.cpp b/xfa/src/fxbarcode/src/BC_CommonECI.cpp deleted file mode 100644 index e6ade95024..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonECI.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonECI.h" -#include "include/BC_CommonCharacterSetECI.h" -CBC_CommonECI::CBC_CommonECI(FX_INT32 value) -{ - m_value = value; -} -CBC_CommonECI::~CBC_CommonECI() -{ -} -FX_INT32 CBC_CommonECI::GetValue() -{ - return m_value; -} -CBC_CommonECI* CBC_CommonECI::GetEICByValue(FX_INT32 value, FX_INT32 &e) -{ - if(value < 0 || value > 999999) { - e = BCExceptionBadECI; - return NULL; - } - if(value < 900) { - } - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp b/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp deleted file mode 100644 index 76aead4c1c..0000000000 --- a/xfa/src/fxbarcode/src/BC_CommonPerspectiveTransform.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonPerspectiveTransform.h" -CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, - FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, - FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33) : - m_a11(a11), m_a21(a21), m_a31(a31), - m_a12(a12), m_a22(a22), m_a32(a32), - m_a13(a13), m_a23(a23), m_a33(a33) -{ -} -CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() -{ -} -CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3, - FX_FLOAT x0p, FX_FLOAT y0p, - FX_FLOAT x1p, FX_FLOAT y1p, - FX_FLOAT x2p, FX_FLOAT y2p, - FX_FLOAT x3p, FX_FLOAT y3p) -{ - CBC_AutoPtr qToS(QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3)); - CBC_AutoPtr sToQ(SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p)); - return sToQ->Times(*(qToS.get())); -} -void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray *points) -{ - FX_INT32 max = points->GetSize(); - FX_FLOAT a11 = m_a11; - FX_FLOAT a12 = m_a12; - FX_FLOAT a13 = m_a13; - FX_FLOAT a21 = m_a21; - FX_FLOAT a22 = m_a22; - FX_FLOAT a23 = m_a23; - FX_FLOAT a31 = m_a31; - FX_FLOAT a32 = m_a32; - FX_FLOAT a33 = m_a33; - FX_INT32 i; - for (i = 0; i < max; i += 2) { - FX_FLOAT x = (*points)[i]; - FX_FLOAT y = (*points)[i + 1]; - FX_FLOAT denominator = a13 * x + a23 * y + a33; - (*points)[i] = (a11 * x + a21 * y + a31) / denominator; - (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } -} -CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3) -{ - FX_FLOAT dy2 = y3 - y2; - FX_FLOAT dy3 = y0 - y1 + y2 - y3; - if ((dy2 == 0.0f) && (dy3 == 0.0f)) { - return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, - y1 - y0, y2 - y1, y0, - 0.0f, 0.0f, 1.0f); - } else { - FX_FLOAT dx1 = x1 - x2; - FX_FLOAT dx2 = x3 - x2; - FX_FLOAT dx3 = x0 - x1 + x2 - x3; - FX_FLOAT dy1 = y1 - y2; - FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1; - FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, - y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, - a13, a23, 1.0f); - } -} -CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3) -{ - CBC_AutoPtr temp1(SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3)); - return temp1->BuildAdjoint(); -} -CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::BuildAdjoint() -{ - return FX_NEW CBC_CommonPerspectiveTransform(m_a22 * m_a33 - m_a23 * m_a32, - m_a23 * m_a31 - m_a21 * m_a33, - m_a21 * m_a32 - m_a22 * m_a31, - m_a13 * m_a32 - m_a12 * m_a33, - m_a11 * m_a33 - m_a13 * m_a31, - m_a12 * m_a31 - m_a11 * m_a32, - m_a12 * m_a23 - m_a13 * m_a22, - m_a13 * m_a21 - m_a11 * m_a23, - m_a11 * m_a22 - m_a12 * m_a21); -} -CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::Times(CBC_CommonPerspectiveTransform &other) -{ - return FX_NEW CBC_CommonPerspectiveTransform(m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13, - m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23, - m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33, - m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13, - m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23, - m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33, - m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13, - m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23, - m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33); -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp deleted file mode 100644 index aff6329f19..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixBitMatrixParser.cpp +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_DataMatrixVersion.h" -#include "include/BC_DataMatrixBitMatrixParser.h" -CBC_DataMatrixBitMatrixParser::CBC_DataMatrixBitMatrixParser() -{ - m_mappingBitMatrix = NULL; - m_version = NULL; - m_readMappingMatrix = NULL; -} -void CBC_DataMatrixBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) -{ - FX_INT32 dimension = bitMatrix->GetHeight(); - if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) { - e = BCExceptionFormatException; - return; - } - m_version = ReadVersion(bitMatrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - m_mappingBitMatrix = ExtractDataRegion(bitMatrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - m_readMappingMatrix = FX_NEW CBC_CommonBitMatrix(); - m_readMappingMatrix->Init(m_mappingBitMatrix->GetWidth(), m_mappingBitMatrix->GetHeight()); -} -CBC_DataMatrixBitMatrixParser::~CBC_DataMatrixBitMatrixParser() -{ - if(m_mappingBitMatrix != NULL) { - delete m_mappingBitMatrix; - } - m_mappingBitMatrix = NULL; - if(m_readMappingMatrix != NULL) { - delete m_readMappingMatrix; - } - m_readMappingMatrix = NULL; -} -CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::GetVersion() -{ - return m_version; -} -CBC_DataMatrixVersion *CBC_DataMatrixBitMatrixParser::ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) -{ - FX_INT32 rows = bitMatrix->GetHeight(); - FX_INT32 columns = bitMatrix->GetWidth(); - CBC_DataMatrixVersion *temp = CBC_DataMatrixVersion::GetVersionForDimensions(rows, columns, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CFX_ByteArray *CBC_DataMatrixBitMatrixParser::ReadCodewords(FX_INT32 &e) -{ - CBC_AutoPtr result(FX_NEW CFX_ByteArray()); - result->SetSize(m_version->GetTotalCodewords()); - FX_INT32 resultOffset = 0; - FX_INT32 row = 4; - FX_INT32 column = 0; - FX_INT32 numRows = m_mappingBitMatrix->GetHeight(); - FX_INT32 numColumns = m_mappingBitMatrix->GetWidth(); - FX_BOOL corner1Read = FALSE; - FX_BOOL corner2Read = FALSE; - FX_BOOL corner3Read = FALSE; - FX_BOOL corner4Read = FALSE; - do { - if ((row == numRows) && (column == 0) && !corner1Read) { - (*result)[resultOffset++] = (FX_BYTE) ReadCorner1(numRows, numColumns); - row -= 2; - column += 2; - corner1Read = TRUE; - } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { - (*result)[resultOffset++] = (FX_BYTE) ReadCorner2(numRows, numColumns); - row -= 2; - column += 2; - corner2Read = TRUE; - } else if ((row == numRows + 4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { - (*result)[resultOffset++] = (FX_BYTE) ReadCorner3(numRows, numColumns); - row -= 2; - column += 2; - corner3Read = TRUE; - } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { - (*result)[resultOffset++] = (FX_BYTE) ReadCorner4(numRows, numColumns); - row -= 2; - column += 2; - corner4Read = TRUE; - } else { - do { - if ((row < numRows) && (column >= 0) && !m_readMappingMatrix->Get(column, row)) { - if (resultOffset < (*result).GetSize() ) { - (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); - } - } - row -= 2; - column += 2; - } while ((row >= 0) && (column < numColumns)); - row += 1; - column += 3; - do { - if ((row >= 0) && (column < numColumns) && !m_readMappingMatrix->Get(column, row)) { - if (resultOffset < (*result).GetSize() ) { - (*result)[resultOffset++] = (FX_BYTE) ReadUtah(row, column, numRows, numColumns); - } - } - row += 2; - column -= 2; - } while ((row < numRows) && (column >= 0)); - row += 3; - column += 1; - } - } while ((row < numRows) || (column < numColumns)); - if (resultOffset != m_version->GetTotalCodewords()) { - e = BCExceptionFormatException; - return NULL; - } - return result.release(); -} -FX_BOOL CBC_DataMatrixBitMatrixParser::ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) -{ - if (row < 0) { - row += numRows; - column += 4 - ((numRows + 4) & 0x07); - } - if (column < 0) { - column += numColumns; - row += 4 - ((numColumns + 4) & 0x07); - } - m_readMappingMatrix->Set(column, row); - return m_mappingBitMatrix->Get(column, row); -} -FX_INT32 CBC_DataMatrixBitMatrixParser::ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns) -{ - FX_INT32 currentByte = 0; - if (ReadModule(row - 2, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row - 2, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row - 1, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row - 1, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row - 1, column, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(row, column, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; -} -FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns) -{ - FX_INT32 currentByte = 0; - if (ReadModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 1, 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 1, 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; -} -FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns) -{ - FX_INT32 currentByte = 0; - if (ReadModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 4, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; -} -FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns) -{ - FX_INT32 currentByte = 0; - if (ReadModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; -} -FX_INT32 CBC_DataMatrixBitMatrixParser::ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns) -{ - FX_INT32 currentByte = 0; - if (ReadModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (ReadModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; -} -CBC_CommonBitMatrix *CBC_DataMatrixBitMatrixParser::ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix , FX_INT32 &e) -{ - FX_INT32 symbolSizeRows = m_version->GetSymbolSizeRows(); - FX_INT32 symbolSizeColumns = m_version->GetSymbolSizeColumns(); - if (bitMatrix->GetHeight() != symbolSizeRows) { - e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix; - return NULL; - } - FX_INT32 dataRegionSizeRows = m_version->GetDataRegionSizeRows(); - FX_INT32 dataRegionSizeColumns = m_version->GetDataRegionSizeColumns(); - FX_INT32 numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; - FX_INT32 numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; - FX_INT32 sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; - FX_INT32 sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; - CBC_CommonBitMatrix *bitMatrixWithoutAlignment = FX_NEW CBC_CommonBitMatrix(); - bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow); - FX_INT32 dataRegionRow; - for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { - FX_INT32 dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; - FX_INT32 dataRegionColumn; - for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { - FX_INT32 dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; - FX_INT32 i; - for (i = 0; i < dataRegionSizeRows; ++i) { - FX_INT32 readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; - FX_INT32 writeRowOffset = dataRegionRowOffset + i; - FX_INT32 j; - for (j = 0; j < dataRegionSizeColumns; ++j) { - FX_INT32 readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; - if (bitMatrix->Get(readColumnOffset, readRowOffset)) { - FX_INT32 writeColumnOffset = dataRegionColumnOffset + j; - bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset); - } - } - } - } - } - return bitMatrixWithoutAlignment; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp deleted file mode 100644 index a30489f4dd..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixDataBlock.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixVersion.h" -#include "include/BC_DataMatrixDataBlock.h" -CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock() -{ -} -CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) -{ - m_codewords.Copy(*codewords); - m_numDataCodewords = numDataCodewords; -} -CFX_PtrArray *CBC_DataMatrixDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e) -{ - ECBlocks *ecBlocks = version->GetECBlocks(); - FX_INT32 totalBlocks = 0; - const CFX_PtrArray &ecBlockArray = ecBlocks->GetECBlocks(); - FX_INT32 i; - for (i = 0; i < ecBlockArray.GetSize(); i++) { - totalBlocks += ((ECB*)ecBlockArray[i])->GetCount(); - } - CBC_AutoPtrresult(FX_NEW CFX_PtrArray()); - result->SetSize(totalBlocks); - FX_INT32 numResultBlocks = 0; - FX_INT32 j; - for (j = 0; j < ecBlockArray.GetSize(); j++) { - for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) { - FX_INT32 numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords(); - FX_INT32 numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords; - CFX_ByteArray codewords; - codewords.SetSize(numBlockCodewords); - (*result)[numResultBlocks++] = FX_NEW CBC_DataMatrixDataBlock(numDataCodewords, &codewords); - codewords.SetSize(0); - } - } - FX_INT32 longerBlocksTotalCodewords = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); - FX_INT32 longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks->GetECCodewords(); - FX_INT32 shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; - FX_INT32 rawCodewordsOffset = 0; - for (i = 0; i < shorterBlocksNumDataCodewords; i++) { - FX_INT32 j; - for (j = 0; j < numResultBlocks; j++) { - if (rawCodewordsOffset < rawCodewords->GetSize()) { - ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](i) = (*rawCodewords)[rawCodewordsOffset++]; - } - } - } - FX_BOOL specialVersion = version->GetVersionNumber() == 24; - FX_INT32 numLongerBlocks = specialVersion ? 8 : numResultBlocks; - for (j = 0; j < numLongerBlocks; j++) { - if (rawCodewordsOffset < rawCodewords->GetSize()) { - ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](longerBlocksNumDataCodewords - 1) = (*rawCodewords)[rawCodewordsOffset++]; - } - } - FX_INT32 max = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize(); - for (i = longerBlocksNumDataCodewords; i < max; i++) { - FX_INT32 j; - for (j = 0; j < numResultBlocks; j++) { - FX_INT32 iOffset = specialVersion && j > 7 ? i - 1 : i; - if (rawCodewordsOffset < rawCodewords->GetSize()) { - ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](iOffset) = (*rawCodewords)[rawCodewordsOffset++]; - } - } - } - if (rawCodewordsOffset != rawCodewords->GetSize()) { - e = BCExceptionIllegalArgument; - return NULL; - } - return result.release(); -} -FX_INT32 CBC_DataMatrixDataBlock::GetNumDataCodewords() -{ - return m_numDataCodewords; -} -CFX_ByteArray *CBC_DataMatrixDataBlock::GetCodewords() -{ - return &m_codewords; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp deleted file mode 100644 index 89a72bd72e..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixDecodedBitStreamParser.cpp +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixDecodedBitStreamParser.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_CommonBitSource.h" -const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_BASIC_SET_CHARS[] = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' -}; -const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = { - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', - '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' -}; -const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' -}; -const FX_CHAR CBC_DataMatrixDecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = { - '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (FX_CHAR) 127 -}; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::PAD_ENCODE = 0; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ASCII_ENCODE = 1; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::C40_ENCODE = 2; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::TEXT_ENCODE = 3; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::ANSIX12_ENCODE = 4; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::EDIFACT_ENCODE = 5; -const FX_INT32 CBC_DataMatrixDecodedBitStreamParser::BASE256_ENCODE = 6; -CBC_DataMatrixDecodedBitStreamParser::CBC_DataMatrixDecodedBitStreamParser() -{ -} -CBC_DataMatrixDecodedBitStreamParser::~CBC_DataMatrixDecodedBitStreamParser() -{ -} -CBC_CommonDecoderResult *CBC_DataMatrixDecodedBitStreamParser::Decode(CFX_ByteArray &bytes, FX_INT32 &e) -{ - CBC_CommonBitSource bits(&bytes); - CFX_ByteString result; - CFX_ByteString resultTrailer; - CFX_Int32Array byteSegments; - FX_INT32 mode = ASCII_ENCODE; - do { - if (mode == 1) { - mode = DecodeAsciiSegment(&bits, result, resultTrailer, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else { - switch (mode) { - case 2: - DecodeC40Segment(&bits, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - case 3: - DecodeTextSegment(&bits, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - case 4: - DecodeAnsiX12Segment(&bits, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - case 5: - DecodeEdifactSegment(&bits, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - case 6: - DecodeBase256Segment(&bits, result, byteSegments, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - default: - NULL; - e = BCExceptionFormatException; - return NULL; - } - mode = ASCII_ENCODE; - } - } while (mode != PAD_ENCODE && bits.Available() > 0); - if (resultTrailer.GetLength() > 0) { - result += resultTrailer; - } - CBC_CommonDecoderResult *tempCp = FX_NEW CBC_CommonDecoderResult(); - tempCp->Init(bytes, result, (byteSegments.GetSize() <= 0) ? CFX_Int32Array() : byteSegments, NULL, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return tempCp; -} -FX_INT32 CBC_DataMatrixDecodedBitStreamParser::DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e) -{ - FX_CHAR buffer[128]; - FX_BOOL upperShift = FALSE; - do { - FX_INT32 oneByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - if (oneByte == 0) { - e = BCExceptionFormatException; - return 0; - } else if (oneByte <= 128) { - oneByte = upperShift ? oneByte + 128 : oneByte; - upperShift = FALSE; - result += ((FX_CHAR) (oneByte - 1)); - return ASCII_ENCODE; - } else if (oneByte == 129) { - return PAD_ENCODE; - } else if (oneByte <= 229) { - FX_INT32 value = oneByte - 130; -#if defined(_FX_WINAPI_PARTITION_APP_) - memset(buffer, 0, sizeof(FX_CHAR) * 128); - _itoa_s(value, buffer, 128, 10); -#else - FXSYS_itoa(value, buffer, 10); -#endif - if (value < 10) { - result += '0'; - buffer[1] = '\0'; - } else { - buffer[2] = '\0'; - } - result += buffer; - } else if (oneByte == 230) { - return C40_ENCODE; - } else if (oneByte == 231) { - return BASE256_ENCODE; - } else if (oneByte == 232 || oneByte == 233 || oneByte == 234) { - } else if (oneByte == 235) { - upperShift = TRUE; - } else if (oneByte == 236) { - result += "[)>"; - result += 0x1E; - result += "05"; - result += 0x1D; - resultTrailer.Insert(0, 0x1E); - resultTrailer.Insert(0 + 1, 0x04); - } else if (oneByte == 237) { - result += "[)>"; - result += 0x1E; - result += "06"; - result += 0x1D; - resultTrailer.Insert(0, 0x1E); - resultTrailer.Insert(0 + 1, 0x04); - } else if (oneByte == 238) { - return ANSIX12_ENCODE; - } else if (oneByte == 239) { - return TEXT_ENCODE; - } else if (oneByte == 240) { - return EDIFACT_ENCODE; - } else if (oneByte == 241) { - } else if (oneByte >= 242) { - if (oneByte == 254 && bits->Available() == 0) { - } else { - e = BCExceptionFormatException; - return 0; - } - } - } while (bits->Available() > 0); - return ASCII_ENCODE; -} -void CBC_DataMatrixDecodedBitStreamParser::DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) -{ - FX_BOOL upperShift = FALSE; - CFX_Int32Array cValues; - cValues.SetSize(3); - do { - if (bits->Available() == 8) { - return; - } - FX_INT32 firstByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if (firstByte == 254) { - return; - } - FX_INT32 tempp = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - ParseTwoBytes(firstByte, tempp, cValues); - FX_INT32 shift = 0; - FX_INT32 i; - for (i = 0; i < 3; i++) { - FX_INT32 cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else if (cValue < 27) { - FX_CHAR c40char = C40_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result += (FX_CHAR) (c40char + 128); - upperShift = FALSE; - } else { - result += c40char; - } - } else { - e = BCExceptionFormatException; - return ; - } - break; - case 1: - if (upperShift) { - result += (FX_CHAR) (cValue + 128); - upperShift = FALSE; - } else { - result += cValue; - } - shift = 0; - break; - case 2: - if (cValue < 27) { - FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result += (FX_CHAR) (c40char + 128); - upperShift = FALSE; - } else { - result += c40char; - } - } else if (cValue == 27) { - e = BCExceptionFormatException; - return; - } else if (cValue == 30) { - upperShift = TRUE; - } else { - e = BCExceptionFormatException; - return; - } - shift = 0; - break; - case 3: - if (upperShift) { - result += (FX_CHAR) (cValue + 224); - upperShift = FALSE; - } else { - result += (FX_CHAR) (cValue + 96); - } - shift = 0; - break; - default: - break; - e = BCExceptionFormatException; - return; - } - } - } while (bits->Available() > 0); -} -void CBC_DataMatrixDecodedBitStreamParser::DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) -{ - FX_BOOL upperShift = FALSE; - CFX_Int32Array cValues; - cValues.SetSize(3); - FX_INT32 shift = 0; - do { - if (bits->Available() == 8) { - return; - } - FX_INT32 firstByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if (firstByte == 254) { - return; - } - FX_INT32 inTp = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - ParseTwoBytes(firstByte, inTp, cValues); - for (FX_INT32 i = 0; i < 3; i++) { - FX_INT32 cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else if (cValue < 40) { - FX_CHAR textChar = TEXT_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result += (FX_CHAR) (textChar + 128); - upperShift = FALSE; - } else { - result += textChar; - } - } else { - e = BCExceptionFormatException; - return; - } - break; - case 1: - if (upperShift) { - result += (FX_CHAR) (cValue + 128); - upperShift = FALSE; - } else { - result += cValue; - } - shift = 0; - break; - case 2: - if (cValue < 27) { - FX_CHAR c40char = C40_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result += (FX_CHAR) (c40char + 128); - upperShift = FALSE; - } else { - result += c40char; - } - } else if (cValue == 27) { - e = BCExceptionFormatException; - return; - } else if (cValue == 30) { - upperShift = TRUE; - } else { - e = BCExceptionFormatException; - return; - } - shift = 0; - break; - case 3: - if (cValue < 19) { - FX_CHAR textChar = TEXT_SHIFT3_SET_CHARS[cValue]; - if (upperShift) { - result += (FX_CHAR) (textChar + 128); - upperShift = FALSE; - } else { - result += textChar; - } - shift = 0; - } else { - e = BCExceptionFormatException; - return; - } - break; - default: - break; - e = BCExceptionFormatException; - return; - } - } - } while (bits->Available() > 0); -} -void CBC_DataMatrixDecodedBitStreamParser::DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) -{ - CFX_Int32Array cValues; - cValues.SetSize(3); - do { - if (bits->Available() == 8) { - return; - } - FX_INT32 firstByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if (firstByte == 254) { - return; - } - FX_INT32 iTemp1 = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - ParseTwoBytes(firstByte, iTemp1, cValues); - FX_INT32 i; - for (i = 0; i < 3; i++) { - FX_INT32 cValue = cValues[i]; - if (cValue == 0) { - BC_FX_ByteString_Append(result, 1, '\r'); - } else if (cValue == 1) { - BC_FX_ByteString_Append(result, 1, '*'); - } else if (cValue == 2) { - BC_FX_ByteString_Append(result, 1, '>'); - } else if (cValue == 3) { - BC_FX_ByteString_Append(result, 1, ' '); - } else if (cValue < 14) { - BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 44)); - } else if (cValue < 40) { - BC_FX_ByteString_Append(result, 1, (FX_CHAR) (cValue + 51)); - } else { - e = BCExceptionFormatException; - return; - } - } - } while (bits->Available() > 0); -} -void CBC_DataMatrixDecodedBitStreamParser::ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result) -{ - FX_INT32 fullBitValue = (firstByte << 8) + secondByte - 1; - FX_INT32 temp = fullBitValue / 1600; - result[0] = temp; - fullBitValue -= temp * 1600; - temp = fullBitValue / 40; - result[1] = temp; - result[2] = fullBitValue - temp * 40; -} -void CBC_DataMatrixDecodedBitStreamParser::DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e) -{ - FX_CHAR buffer[128]; - FX_BOOL unlatch = FALSE; - do { - if (bits->Available() <= 16) { - return; - } - FX_INT32 i; - for (i = 0; i < 4; i++) { - FX_INT32 edifactValue = bits->ReadBits(6, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if (edifactValue == 0x1F) { - unlatch = TRUE; - } - if (!unlatch) { - if ((edifactValue & 32) == 0) { - edifactValue |= 64; - } -#if defined(_FX_WINAPI_PARTITION_APP_) - memset(buffer, 0, sizeof(FX_CHAR) * 128); - _itoa_s(edifactValue, buffer, 128, 10); - result += buffer; -#else - result += FXSYS_itoa(edifactValue, buffer, 10); -#endif - } - } - } while (!unlatch && bits->Available() > 0); -} -void CBC_DataMatrixDecodedBitStreamParser::DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e) -{ - FX_INT32 codewordPosition = 1 + bits->getByteOffset(); - FX_INT32 iTmp = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 d1 = Unrandomize255State(iTmp, codewordPosition++); - FX_INT32 count; - if (d1 == 0) { - count = bits->Available() / 8; - } else if (d1 < 250) { - count = d1; - } else { - FX_INT32 iTmp3 = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - count = 250 * (d1 - 249) + Unrandomize255State(iTmp3, codewordPosition++); - } - if (count < 0) { - e = BCExceptionFormatException; - return; - } - CFX_ByteArray *bytes = FX_NEW CFX_ByteArray(); - bytes->SetSize(count); - FX_INT32 i; - for (i = 0; i < count; i++) { - if (bits->Available() < 8) { - e = BCExceptionFormatException; - delete bytes; - return; - } - FX_INT32 iTemp5 = bits->ReadBits(8, e); - if (e != BCExceptionNO) { - delete bytes; - return; - } - bytes->SetAt(i, Unrandomize255State(iTemp5, codewordPosition++)); - } - BC_FX_ByteString_Append(result, *bytes); - delete bytes; -} -FX_BYTE CBC_DataMatrixDecodedBitStreamParser::Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition) -{ - FX_INT32 pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; - FX_INT32 tempVariable = randomizedBase256Codeword - pseudoRandomNumber; - return (FX_BYTE) (tempVariable >= 0 ? tempVariable : tempVariable + 256); -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp deleted file mode 100644 index 80f99332c1..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixDecoder.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixDecoder.h" -#include "include/BC_ReedSolomonDecoder.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_DataMatrixBitMatrixParser.h" -#include "include/BC_DataMatrixVersion.h" -#include "include/BC_DataMatrixDataBlock.h" -#include "include/BC_DataMatrixDecodedBitStreamParser.h" -CBC_DataMatrixDecoder::CBC_DataMatrixDecoder() -{ - m_rsDecoder = NULL; -} -void CBC_DataMatrixDecoder::Init() -{ - m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField); -} -CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder() -{ - if(m_rsDecoder != NULL) { - delete m_rsDecoder; - } - m_rsDecoder = NULL; -} -CBC_CommonDecoderResult *CBC_DataMatrixDecoder::Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e) -{ - CBC_DataMatrixBitMatrixParser parser; - parser.Init(bits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_DataMatrixVersion *version = parser.GetVersion(); - CFX_ByteArray* byteTemp = parser.ReadCodewords(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr codewords(byteTemp); - CFX_PtrArray *dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 dataBlocksCount = dataBlocks->GetSize(); - FX_INT32 totalBytes = 0; - FX_INT32 i, j; - for (i = 0; i < dataBlocksCount; i++) { - totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords(); - } - CFX_ByteArray resultBytes; - resultBytes.SetSize(totalBytes); - for (j = 0; j < dataBlocksCount; j++) { - CFX_ByteArray *codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords(); - FX_INT32 numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords(); - CorrectErrors(*codewordBytes, numDataCodewords, e); - if (e != BCExceptionNO) { - for(FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { - delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; - } - delete dataBlocks; - dataBlocks = NULL; - return NULL; - } - FX_INT32 i; - for (i = 0; i < numDataCodewords; i++) { - resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i]; - } - } - for(i = 0; i < (dataBlocks->GetSize()); i++) { - delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; - } - delete dataBlocks; - dataBlocks = NULL; - CBC_CommonDecoderResult *resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return resultR; -} -void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) -{ - FX_INT32 numCodewords = codewordBytes.GetSize(); - CFX_Int32Array codewordsInts; - codewordsInts.SetSize(numCodewords); - FX_INT32 i; - for (i = 0; i < numCodewords; i++) { - codewordsInts[i] = codewordBytes[i] & 0xFF; - } - FX_INT32 numECCodewords = codewordBytes.GetSize() - numDataCodewords; - m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); - if (e != BCExceptionNO) { - e = BCExceptionChecksumException; - return ; - } - for (i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = (FX_BYTE) codewordsInts[i]; - } -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp deleted file mode 100644 index ff956f8e95..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixDetector.cpp +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixDetector.h" -#include "include/BC_WhiteRectangleDetector.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRFinderPatternFinder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRDetectorResult.h" -#include "include/BC_QRGridSampler.h" -const FX_INT32 CBC_DataMatrixDetector::INTEGERS[5] = {0, 1, 2, 3, 4}; -CBC_DataMatrixDetector::CBC_DataMatrixDetector(CBC_CommonBitMatrix *image): - m_image(image), m_rectangleDetector(NULL) -{ -} -void CBC_DataMatrixDetector::Init(FX_INT32 &e) -{ - m_rectangleDetector = FX_NEW CBC_WhiteRectangleDetector(m_image); - m_rectangleDetector->Init(e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -CBC_DataMatrixDetector::~CBC_DataMatrixDetector() -{ - if(m_rectangleDetector != NULL) { - delete m_rectangleDetector; - } - m_rectangleDetector = NULL; -} -inline FX_BOOL ResultPointsAndTransitionsComparator(FX_LPVOID a, FX_LPVOID b) -{ - return ((CBC_ResultPointsAndTransitions *)b)->GetTransitions() > ((CBC_ResultPointsAndTransitions *)a)->GetTransitions(); -} -CBC_QRDetectorResult *CBC_DataMatrixDetector::Detect(FX_INT32 &e) -{ - CFX_PtrArray* cornerPoints = m_rectangleDetector->Detect(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_ResultPoint *pointA = (CBC_ResultPoint*)(*cornerPoints)[0]; - CBC_ResultPoint *pointB = (CBC_ResultPoint*)(*cornerPoints)[1]; - CBC_ResultPoint *pointC = (CBC_ResultPoint*)(*cornerPoints)[2]; - CBC_ResultPoint *pointD = (CBC_ResultPoint*)(*cornerPoints)[3]; - delete cornerPoints; - cornerPoints = NULL; - CFX_PtrArray transitions; - transitions.Add(TransitionsBetween(pointA, pointB)); - transitions.Add(TransitionsBetween(pointA, pointC)); - transitions.Add(TransitionsBetween(pointB, pointD)); - transitions.Add(TransitionsBetween(pointC, pointD)); - BC_FX_PtrArray_Sort(transitions, &ResultPointsAndTransitionsComparator); - delete ( (CBC_ResultPointsAndTransitions *)transitions[2] ); - delete ( (CBC_ResultPointsAndTransitions *)transitions[3] ); - CBC_ResultPointsAndTransitions *lSideOne = (CBC_ResultPointsAndTransitions*)transitions[0]; - CBC_ResultPointsAndTransitions *lSideTwo = (CBC_ResultPointsAndTransitions*)transitions[1]; - CFX_MapPtrTemplate pointCount; - Increment(pointCount, lSideOne->GetFrom()); - Increment(pointCount, lSideOne->GetTo()); - Increment(pointCount, lSideTwo->GetFrom()); - Increment(pointCount, lSideTwo->GetTo()); - delete ( (CBC_ResultPointsAndTransitions *)transitions[1] ); - delete ( (CBC_ResultPointsAndTransitions *)transitions[0] ); - transitions.RemoveAll(); - CBC_ResultPoint *maybeTopLeft = NULL; - CBC_ResultPoint *bottomLeft = NULL; - CBC_ResultPoint *maybeBottomRight = NULL; - FX_POSITION itBegin = pointCount.GetStartPosition(); - while(itBegin != NULL) { - CBC_ResultPoint *key = 0; - FX_INT32 value = 0; - pointCount.GetNextAssoc(itBegin, key, value); - if(value == 2) { - bottomLeft = key; - } else { - if (maybeBottomRight == NULL) { - maybeBottomRight = key; - } else { - maybeTopLeft = key; - } - } - } - if (maybeTopLeft == NULL || bottomLeft == NULL || maybeBottomRight == NULL) { - delete pointA; - delete pointB; - delete pointC; - delete pointD; - e = BCExceptionNotFound; - return NULL; - } - CFX_PtrArray corners; - corners.SetSize(3); - corners[0] = maybeTopLeft; - corners[1] = bottomLeft; - corners[2] = maybeBottomRight; - OrderBestPatterns(&corners); - CBC_ResultPoint *bottomRight = (CBC_ResultPoint*)corners[0]; - bottomLeft = (CBC_ResultPoint*)corners[1]; - CBC_ResultPoint *topLeft = (CBC_ResultPoint*)corners[2]; - CBC_ResultPoint *topRight = NULL; - FX_INT32 value; - if (!pointCount.Lookup(pointA, value)) { - topRight = pointA; - } else if (!pointCount.Lookup(pointB, value)) { - topRight = pointB; - } else if (!pointCount.Lookup(pointC, value)) { - topRight = pointC; - } else { - topRight = pointD; - } - FX_INT32 dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, topRight))->GetTransitions(); - FX_INT32 dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, topRight))->GetTransitions(); - if ((dimensionTop & 0x01) == 1) { - dimensionTop++; - } - dimensionTop += 2; - if ((dimensionRight & 0x01) == 1) { - dimensionRight++; - } - dimensionRight += 2; - CBC_AutoPtr bits(NULL); - CBC_AutoPtr correctedTopRight(NULL); - if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { - correctedTopRight = - CBC_AutoPtr(CorrectTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight, - dimensionTop, dimensionRight)); - if (correctedTopRight.get() == NULL) { - correctedTopRight = CBC_AutoPtr(topRight); - } else { - delete topRight; - topRight = NULL; - } - dimensionTop = CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(); - dimensionRight = CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions(); - if ((dimensionTop & 0x01) == 1) { - dimensionTop++; - } - if ((dimensionRight & 0x01) == 1) { - dimensionRight++; - } - bits = CBC_AutoPtr(SampleGrid(m_image, topLeft, bottomLeft, bottomRight, - correctedTopRight.get(), dimensionTop, dimensionRight, e)); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else { - FX_INT32 dimension = FX_MIN(dimensionRight, dimensionTop); - correctedTopRight = CBC_AutoPtr(CorrectTopRight(bottomLeft, bottomRight, - topLeft, topRight, dimension)); - if (correctedTopRight.get() == NULL) { - correctedTopRight = CBC_AutoPtr(topRight); - } else { - delete topRight; - topRight = NULL; - } - FX_INT32 dimensionCorrected = FX_MAX(CBC_AutoPtr(TransitionsBetween(topLeft, correctedTopRight.get()))->GetTransitions(), - CBC_AutoPtr(TransitionsBetween(bottomRight, correctedTopRight.get()))->GetTransitions()); - dimensionCorrected++; - if ((dimensionCorrected & 0x01) == 1) { - dimensionCorrected++; - } - bits = CBC_AutoPtr(SampleGrid(m_image, - topLeft, - bottomLeft, - bottomRight, - correctedTopRight.get(), - dimensionCorrected, - dimensionCorrected, e)); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CFX_PtrArray *result = FX_NEW CFX_PtrArray; - result->SetSize(4); - result->Add(topLeft); - result->Add(bottomLeft); - result->Add(bottomRight); - result->Add(correctedTopRight.release()); - return FX_NEW CBC_QRDetectorResult(bits.release(), result); -} -CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimensionTop, FX_INT32 dimensionRight) -{ - FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT)dimensionTop; - FX_INT32 norm = Distance(topLeft, topRight); - FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; - FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; - CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); - corr = Distance(bottomLeft, topLeft) / (FX_FLOAT)dimensionRight; - norm = Distance(bottomRight, topRight); - cos = (topRight->GetX() - bottomRight->GetX()) / norm; - sin = (topRight->GetY() - bottomRight->GetY()) / norm; - CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); - if (!IsValid(c1.get())) { - if (IsValid(c2.get())) { - return c2.release(); - } - return NULL; - } else if (!IsValid(c2.get())) { - return c1.release(); - } - FX_INT32 l1 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions()) + - FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); - FX_INT32 l2 = FXSYS_abs(dimensionTop - CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions()) + - FXSYS_abs(dimensionRight - CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); - if (l1 <= l2) { - return c1.release(); - } - return c2.release(); -} -CBC_ResultPoint *CBC_DataMatrixDetector::CorrectTopRight(CBC_ResultPoint *bottomLeft, CBC_ResultPoint *bottomRight, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, FX_INT32 dimension) -{ - FX_FLOAT corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; - FX_INT32 norm = Distance(topLeft, topRight); - FX_FLOAT cos = (topRight->GetX() - topLeft->GetX()) / norm; - FX_FLOAT sin = (topRight->GetY() - topLeft->GetY()) / norm; - CBC_AutoPtr c1(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); - corr = Distance(bottomLeft, bottomRight) / (FX_FLOAT) dimension; - norm = Distance(bottomRight, topRight); - cos = (topRight->GetX() - bottomRight->GetX()) / norm; - sin = (topRight->GetY() - bottomRight->GetY()) / norm; - CBC_AutoPtr c2(FX_NEW CBC_ResultPoint(topRight->GetX() + corr * cos, topRight->GetY() + corr * sin)); - if (!IsValid(c1.get())) { - if (IsValid(c2.get())) { - return c2.release(); - } - return NULL; - } else if (!IsValid(c2.get())) { - return c1.release(); - } - FX_INT32 l1 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c1.get()))->GetTransitions() - - CBC_AutoPtr(TransitionsBetween(bottomRight, c1.get()))->GetTransitions()); - FX_INT32 l2 = FXSYS_abs(CBC_AutoPtr(TransitionsBetween(topLeft, c2.get()))->GetTransitions() - - CBC_AutoPtr(TransitionsBetween(bottomRight, c2.get()))->GetTransitions()); - return l1 <= l2 ? c1.release() : c2.release(); -} -FX_BOOL CBC_DataMatrixDetector::IsValid(CBC_ResultPoint *p) -{ - return p->GetX() >= 0 && p->GetX() < m_image->GetWidth() && p->GetY() > 0 && p->GetY() < m_image->GetHeight(); -} -FX_INT32 CBC_DataMatrixDetector::Round(FX_FLOAT d) -{ - return (FX_INT32) (d + 0.5f); -} -FX_INT32 CBC_DataMatrixDetector::Distance(CBC_ResultPoint *a, CBC_ResultPoint *b) -{ - return Round((FX_FLOAT) sqrt((a->GetX() - b->GetX()) - * (a->GetX() - b->GetX()) + (a->GetY() - b->GetY()) - * (a->GetY() - b->GetY()))); -} -void CBC_DataMatrixDetector::Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key) -{ - FX_INT32 value; - if(table.Lookup(key, value)) { - table.SetAt(key, INTEGERS[value + 1]); - } else { - table.SetAt(key, INTEGERS[1]); - } -} -CBC_CommonBitMatrix *CBC_DataMatrixDetector::SampleGrid(CBC_CommonBitMatrix *image, - CBC_ResultPoint *topLeft, - CBC_ResultPoint *bottomLeft, - CBC_ResultPoint *bottomRight, - CBC_ResultPoint *topRight, - FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e) -{ - CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); - CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, - dimensionX, - dimensionY, - 0.5f, - 0.5f, - dimensionX - 0.5f, - 0.5f, - dimensionX - 0.5f, - dimensionY - 0.5f, - 0.5f, - dimensionY - 0.5f, - topLeft->GetX(), - topLeft->GetY(), - topRight->GetX(), - topRight->GetY(), - bottomRight->GetX(), - bottomRight->GetY(), - bottomLeft->GetX(), - bottomLeft->GetY(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return cbm; -} -CBC_ResultPointsAndTransitions *CBC_DataMatrixDetector::TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to) -{ - FX_INT32 fromX = (FX_INT32) from->GetX(); - FX_INT32 fromY = (FX_INT32) from->GetY(); - FX_INT32 toX = (FX_INT32) to->GetX(); - FX_INT32 toY = (FX_INT32) to->GetY(); - FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); - if (steep) { - FX_INT32 temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - FX_INT32 dx = FXSYS_abs(toX - fromX); - FX_INT32 dy = FXSYS_abs(toY - fromY); - FX_INT32 error = -dx >> 1; - FX_INT32 ystep = fromY < toY ? 1 : -1; - FX_INT32 xstep = fromX < toX ? 1 : -1; - FX_INT32 transitions = 0; - FX_BOOL inBlack = m_image->Get(steep ? fromY : fromX, steep ? fromX : fromY); - for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { - FX_BOOL isBlack = m_image->Get(steep ? y : x, steep ? x : y); - if (isBlack != inBlack) { - transitions++; - inBlack = isBlack; - } - error += dy; - if (error > 0) { - if (y == toY) { - break; - } - y += ystep; - error -= dx; - } - } - return FX_NEW CBC_ResultPointsAndTransitions(from, to, transitions); -} -void CBC_DataMatrixDetector::OrderBestPatterns(CFX_PtrArray *patterns) -{ - FX_FLOAT abDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); - FX_FLOAT bcDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); - FX_FLOAT acDistance = (FX_FLOAT)Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); - CBC_ResultPoint *topLeft, *topRight, *bottomLeft; - if (bcDistance >= abDistance && bcDistance >= acDistance) { - topLeft = (CBC_ResultPoint*)(*patterns)[0]; - topRight = (CBC_ResultPoint*)(*patterns)[1]; - bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; - } else if (acDistance >= bcDistance && acDistance >= abDistance) { - topLeft = (CBC_ResultPoint*)(*patterns)[1]; - topRight = (CBC_ResultPoint*)(*patterns)[0]; - bottomLeft = (CBC_ResultPoint*)(*patterns)[2]; - } else { - topLeft = (CBC_ResultPoint*)(*patterns)[2]; - topRight = (CBC_ResultPoint*)(*patterns)[0]; - bottomLeft = (CBC_ResultPoint*)(*patterns)[1]; - } - if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() - - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { - CBC_ResultPoint *temp = topRight; - topRight = bottomLeft; - bottomLeft = temp; - } - (*patterns)[0] = bottomLeft; - (*patterns)[1] = topLeft; - (*patterns)[2] = topRight; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp deleted file mode 100644 index cbea2c42a3..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixReader.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixDecoder.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_DataMatrixDetector.h" -#include "include/BC_QRDetectorResult.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_Reader.h" -#include "include/BC_DataMatrixReader.h" -CBC_DataMatrixReader::CBC_DataMatrixReader() -{ - m_decoder = NULL; -} -void CBC_DataMatrixReader::Init() -{ - m_decoder = FX_NEW CBC_DataMatrixDecoder; - m_decoder->Init(); -} -CBC_DataMatrixReader::~CBC_DataMatrixReader() -{ - if(m_decoder != NULL) { - delete m_decoder; - } - m_decoder = NULL; -} -CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - CBC_CommonBitMatrix *cdr = image->GetBlackMatrix(e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_DataMatrixDetector detector(cdr); - detector.Init(e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_QRDetectorResult* ddr = detector.Detect(e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr detectorResult(ddr); - CBC_CommonDecoderResult* ResultTemp = m_decoder->Decode(detectorResult->GetBits(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr decodeResult(ResultTemp); - return decodeResult->GetText(); -} -CFX_ByteString CBC_DataMatrixReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) -{ - CFX_ByteString bs = Decode(image, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bs; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp deleted file mode 100644 index 41a6839b5b..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixSymbolInfo144.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_DataMatrixSymbolInfo144.h" -CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144() : CBC_SymbolInfo(FALSE, 1558, 620, 22, 22, 36) -{ - m_rsBlockData = -1; - m_rsBlockError = 62; -} -CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() -{ -} -FX_INT32 CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() -{ - return 10; -} -FX_INT32 CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(FX_INT32 index) -{ - return (index <= 8) ? 156 : 155; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp deleted file mode 100644 index 4d0bce331e..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixVersion.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DataMatrixVersion.h" -CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL; -void CBC_DataMatrixVersion::Initialize() -{ - VERSIONS = FX_NEW CFX_PtrArray(); -} -void CBC_DataMatrixVersion::Finalize() -{ - for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { - delete ( (CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)) ); - } - VERSIONS->RemoveAll(); - delete VERSIONS; -} -CBC_DataMatrixVersion::CBC_DataMatrixVersion(FX_INT32 versionNumber, - FX_INT32 symbolSizeRows, - FX_INT32 symbolSizeColumns, - FX_INT32 dataRegionSizeRows, - FX_INT32 dataRegionSizeColumns, - ECBlocks *ecBlocks) -{ - m_versionNumber = versionNumber; - m_symbolSizeRows = symbolSizeRows; - m_symbolSizeColumns = symbolSizeColumns; - m_dataRegionSizeRows = dataRegionSizeRows; - m_dataRegionSizeColumns = dataRegionSizeColumns; - m_ecBlocks = ecBlocks; - FX_INT32 total = 0; - FX_INT32 ecCodewords = ecBlocks->GetECCodewords(); - const CFX_PtrArray &ecbArray = ecBlocks->GetECBlocks(); - for (FX_INT32 i = 0; i < ecbArray.GetSize(); i++) { - total += ((ECB*)ecbArray[i])->GetCount() * (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords); - } - m_totalCodewords = total; -} -CBC_DataMatrixVersion::~CBC_DataMatrixVersion() -{ - if(m_ecBlocks != NULL) { - delete m_ecBlocks; - } - m_ecBlocks = NULL; -} -FX_INT32 CBC_DataMatrixVersion::GetVersionNumber() -{ - return m_versionNumber; -} -FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeRows() -{ - return m_symbolSizeRows; -} -FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeColumns() -{ - return m_symbolSizeColumns; -} -FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeRows() -{ - return m_dataRegionSizeRows; -} -FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeColumns() -{ - return m_dataRegionSizeColumns; -} -FX_INT32 CBC_DataMatrixVersion::GetTotalCodewords() -{ - return m_totalCodewords; -} -ECBlocks *CBC_DataMatrixVersion::GetECBlocks() -{ - return m_ecBlocks; -} -void CBC_DataMatrixVersion::ReleaseAll() -{ - for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) { - delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i); - } - VERSIONS->RemoveAll(); -} -CBC_DataMatrixVersion *CBC_DataMatrixVersion::GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e) -{ - if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { - e = BCExceptionNotFound; - return NULL; - } - if(VERSIONS->GetSize() == 0) { - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(1, 10, 10, 8, 8, FX_NEW ECBlocks(5, FX_NEW ECB(1, 3)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(2, 12, 12, 10, 10, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(3, 14, 14, 12, 12, FX_NEW ECBlocks(10, FX_NEW ECB(1, 8)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(4, 16, 16, 14, 14, FX_NEW ECBlocks(12, FX_NEW ECB(1, 12)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(5, 18, 18, 16, 16, FX_NEW ECBlocks(14, FX_NEW ECB(1, 18)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(6, 20, 20, 18, 18, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(7, 22, 22, 20, 20, FX_NEW ECBlocks(20, FX_NEW ECB(1, 30)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(8, 24, 24, 22, 22, FX_NEW ECBlocks(24, FX_NEW ECB(1, 36)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(9, 26, 26, 24, 24, FX_NEW ECBlocks(28, FX_NEW ECB(1, 44)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(10, 32, 32, 14, 14, FX_NEW ECBlocks(36, FX_NEW ECB(1, 62)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(11, 36, 36, 16, 16, FX_NEW ECBlocks(42, FX_NEW ECB(1, 86)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(12, 40, 40, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(1, 114)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(13, 44, 44, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(1, 144)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(14, 48, 48, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(1, 174)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(15, 52, 52, 24, 24, FX_NEW ECBlocks(42, FX_NEW ECB(2, 102)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(16, 64, 64, 14, 14, FX_NEW ECBlocks(56, FX_NEW ECB(2, 140)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(17, 72, 72, 16, 16, FX_NEW ECBlocks(36, FX_NEW ECB(4, 92)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(18, 80, 80, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(4, 114)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(19, 88, 88, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(4, 144)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(20, 96, 96, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(4, 174)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(21, 104, 104, 24, 24, FX_NEW ECBlocks(56, FX_NEW ECB(6, 136)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(22, 120, 120, 18, 18, FX_NEW ECBlocks(68, FX_NEW ECB(6, 175)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(23, 132, 132, 20, 20, FX_NEW ECBlocks(62, FX_NEW ECB(8, 163)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(24, 144, 144, 22, 22, FX_NEW ECBlocks(62, FX_NEW ECB(8, 156), FX_NEW ECB(2, 155)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(25, 8, 18, 6, 16, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(26, 8, 32, 6, 14, FX_NEW ECBlocks(11, FX_NEW ECB(1, 10)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(27, 12, 26, 10, 24, FX_NEW ECBlocks(14, FX_NEW ECB(1, 16)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(28, 12, 36, 10, 16, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(29, 16, 36, 14, 16, FX_NEW ECBlocks(24, FX_NEW ECB(1, 32)))); - VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(30, 16, 48, 14, 22, FX_NEW ECBlocks(28, FX_NEW ECB(1, 49)))); - } - FX_INT32 numVersions = VERSIONS->GetSize(); - for (FX_INT32 i = 0; i < numVersions; ++i) { - if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows == numRows && ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns == numColumns) { - return (CBC_DataMatrixVersion*)(*VERSIONS)[i]; - } - } - e = BCExceptionNotFound; - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp b/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp deleted file mode 100644 index a6cf63e3cc..0000000000 --- a/xfa/src/fxbarcode/src/BC_DataMatrixWriter.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_TwoDimWriter.h" -#include "include/BC_Encoder.h" -#include "include/BC_DefaultPlacement.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_DataMatrixSymbolInfo144.h" -#include "include/BC_ErrorCorrection.h" -#include "include/BC_Dimension.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_C40Encoder.h" -#include "include/BC_TextEncoder.h" -#include "include/BC_X12Encoder.h" -#include "include/BC_EdifactEncoder.h" -#include "include/BC_Base256Encoder.h" -#include "include/BC_ASCIIEncoder.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_DataMatrixWriter.h" -#include "include/BC_UtilCodingConvert.h" -CBC_DataMatrixWriter::CBC_DataMatrixWriter() -{ -} -CBC_DataMatrixWriter::~CBC_DataMatrixWriter() -{ -} -FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel (FX_INT32 level) -{ - m_iCorrectLevel = level; - return TRUE; -} -FX_BYTE* CBC_DataMatrixWriter::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - if (outWidth < 0 || outHeight < 0) { - e = BCExceptionHeightAndWidthMustBeAtLeast1; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_SymbolShapeHint::SymbolShapeHint shape = CBC_SymbolShapeHint::FORCE_SQUARE; - CBC_Dimension* minSize = NULL; - CBC_Dimension* maxSize = NULL; - CFX_WideString ecLevel; - CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(contents, ecLevel, shape, minSize, maxSize, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(encoded.GetLength(), shape, minSize, maxSize, TRUE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CFX_WideString codewords = CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_DefaultPlacement* placement = FX_NEW CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e), symbolInfo->getSymbolDataHeight(e)); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - placement->place(); - CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - outWidth = bytematrix->GetWidth(); - outHeight = bytematrix->GetHeight(); - FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outHeight); - FXSYS_memcpy32(result, bytematrix->GetArray(), outWidth * outHeight); - delete bytematrix; - delete placement; - return result; -} -FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - return NULL; -} -FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - return NULL; -} -CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) -{ - FX_INT32 symbolWidth = symbolInfo->getSymbolDataWidth(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 symbolHeight = symbolInfo->getSymbolDataHeight(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_CommonByteMatrix* matrix = FX_NEW CBC_CommonByteMatrix(symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e)); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - matrix->Init(); - FX_INT32 matrixY = 0; - for (FX_INT32 y = 0; y < symbolHeight; y++) { - FX_INT32 matrixX; - if ((y % symbolInfo->m_matrixHeight) == 0) { - matrixX = 0; - for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { - matrix->Set(matrixX, matrixY, (x % 2) == 0); - matrixX++; - } - matrixY++; - } - matrixX = 0; - for (FX_INT32 x = 0; x < symbolWidth; x++) { - if ((x % symbolInfo->m_matrixWidth) == 0) { - matrix->Set(matrixX, matrixY, TRUE); - matrixX++; - } - matrix->Set(matrixX, matrixY, placement->getBit(x, y)); - matrixX++; - if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) { - matrix->Set(matrixX, matrixY, (y % 2) == 0); - matrixX++; - } - } - matrixY++; - if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) { - matrixX = 0; - for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) { - matrix->Set(matrixX, matrixY, TRUE); - matrixX++; - } - matrixY++; - } - } - return matrix; -} diff --git a/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp b/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp deleted file mode 100644 index e62192b5f0..0000000000 --- a/xfa/src/fxbarcode/src/BC_DefaultPlacement.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_DefaultPlacement.h" -CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows) -{ - m_codewords = codewords; - m_numcols = numcols; - m_numrows = numrows; - m_bits.SetSize(numcols * numrows); - for (FX_INT32 i = 0; i < numcols * numrows; i++) { - m_bits[i] = (FX_BYTE) 2; - } -} -CBC_DefaultPlacement::~CBC_DefaultPlacement() -{ - m_bits.RemoveAll(); -} -FX_INT32 CBC_DefaultPlacement::getNumrows() -{ - return m_numrows; -} -FX_INT32 CBC_DefaultPlacement::getNumcols() -{ - return m_numcols; -} -CFX_ByteArray& CBC_DefaultPlacement::getBits() -{ - return m_bits; -} -FX_BOOL CBC_DefaultPlacement::getBit(FX_INT32 col, FX_INT32 row) -{ - return m_bits[row * m_numcols + col] == 1; -} -void CBC_DefaultPlacement::setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit) -{ - m_bits[row * m_numcols + col] = bit ? (FX_BYTE) 1 : (FX_BYTE) 0; -} -FX_BOOL CBC_DefaultPlacement::hasBit(FX_INT32 col, FX_INT32 row) -{ - return m_bits[row * m_numcols + col] != 2; -} -void CBC_DefaultPlacement::place() -{ - FX_INT32 pos = 0; - FX_INT32 row = 4; - FX_INT32 col = 0; - do { - if ((row == m_numrows) && (col == 0)) { - corner1(pos++); - } - if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) { - corner2(pos++); - } - if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) { - corner3(pos++); - } - if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) { - corner4(pos++); - } - do { - if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) { - utah(row, col, pos++); - } - row -= 2; - col += 2; - } while (row >= 0 && (col < m_numcols)); - row++; - col += 3; - do { - if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) { - utah(row, col, pos++); - } - row += 2; - col -= 2; - } while ((row < m_numrows) && (col >= 0)); - row += 3; - col++; - } while ((row < m_numrows) || (col < m_numcols)); - if (!hasBit(m_numcols - 1, m_numrows - 1)) { - setBit(m_numcols - 1, m_numrows - 1, TRUE); - setBit(m_numcols - 2, m_numrows - 2, TRUE); - } -} -void CBC_DefaultPlacement::module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit) -{ - if (row < 0) { - row += m_numrows; - col += 4 - ((m_numrows + 4) % 8); - } - if (col < 0) { - col += m_numcols; - row += 4 - ((m_numcols + 4) % 8); - } - FX_INT32 v = m_codewords.GetAt(pos); - v &= 1 << (8 - bit); - setBit(col, row, v != 0); -} -void CBC_DefaultPlacement::utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos) -{ - module(row - 2, col - 2, pos, 1); - module(row - 2, col - 1, pos, 2); - module(row - 1, col - 2, pos, 3); - module(row - 1, col - 1, pos, 4); - module(row - 1, col, pos, 5); - module(row, col - 2, pos, 6); - module(row, col - 1, pos, 7); - module(row, col, pos, 8); -} -void CBC_DefaultPlacement::corner1(FX_INT32 pos) -{ - module(m_numrows - 1, 0, pos, 1); - module(m_numrows - 1, 1, pos, 2); - module(m_numrows - 1, 2, pos, 3); - module(0, m_numcols - 2, pos, 4); - module(0, m_numcols - 1, pos, 5); - module(1, m_numcols - 1, pos, 6); - module(2, m_numcols - 1, pos, 7); - module(3, m_numcols - 1, pos, 8); -} -void CBC_DefaultPlacement::corner2(FX_INT32 pos) -{ - module(m_numrows - 3, 0, pos, 1); - module(m_numrows - 2, 0, pos, 2); - module(m_numrows - 1, 0, pos, 3); - module(0, m_numcols - 4, pos, 4); - module(0, m_numcols - 3, pos, 5); - module(0, m_numcols - 2, pos, 6); - module(0, m_numcols - 1, pos, 7); - module(1, m_numcols - 1, pos, 8); -} -void CBC_DefaultPlacement::corner3(FX_INT32 pos) -{ - module(m_numrows - 3, 0, pos, 1); - module(m_numrows - 2, 0, pos, 2); - module(m_numrows - 1, 0, pos, 3); - module(0, m_numcols - 2, pos, 4); - module(0, m_numcols - 1, pos, 5); - module(1, m_numcols - 1, pos, 6); - module(2, m_numcols - 1, pos, 7); - module(3, m_numcols - 1, pos, 8); -} -void CBC_DefaultPlacement::corner4(FX_INT32 pos) -{ - module(m_numrows - 1, 0, pos, 1); - module(m_numrows - 1, m_numcols - 1, pos, 2); - module(0, m_numcols - 3, pos, 3); - module(0, m_numcols - 2, pos, 4); - module(0, m_numcols - 1, pos, 5); - module(1, m_numcols - 3, pos, 6); - module(1, m_numcols - 2, pos, 7); - module(1, m_numcols - 1, pos, 8); -} diff --git a/xfa/src/fxbarcode/src/BC_Dimension.cpp b/xfa/src/fxbarcode/src/BC_Dimension.cpp deleted file mode 100644 index 1788355ec0..0000000000 --- a/xfa/src/fxbarcode/src/BC_Dimension.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_Dimension.h" -CBC_Dimension::CBC_Dimension() -{ -} -CBC_Dimension::CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e) -{ - if (width < 0 || height < 0) { - e = BCExceptionHeightAndWidthMustBeAtLeast1; - } - m_width = width; - m_height = height; -} -CBC_Dimension::~CBC_Dimension() -{ -} -FX_INT32 CBC_Dimension::getWidth() -{ - return m_width; -} -FX_INT32 CBC_Dimension::getHeight() -{ - return m_height; -} -FX_INT32 CBC_Dimension::hashCode() -{ - return m_width * 32713 + m_height; -} -CFX_WideString CBC_Dimension::toString() -{ - return (FX_WCHAR)(m_width + (FX_WCHAR)'x' + m_height); -} diff --git a/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp b/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp deleted file mode 100644 index 2a6d56adb9..0000000000 --- a/xfa/src/fxbarcode/src/BC_EdifactEncoder.cpp +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_EdifactEncoder.h" -CBC_EdifactEncoder::CBC_EdifactEncoder() -{ -} -CBC_EdifactEncoder::~CBC_EdifactEncoder() -{ -} -FX_INT32 CBC_EdifactEncoder::getEncodingMode() -{ - return EDIFACT_ENCODATION; -} -void CBC_EdifactEncoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) -{ - CFX_WideString buffer; - while (context.hasMoreCharacters()) { - FX_WCHAR c = context.getCurrentChar(); - encodeChar(c, buffer, e); - if (e != BCExceptionNO) { - return; - } - context.m_pos++; - FX_INT32 count = buffer.GetLength(); - if (count >= 4) { - context.writeCodewords(encodeToCodewords(buffer, 0, e)); - if (e != BCExceptionNO) { - return; - } - buffer.Delete(0, 4); - FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(ASCII_ENCODATION); - break; - } - } - } - buffer += (FX_WCHAR)31; - handleEOD(context, buffer, e); -} -void CBC_EdifactEncoder::handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e) -{ - FX_INT32 count = buffer.GetLength(); - if (count == 0) { - return; - } - if (count == 1) { - context.updateSymbolInfo(e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); - FX_INT32 remaining = context.getRemainingCharacters(); - if (remaining == 0 && available <= 2) { - return; - } - } - if (count > 4) { - e = BCExceptionIllegalStateCountMustNotExceed4; - return; - } - FX_INT32 restChars = count - 1; - CFX_WideString encoded = encodeToCodewords(buffer, 0, e); - if (e != BCExceptionNO) { - return; - } - FX_BOOL endOfSymbolReached = !context.hasMoreCharacters(); - FX_BOOL restInAscii = endOfSymbolReached && restChars <= 2; - if (restChars <= 2) { - context.updateSymbolInfo(context.getCodewordCount() + restChars, e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); - if (available >= 3) { - restInAscii = FALSE; - context.updateSymbolInfo(context.getCodewordCount() + encoded.GetLength(), e); - if (e != BCExceptionNO) { - return; - } - } - } - if (restInAscii) { - context.resetSymbolInfo(); - context.m_pos -= restChars; - } else { - context.writeCodewords(encoded); - } - context.signalEncoderChange(ASCII_ENCODATION); -} -void CBC_EdifactEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) -{ - if (c >= ' ' && c <= '?') { - sb += c; - } else if (c >= '@' && c <= '^') { - sb += (FX_WCHAR)(c - 64); - } else { - CBC_HighLevelEncoder::illegalCharacter(c, e); - } -} -CFX_WideString CBC_EdifactEncoder::encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e) -{ - FX_INT32 len = sb.GetLength() - startPos; - if (len == 0) { - e = BCExceptionNoContents; - return (FX_LPWSTR)""; - } - FX_WCHAR c1 = sb.GetAt(startPos); - FX_WCHAR c2 = len >= 2 ? sb.GetAt(startPos + 1) : 0; - FX_WCHAR c3 = len >= 3 ? sb.GetAt(startPos + 2) : 0; - FX_WCHAR c4 = len >= 4 ? sb.GetAt(startPos + 3) : 0; - FX_INT32 v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; - FX_WCHAR cw1 = (FX_WCHAR) ((v >> 16) & 255); - FX_WCHAR cw2 = (FX_WCHAR) ((v >> 8) & 255); - FX_WCHAR cw3 = (FX_WCHAR) (v & 255); - CFX_WideString res; - res += cw1; - if (len >= 2) { - res += cw2; - } - if (len >= 3) { - res += cw3; - } - return res; -} diff --git a/xfa/src/fxbarcode/src/BC_Encoder.cpp b/xfa/src/fxbarcode/src/BC_Encoder.cpp deleted file mode 100644 index f9b224e68e..0000000000 --- a/xfa/src/fxbarcode/src/BC_Encoder.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_Encoder.h" -CBC_Encoder::CBC_Encoder() -{ -} -CBC_Encoder::~CBC_Encoder() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_EncoderContext.cpp b/xfa/src/fxbarcode/src/BC_EncoderContext.cpp deleted file mode 100644 index 4b1bf0ea62..0000000000 --- a/xfa/src/fxbarcode/src/BC_EncoderContext.cpp +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_UtilCodingConvert.h" -CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) -{ - CFX_ByteString dststr; - CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr); - CFX_WideString sb; - FX_INT32 c = dststr.GetLength(); - for (FX_INT32 i = 0; i < c; i++) { - FX_WCHAR ch = (FX_WCHAR)(dststr.GetAt(i) & 0xff); - if (ch == '?' && dststr.GetAt(i) != '?') { - e = BCExceptionCharactersOutsideISO88591Encoding; - } - sb += ch; - } - m_msg = sb; - m_shape = FORCE_NONE; - m_newEncoding = -1; - m_pos = 0; - m_symbolInfo = NULL; - m_skipAtEnd = 0; - m_maxSize = NULL; - m_minSize = NULL; -} -CBC_EncoderContext::~CBC_EncoderContext() -{ -} -void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape) -{ - m_shape = shape; -} -void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize) -{ - m_maxSize = maxSize; - m_minSize = minSize; -} -CFX_WideString CBC_EncoderContext::getMessage() -{ - return m_msg; -} -void CBC_EncoderContext::setSkipAtEnd(FX_INT32 count) -{ - m_skipAtEnd = count; -} -FX_WCHAR CBC_EncoderContext::getCurrentChar() -{ - return m_msg.GetAt(m_pos); -} -FX_WCHAR CBC_EncoderContext::getCurrent() -{ - return m_msg.GetAt(m_pos); -} -void CBC_EncoderContext::writeCodewords(CFX_WideString codewords) -{ - m_codewords += codewords; -} -void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword) -{ - m_codewords += codeword; -} -FX_INT32 CBC_EncoderContext::getCodewordCount() -{ - return m_codewords.GetLength(); -} -void CBC_EncoderContext::signalEncoderChange(FX_INT32 encoding) -{ - m_newEncoding = encoding; -} -void CBC_EncoderContext::resetEncoderSignal() -{ - m_newEncoding = -1; -} -FX_BOOL CBC_EncoderContext::hasMoreCharacters() -{ - return m_pos < getTotalMessageCharCount(); -} -FX_INT32 CBC_EncoderContext::getRemainingCharacters() -{ - return getTotalMessageCharCount() - m_pos; -} -void CBC_EncoderContext::updateSymbolInfo(FX_INT32 &e) -{ - updateSymbolInfo(getCodewordCount(), e); -} -void CBC_EncoderContext::updateSymbolInfo(FX_INT32 len, FX_INT32 &e) -{ - if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) { - m_symbolInfo = CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_EncoderContext::resetSymbolInfo() -{ - m_shape = FORCE_NONE; -} -FX_INT32 CBC_EncoderContext::getTotalMessageCharCount() -{ - return m_msg.GetLength() - m_skipAtEnd; -} diff --git a/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp deleted file mode 100644 index 16f5c1184e..0000000000 --- a/xfa/src/fxbarcode/src/BC_ErrorCorrection.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_ErrorCorrection.h" -FX_INT32 CBC_ErrorCorrection::FACTOR_SETS[] = {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68}; -FX_INT32 CBC_ErrorCorrection::FACTORS[][100] = { - {228, 48, 15, 111, 62}, - {23, 68, 144, 134, 240, 92, 254}, - {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, - {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, - {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, - {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, - {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, - {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, - { - 52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, - 254, 124, 12, 181, 184, 96, 50, 193 - }, - { - 211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, - 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255 - }, - { - 245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, - 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, - 225, 98, 81, 112 - }, - { - 77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, - 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, - 248, 202, 69, 50, 150, 177, 226, 5, 9, 5 - }, - { - 245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, - 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, - 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19 - }, - { - 175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, - 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, - 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, - 155, 43, 203, 107, 233, 53, 143, 46 - }, - { - 242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, - 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, - 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, - 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204 - }, - { - 220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, - 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, - 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, - 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, - 96, 103, 82, 186 - } -}; -FX_INT32 CBC_ErrorCorrection::MODULO_VALUE = 0x12D; -FX_INT32 CBC_ErrorCorrection::LOG[256] = {0}; -FX_INT32 CBC_ErrorCorrection::ALOG[256] = {0}; -void CBC_ErrorCorrection::Initialize() -{ - FX_INT32 p = 1; - for (FX_INT32 i = 0; i < 255; i++) { - ALOG[i] = p; - LOG[p] = i; - p <<= 1; - if (p >= 256) { - p ^= MODULO_VALUE; - } - } -} -void CBC_ErrorCorrection::Finalize() -{ -} -CBC_ErrorCorrection::CBC_ErrorCorrection() -{ -} -CBC_ErrorCorrection::~CBC_ErrorCorrection() -{ -} -CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e) -{ - if (codewords.GetLength() != symbolInfo->m_dataCapacity) { - e = BCExceptionIllegalArgument; - return (FX_LPWSTR)""; - } - CFX_WideString sb; - sb += codewords; - FX_INT32 blockCount = symbolInfo->getInterleavedBlockCount(); - if (blockCount == 1) { - CFX_WideString ecc = createECCBlock(codewords, symbolInfo->m_errorCodewords, e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - sb += ecc; - } else { - CFX_Int32Array dataSizes; - dataSizes.SetSize(blockCount); - CFX_Int32Array errorSizes; - errorSizes.SetSize(blockCount); - CFX_Int32Array startPos; - startPos.SetSize(blockCount); - for (FX_INT32 i = 0; i < blockCount; i++) { - dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1); - errorSizes[i] = symbolInfo->getErrorLengthForInterleavedBlock(i + 1); - startPos[i] = 0; - if (i > 0) { - startPos[i] = startPos[i - 1] + dataSizes[i]; - } - } - for (FX_INT32 block = 0; block < blockCount; block++) { - CFX_WideString temp; - for (FX_INT32 d = block; d < symbolInfo->m_dataCapacity; d += blockCount) { - temp += (FX_WCHAR)codewords.GetAt(d); - } - CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - FX_INT32 pos = 0; - for (FX_INT32 l = block; l < errorSizes[block] * blockCount; l += blockCount) { - sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++)); - } - } - } - return sb; -} -CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e) -{ - return createECCBlock(codewords, 0, codewords.GetLength(), numECWords, e); -} -CFX_WideString CBC_ErrorCorrection::createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e) -{ - FX_INT32 table = -1; - for (FX_INT32 i = 0; i < sizeof(FACTOR_SETS) / sizeof(FX_INT32); i++) { - if (FACTOR_SETS[i] == numECWords) { - table = i; - break; - } - } - if (table < 0) { - e = BCExceptionIllegalArgument; - return (FX_LPWSTR)""; - } - FX_WORD* ecc = FX_Alloc(FX_WORD, numECWords); - FXSYS_memset32(ecc, 0, numECWords * sizeof(FX_WORD)); - for (FX_INT32 l = start; l < start + len; l++) { - FX_BYTE A = (FX_BYTE)codewords.GetAt(l); - FX_WORD B = ecc[numECWords - 1]; - FX_WORD m = ecc[numECWords - 1] ^ codewords.GetAt(l); - for (FX_INT32 k = numECWords - 1; k > 0; k--) { - if (m != 0 && FACTORS[table][k] != 0) { - FX_INT32 a = LOG[FACTORS[table][k]]; - FX_INT32 b = ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]; - FX_WORD c = ecc[k - 1]; - FX_WORD D = (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); - ecc[k] = (FX_WORD ) (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[FACTORS[table][k]]) % 255]); - } else { - ecc[k] = ecc[k - 1]; - } - } - if (m != 0 && FACTORS[table][0] != 0) { - ecc[0] = (FX_WORD) ALOG[(LOG[m] + LOG[FACTORS[table][0]]) % 255]; - } else { - ecc[0] = 0; - } - } - CFX_WideString strecc; - for (FX_INT32 j = 0; j < numECWords; j++) { - strecc += (FX_WCHAR)ecc[numECWords - j - 1]; - } - FX_Free(ecc); - return strecc; -} diff --git a/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp b/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp deleted file mode 100644 index 30ef843bde..0000000000 --- a/xfa/src/fxbarcode/src/BC_FinderPatternInfo.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRFinderPattern.h" -#include "include/BC_FinderPatternInfo.h" -CBC_QRFinderPatternInfo::CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters) -{ - m_bottomLeft = (CBC_QRFinderPattern*)(*patternCenters)[0]; - m_topLeft = (CBC_QRFinderPattern*)(*patternCenters)[1]; - m_topRight = (CBC_QRFinderPattern*)(*patternCenters)[2]; -} -CBC_QRFinderPatternInfo::~CBC_QRFinderPatternInfo() -{ -} -CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetBottomLeft() -{ - return m_bottomLeft; -} -CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopLeft() -{ - return m_topLeft; -} -CBC_QRFinderPattern* CBC_QRFinderPatternInfo::GetTopRight() -{ - return m_topRight; -} diff --git a/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp b/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp deleted file mode 100644 index 78615734d6..0000000000 --- a/xfa/src/fxbarcode/src/BC_GlobalHistogramBinarizer.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Binarizer.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_GlobalHistogramBinarizer.h" -const FX_INT32 LUMINANCE_BITS = 5; -const FX_INT32 LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; -const FX_INT32 LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; -CBC_GlobalHistogramBinarizer::CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source): CBC_Binarizer(source) -{ -} -CBC_GlobalHistogramBinarizer::~CBC_GlobalHistogramBinarizer() -{ -} -CBC_CommonBitArray *CBC_GlobalHistogramBinarizer::GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) -{ - CBC_LuminanceSource *source = GetLuminanceSource(); - FX_INT32 width = source->GetWidth(); - CBC_AutoPtr result(FX_NEW CBC_CommonBitArray(width)); - InitArrays(width); - CFX_ByteArray *localLuminances = source->GetRow(y, m_luminance, e); - if (e != BCExceptionNO) { - return result.release(); - } - CFX_Int32Array localBuckets; - localBuckets.Copy(m_buckets); - FX_INT32 x; - for (x = 0; x < width; x++) { - FX_INT32 pixel = (*localLuminances)[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; - } - FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); - if (e != BCExceptionNO) { - return result.release(); - } - FX_INT32 left = (*localLuminances)[0] & 0xff; - FX_INT32 center = (*localLuminances)[1] & 0xff; - for (x = 1; x < width - 1; x++) { - FX_INT32 right = (*localLuminances)[x + 1] & 0xff; - FX_INT32 luminance = ((center << 2) - left - right) >> 1; - if (luminance < blackPoint) { - result->Set(x); - } - left = center; - center = right; - } - return result.release(); -} -CBC_CommonBitMatrix *CBC_GlobalHistogramBinarizer::GetBlackMatrix(FX_INT32 &e) -{ - CBC_LuminanceSource *source = GetLuminanceSource(); - FX_INT32 width = source->GetWidth(); - FX_INT32 height = source->GetHeight(); - CBC_CommonBitMatrix *BitMatrixTemp = FX_NEW CBC_CommonBitMatrix(); - BitMatrixTemp->Init(width, height); - CBC_AutoPtr matrix(BitMatrixTemp); - InitArrays(width); - CFX_Int32Array localBuckets; - localBuckets.Copy(m_buckets); - FX_INT32 y; - for (y = 1; y < 5; y++) { - FX_INT32 row = height * y / 5; - CFX_ByteArray *localLuminances = source->GetRow(row, m_luminance, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 right = (width << 2) / 5; - FX_INT32 x; - for (x = width / 5; x < right; x++) { - FX_INT32 pixel = (*localLuminances)[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; - } - } - FX_INT32 blackPoint = EstimateBlackPoint(localBuckets, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr localLuminances(source->GetMatrix()); - for (y = 0; y < height; y++) { - FX_INT32 offset = y * width; - for (FX_INT32 x = 0; x < width; x++) { - FX_INT32 pixel = (*localLuminances)[offset + x] & 0xff; - if (pixel < blackPoint) { - matrix->Set(x, y); - } - } - } - return matrix.release(); -} -void CBC_GlobalHistogramBinarizer::InitArrays(FX_INT32 luminanceSize) -{ - if(m_luminance.GetSize() < luminanceSize) { - m_luminance.SetSize(luminanceSize); - } - if(m_buckets.GetSize() <= 0) { - m_buckets.SetSize(LUMINANCE_BUCKETS); - } else { - FX_INT32 x; - for(x = 0; x < LUMINANCE_BUCKETS; x++) { - m_buckets[x] = 0; - } - } -} -FX_INT32 CBC_GlobalHistogramBinarizer::EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e) -{ - FX_INT32 numBuckets = buckets.GetSize(); - FX_INT32 maxBucketCount = 0; - FX_INT32 firstPeak = 0; - FX_INT32 firstPeakSize = 0; - FX_INT32 x; - for (x = 0; x < numBuckets; x++) { - if (buckets[x] > firstPeakSize) { - firstPeak = x; - firstPeakSize = buckets[x]; - } - if (buckets[x] > maxBucketCount) { - maxBucketCount = buckets[x]; - } - } - FX_INT32 secondPeak = 0; - FX_INT32 secondPeakScore = 0; - for (x = 0; x < numBuckets; x++) { - FX_INT32 distanceToBiggest = x - firstPeak; - FX_INT32 score = buckets[x] * distanceToBiggest * distanceToBiggest; - if (score > secondPeakScore) { - secondPeak = x; - secondPeakScore = score; - } - } - if (firstPeak > secondPeak) { - FX_INT32 temp = firstPeak; - firstPeak = secondPeak; - secondPeak = temp; - } - if (secondPeak - firstPeak <= numBuckets >> 4) { - e = BCExceptionRead; - return 0; - } - FX_INT32 bestValley = secondPeak - 1; - FX_INT32 bestValleyScore = -1; - for (x = secondPeak - 1; x > firstPeak; x--) { - FX_INT32 fromFirst = x - firstPeak; - FX_INT32 score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); - if (score > bestValleyScore) { - bestValley = x; - bestValleyScore = score; - } - } - return bestValley << LUMINANCE_SHIFT; -} diff --git a/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp b/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp deleted file mode 100644 index cfa953df98..0000000000 --- a/xfa/src/fxbarcode/src/BC_HighLevelEncoder.cpp +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_C40Encoder.h" -#include "include/BC_TextEncoder.h" -#include "include/BC_X12Encoder.h" -#include "include/BC_EdifactEncoder.h" -#include "include/BC_Base256Encoder.h" -#include "include/BC_ASCIIEncoder.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_UtilCodingConvert.h" -#define Integer_MAX_VALUE 2147483647 -FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; -FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; -FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; -FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; -FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; -FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; -FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; -FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; -FX_WCHAR CBC_HighLevelEncoder::PAD = 129; -FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; -FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; -const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; -const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; -const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; -CBC_HighLevelEncoder::CBC_HighLevelEncoder() -{ -} -CBC_HighLevelEncoder::~CBC_HighLevelEncoder() -{ -} -CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) -{ - CFX_ByteString bytestr; - CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); - for (FX_INT32 i = 0; i < bytestr.GetLength(); i++) { - m_bytearray.Add(bytestr.GetAt(i)); - } - return m_bytearray; -} -CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e) -{ - return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e); -} -CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e) -{ - CBC_EncoderContext context(msg, ecLevel, e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - context.setSymbolShape(shape); - context.setSizeConstraints(minSize, maxSize); - if ((msg.Mid(0, 6) == MACRO_05_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { - context.writeCodeword(MACRO_05); - context.setSkipAtEnd(2); - context.m_pos += 6; - } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { - context.writeCodeword(MACRO_06); - context.setSkipAtEnd(2); - context.m_pos += 6; - } - CFX_PtrArray encoders; - encoders.Add(FX_NEW CBC_ASCIIEncoder()); - encoders.Add(FX_NEW CBC_C40Encoder()); - encoders.Add(FX_NEW CBC_TextEncoder()); - encoders.Add(FX_NEW CBC_X12Encoder()); - encoders.Add(FX_NEW CBC_EdifactEncoder()); - encoders.Add(FX_NEW CBC_Base256Encoder()); - FX_INT32 encodingMode = ASCII_ENCODATION; - while (context.hasMoreCharacters()) { - ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e); - if (e != BCExceptionNO) { - for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { - delete (CBC_Encoder*)encoders.GetAt(i); - } - encoders.RemoveAll(); - return (FX_LPWSTR)""; - } - if (context.m_newEncoding >= 0) { - encodingMode = context.m_newEncoding; - context.resetEncoderSignal(); - } - } - FX_INT32 len = context.m_codewords.GetLength(); - context.updateSymbolInfo(e); - if (e != BCExceptionNO) { - for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { - delete (CBC_Encoder*)encoders.GetAt(i); - } - encoders.RemoveAll(); - return (FX_LPWSTR)""; - } - FX_INT32 capacity = context.m_symbolInfo->m_dataCapacity; - if (len < capacity) { - if (encodingMode != ASCII_ENCODATION && encodingMode != BASE256_ENCODATION) { - context.writeCodeword(0x00fe); - } - } - CFX_WideString codewords = context.m_codewords; - if (codewords.GetLength() < capacity) { - codewords += PAD; - } - while (codewords.GetLength() < capacity) { - codewords += (randomize253State(PAD, codewords.GetLength() + 1)); - } - for (FX_INT32 i = 0; i < encoders.GetSize(); i++) { - delete (CBC_Encoder*)encoders.GetAt(i); - } - encoders.RemoveAll(); - return codewords; -} -FX_INT32 CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode) -{ - if (startpos >= msg.GetLength()) { - return currentMode; - } - CFX_FloatArray charCounts; - if (currentMode == ASCII_ENCODATION) { - charCounts.Add(0); - charCounts.Add(1); - charCounts.Add(1); - charCounts.Add(1); - charCounts.Add(1); - charCounts.Add(1.25f); - } else { - charCounts.Add(1); - charCounts.Add(2); - charCounts.Add(2); - charCounts.Add(2); - charCounts.Add(2); - charCounts.Add(2.25f); - charCounts[currentMode] = 0; - } - FX_INT32 charsProcessed = 0; - while (TRUE) { - if ((startpos + charsProcessed) == msg.GetLength()) { - FX_DWORD min = Integer_MAX_VALUE; - CFX_ByteArray mins; - mins.SetSize(6); - CFX_Int32Array intCharCounts; - intCharCounts.SetSize(6); - min = findMinimums(charCounts, intCharCounts, min, mins); - FX_INT32 minCount = getMinimumCount(mins); - if (intCharCounts[ASCII_ENCODATION] == min) { - return ASCII_ENCODATION; - } - if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { - return BASE256_ENCODATION; - } - if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { - return EDIFACT_ENCODATION; - } - if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { - return TEXT_ENCODATION; - } - if (minCount == 1 && mins[X12_ENCODATION] > 0) { - return X12_ENCODATION; - } - return C40_ENCODATION; - } - FX_WCHAR c = msg.GetAt(startpos + charsProcessed); - charsProcessed++; - if (isDigit(c)) { - charCounts[ASCII_ENCODATION] += 0.5; - } else if (isExtendedASCII(c)) { - charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); - charCounts[ASCII_ENCODATION] += 2; - } else { - charCounts[ASCII_ENCODATION] = (FX_FLOAT) ceil(charCounts[ASCII_ENCODATION]); - charCounts[ASCII_ENCODATION]++; - } - if (isNativeC40(c)) { - charCounts[C40_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[C40_ENCODATION] += 8.0f / 3.0f; - } else { - charCounts[C40_ENCODATION] += 4.0f / 3.0f; - } - if (isNativeText(c)) { - charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; - } else { - charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; - } - if (isNativeX12(c)) { - charCounts[X12_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[X12_ENCODATION] += 13.0f / 3.0f; - } else { - charCounts[X12_ENCODATION] += 10.0f / 3.0f; - } - if (isNativeEDIFACT(c)) { - charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; - } else if (isExtendedASCII(c)) { - charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; - } else { - charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; - } - if (isSpecialB256(c)) { - charCounts[BASE256_ENCODATION] += 4; - } else { - charCounts[BASE256_ENCODATION]++; - } - if (charsProcessed >= 4) { - CFX_Int32Array intCharCounts; - intCharCounts.SetSize(6); - CFX_ByteArray mins; - mins.SetSize(6); - findMinimums(charCounts, intCharCounts, Integer_MAX_VALUE, mins); - FX_INT32 minCount = getMinimumCount(mins); - if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { - return ASCII_ENCODATION; - } - if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] - || (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + mins[EDIFACT_ENCODATION]) == 0) { - return BASE256_ENCODATION; - } - if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { - return EDIFACT_ENCODATION; - } - if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { - return TEXT_ENCODATION; - } - if (minCount == 1 && mins[X12_ENCODATION] > 0) { - return X12_ENCODATION; - } - if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[BASE256_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[EDIFACT_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { - if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { - return C40_ENCODATION; - } - if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { - FX_INT32 p = startpos + charsProcessed + 1; - while (p < msg.GetLength()) { - FX_WCHAR tc = msg.GetAt(p); - if (isX12TermSep(tc)) { - return X12_ENCODATION; - } - if (!isNativeX12(tc)) { - break; - } - p++; - } - return C40_ENCODATION; - } - } - } - } -} -FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) -{ - return ch >= '0' && ch <= '9'; -} -FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) -{ - return ch >= 128 && ch <= 255; -} -FX_INT32 CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) -{ - FX_INT32 count = 0; - FX_INT32 len = msg.GetLength(); - FX_INT32 idx = startpos; - if (idx < len) { - FX_WCHAR ch = msg.GetAt(idx); - while (isDigit(ch) && idx < len) { - count++; - idx++; - if (idx < len) { - ch = msg.GetAt(idx); - } - } - } - return count; -} -void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, FX_INT32 &e) -{ - e = BCExceptionIllegalArgument; -} -FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition) -{ - FX_INT32 pseudoRandom = ((149 * codewordPosition) % 253) + 1; - FX_INT32 tempVariable = ch + pseudoRandom; - return tempVariable <= 254 ? (FX_WCHAR) tempVariable : (FX_WCHAR) (tempVariable - 254); -} -FX_INT32 CBC_HighLevelEncoder::findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins) -{ - for (FX_INT32 l = 0; l < mins.GetSize(); l++) { - mins[l] = (FX_BYTE)0; - } - for (FX_INT32 i = 0; i < 6; i++) { - intCharCounts[i] = (FX_INT32)ceil(charCounts[i]); - FX_INT32 current = intCharCounts[i]; - if (min > current) { - min = current; - for (FX_INT32 j = 0; j < mins.GetSize(); j++) { - mins[j] = (FX_BYTE)0; - } - } - if (min == current) { - mins[i]++; - } - } - return min; -} -FX_INT32 CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray &mins) -{ - FX_INT32 minCount = 0; - for (FX_INT32 i = 0; i < 6; i++) { - minCount += mins[i]; - } - return minCount; -} -FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) -{ - return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); -} -FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) -{ - return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); -} -FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) -{ - return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); -} -FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) -{ - return (ch == '\r') || (ch == '*') || (ch == '>'); -} -FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) -{ - return ch >= ' ' && ch <= '^'; -} -FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) -{ - return FALSE; -} diff --git a/xfa/src/fxbarcode/src/BC_Library.cpp b/xfa/src/fxbarcode/src/BC_Library.cpp deleted file mode 100644 index 5b12609517..0000000000 --- a/xfa/src/fxbarcode/src/BC_Library.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_UtilCodingConvert.h" -#include "include/BC_DataMatrixVersion.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_BufferedImageLuminanceSource.h" -#include "include/BC_Binarizer.h" -#include "include/BC_GlobalHistogramBinarizer.h" -#include "include/BC_OnedCode128Reader.h" -#include "include/BC_OnedCode39Reader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_OnedEAN13Reader.h" -#include "include/BC_OnedEAN8Reader.h" -#include "include/BC_OnedUPCAReader.h" -#include "include/BC_OnedCodaBarReader.h" -#include "include/BC_DataMatrixReader.h" -#include "include/BC_QRCodeReader.h" -#include "include/BC_Writer.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedCode128Writer.h" -#include "include/BC_OnedCode39Writer.h" -#include "include/BC_OnedEAN13Writer.h" -#include "include/BC_OnedEAN8Writer.h" -#include "include/BC_OnedUPCAWriter.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRCodeWriter.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoderMode.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_QRDataMask.h" -#include "include/BC_QRDecodedBitStreamParser.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_Encoder.h" -#include "include/BC_DefaultPlacement.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_DataMatrixSymbolInfo144.h" -#include "include/BC_ErrorCorrection.h" -#include "include/BC_Dimension.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_C40Encoder.h" -#include "include/BC_TextEncoder.h" -#include "include/BC_X12Encoder.h" -#include "include/BC_EdifactEncoder.h" -#include "include/BC_Base256Encoder.h" -#include "include/BC_ASCIIEncoder.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_DataMatrixWriter.h" -#include "include/BC_PDF417Compaction.h" -#include "include/BC_UtilCodingConvert.h" -#include "include/BC_PDF417HighLevelEncoder.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_PDF417Detector.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_DecoderResult.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417BarcodeValue.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -#include "include/BC_PDF417DetectionResult.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417CodewordDecoder.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECErrorCorrection.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_PDF417ScanningDecoder.h" -#include "include/BC_PDF417Reader.h" -void BC_Library_Init() -{ - CBC_QRCoderErrorCorrectionLevel::Initialize(); - CBC_QRCoderMode::Initialize(); - CBC_QRCoderVersion::Initialize(); - CBC_QRDataMask::Initialize(); - CBC_ReedSolomonGF256::Initialize(); - CBC_DataMatrixVersion::Initialize(); - CBC_SymbolInfo::Initialize(); - CBC_ErrorCorrection::Initialize(); - CBC_PDF417HighLevelEncoder::Initialize(); - FX_INT32 e = 0; - CBC_PDF417ECModulusGF::Initialize(e); - CBC_DecodedBitStreamPaser::Initialize(); - CBC_PDF417CodewordDecoder::Initialize(); - CBC_PDF417ECErrorCorrection::Initialize(e); - CBC_PDF417ScanningDecoder::Initialize(); -} -void BC_Library_Destory() -{ - CBC_QRCoderErrorCorrectionLevel::Finalize(); - CBC_QRCoderMode::Finalize(); - CBC_QRCoderVersion::Finalize(); - CBC_QRDataMask::Finalize(); - CBC_ReedSolomonGF256::Finalize(); - CBC_DataMatrixVersion::Finalize(); - CBC_SymbolInfo::Finalize(); - CBC_ErrorCorrection::Finalize(); - CBC_PDF417HighLevelEncoder::Finalize(); - CBC_DecodedBitStreamPaser::Finalize(); - CBC_PDF417CodewordDecoder::Finalize(); - CBC_PDF417ECErrorCorrection::Finalize(); - CBC_PDF417ECModulusGF::Finalize(); - CBC_PDF417ScanningDecoder::Finalize(); -} diff --git a/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp b/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp deleted file mode 100644 index 675d51b364..0000000000 --- a/xfa/src/fxbarcode/src/BC_LuminanceSource.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_LuminanceSource.h" -CBC_LuminanceSource::CBC_LuminanceSource(FX_INT32 width, FX_INT32 height): m_width(width), m_height(height) -{ -} -CBC_LuminanceSource::~CBC_LuminanceSource() -{ -} -FX_INT32 CBC_LuminanceSource::GetWidth() -{ - return m_width; -} -FX_INT32 CBC_LuminanceSource::GetHeight() -{ - return m_height; -} diff --git a/xfa/src/fxbarcode/src/BC_OneDReader.cpp b/xfa/src/fxbarcode/src/BC_OneDReader.cpp deleted file mode 100644 index c26e4fd253..0000000000 --- a/xfa/src/fxbarcode/src/BC_OneDReader.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitArray.h" -const FX_INT32 CBC_OneDReader::INTEGER_MATH_SHIFT = 8; -const FX_INT32 CBC_OneDReader::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << 8; -CBC_OneDReader::CBC_OneDReader() -{ -} -CBC_OneDReader::~CBC_OneDReader() -{ -} -CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) -{ - CFX_ByteString strtemp = Decode(image, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return strtemp; -} -CFX_ByteString CBC_OneDReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString strtemp = DeDecode(image, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return strtemp; -} -CFX_ByteString CBC_OneDReader::DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - FX_INT32 width = image->GetWidth(); - FX_INT32 height = image->GetHeight(); - CBC_CommonBitArray *row = NULL; - FX_INT32 middle = height >> 1; - FX_BOOL tryHarder = FALSE; - FX_INT32 rowStep = FX_MAX(1, height >> (tryHarder ? 8 : 5)); - FX_INT32 maxLines; - if (tryHarder) { - maxLines = height; - } else { - maxLines = 15; - } - for (FX_INT32 x = 0; x < maxLines; x++) { - FX_INT32 rowStepsAboveOrBelow = (x + 1) >> 1; - FX_BOOL isAbove = (x & 0x01) == 0; - FX_INT32 rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); - if (rowNumber < 0 || rowNumber >= height) { - break; - } - row = image->GetBlackRow(rowNumber, NULL, e); - if (e != BCExceptionNO) { - e = BCExceptionNO; - if(row != NULL) { - delete row; - row = NULL; - } - continue; - } - for (FX_INT32 attempt = 0; attempt < 2; attempt++) { - if (attempt == 1) { - row->Reverse(); - } - CFX_ByteString result = DecodeRow(rowNumber, row, hints, e); - if (e != BCExceptionNO) { - e = BCExceptionNO; - continue; - } - if(row != NULL) { - delete row; - row = NULL; - } - return result; - } - if(row != NULL) { - delete row; - row = NULL; - } - } - e = BCExceptionNotFound; - return ""; -} -void CBC_OneDReader::RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) -{ - FX_INT32 numCounters = counters->GetSize(); - for (FX_INT32 i = 0; i < numCounters; i++) { - (*counters)[i] = 0; - } - FX_INT32 end = row->GetSize(); - if (start >= end) { - e = BCExceptionNotFound; - return; - } - FX_BOOL isWhite = !row->Get(start); - FX_INT32 counterPosition = 0; - FX_INT32 j = start; - while (j < end) { - FX_BOOL pixel = row->Get(j); - if (pixel ^ isWhite) { - (*counters)[counterPosition]++; - } else { - counterPosition++; - if (counterPosition == numCounters) { - break; - } else { - (*counters)[counterPosition] = 1; - isWhite = !isWhite; - } - } - j++; - } - if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && j == end))) { - e = BCExceptionNotFound; - return; - } -} -void CBC_OneDReader::RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e) -{ - FX_INT32 numTransitionsLeft = counters->GetSize(); - FX_BOOL last = row->Get(start); - while (start > 0 && numTransitionsLeft >= 0) { - if (row->Get(--start) != last) { - numTransitionsLeft--; - last = !last; - } - } - if (numTransitionsLeft >= 0) { - e = BCExceptionNotFound; - return; - } - RecordPattern(row, start + 1, counters, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -FX_INT32 CBC_OneDReader::PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance) -{ - FX_INT32 numCounters = counters->GetSize(); - FX_INT32 total = 0; - FX_INT32 patternLength = 0; - for (FX_INT32 i = 0; i < numCounters; i++) { - total += (*counters)[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { -#undef max - return FXSYS_IntMax; - } - FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; - maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; - FX_INT32 totalVariance = 0; - for (FX_INT32 x = 0; x < numCounters; x++) { - FX_INT32 counter = (*counters)[x] << INTEGER_MATH_SHIFT; - FX_INT32 scaledPattern = pattern[x] * unitBarWidth; - FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { -#undef max - return FXSYS_IntMax; - } - totalVariance += variance; - } - return totalVariance / total; -} diff --git a/xfa/src/fxbarcode/src/BC_OneDimReader.cpp b/xfa/src/fxbarcode/src/BC_OneDimReader.cpp deleted file mode 100644 index 9855244f42..0000000000 --- a/xfa/src/fxbarcode/src/BC_OneDimReader.cpp +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OneDimReader.h" -const FX_INT32 CBC_OneDimReader::MAX_AVG_VARIANCE = (FX_INT32)(256 * 0.48f); -const FX_INT32 CBC_OneDimReader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32)(256 * 0.7f); -const FX_INT32 CBC_OneDimReader::START_END_PATTERN[3] = {1, 1, 1}; -const FX_INT32 CBC_OneDimReader::MIDDLE_PATTERN[5] = {1, 1, 1, 1, 1}; -const FX_INT32 CBC_OneDimReader::L_PATTERNS[10][4] = { - {3, 2, 1, 1}, - {2, 2, 2, 1}, - {2, 1, 2, 2}, - {1, 4, 1, 1}, - {1, 1, 3, 2}, - {1, 2, 3, 1}, - {1, 1, 1, 4}, - {1, 3, 1, 2}, - {1, 2, 1, 3}, - {3, 1, 1, 2} -}; -const FX_INT32 CBC_OneDimReader::L_AND_G_PATTERNS[20][4] = { - {3, 2, 1, 1}, - {2, 2, 2, 1}, - {2, 1, 2, 2}, - {1, 4, 1, 1}, - {1, 1, 3, 2}, - {1, 2, 3, 1}, - {1, 1, 1, 4}, - {1, 3, 1, 2}, - {1, 2, 1, 3}, - {3, 1, 1, 2}, - {1, 1, 2, 3}, - {1, 2, 2, 2}, - {2, 2, 1, 2}, - {1, 1, 4, 1}, - {2, 3, 1, 1}, - {1, 3, 2, 1}, - {4, 1, 1, 1}, - {2, 1, 3, 1}, - {3, 1, 2, 1}, - {2, 1, 1, 3} -}; -CBC_OneDimReader::CBC_OneDimReader() -{ -} -CBC_OneDimReader::~CBC_OneDimReader() -{ -} -CFX_Int32Array *CBC_OneDimReader::FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e) -{ - FX_BOOL foundStart = FALSE; - CFX_Int32Array *startRange = NULL; - CFX_Int32Array startEndPattern; - startEndPattern.SetSize(3); - startEndPattern[0] = START_END_PATTERN[0]; - startEndPattern[1] = START_END_PATTERN[1]; - startEndPattern[2] = START_END_PATTERN[2]; - FX_INT32 nextStart = 0; - while (!foundStart) { - if(startRange != NULL) { - delete startRange; - startRange = NULL; - } - startRange = FindGuardPattern(row, nextStart, FALSE, &startEndPattern, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 start = (*startRange)[0]; - nextStart = (*startRange)[1]; - if (start <= 1) { - break; - } - FX_INT32 quietStart = start - (nextStart - start); - if (quietStart >= 0) { - FX_BOOL booT = row->IsRange(quietStart, start, FALSE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - foundStart = booT; - } - } - return startRange; -} -CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) -{ - CFX_Int32Array* StartPattern = FindStartGuardPattern(row, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr result(StartPattern); - CFX_ByteString temp = DecodeRow(rowNumber, row, result.get(), hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return temp; -} -CFX_ByteString CBC_OneDimReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString result; - FX_INT32 endStart = DecodeMiddle(row, startGuardRange, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - FX_BOOL b = CheckChecksum(result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - if (!b) { - e = BCExceptionChecksumException; - return ""; - } - return result; -} -FX_BOOL CBC_OneDimReader::CheckChecksum(CFX_ByteString &s, FX_INT32 &e) -{ - FX_BOOL temp = CheckStandardUPCEANChecksum(s, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - return temp; -} -FX_BOOL CBC_OneDimReader::CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e) -{ - FX_INT32 length = s.GetLength(); - if (length == 0) { - return FALSE; - } - FX_INT32 sum = 0; - for (FX_INT32 i = length - 2; i >= 0; i -= 2) { - FX_INT32 digit = (FX_INT32) s[i] - (FX_INT32) '0'; - if (digit < 0 || digit > 9) { - e = BCExceptionFormatException; - return FALSE; - } - sum += digit; - } - sum *= 3; - for (FX_INT32 j = length - 1; j >= 0; j -= 2) { - FX_INT32 digit = (FX_INT32) s[j] - (FX_INT32) '0'; - if (digit < 0 || digit > 9) { - e = BCExceptionFormatException; - return FALSE; - } - sum += digit; - } - return sum % 10 == 0; -} -CFX_Int32Array *CBC_OneDimReader::DecodeEnd(CBC_CommonBitArray* row, FX_INT32 endStart, FX_INT32 &e) -{ - CFX_Int32Array startEndPattern; - startEndPattern.Add(START_END_PATTERN[0]); - startEndPattern.Add(START_END_PATTERN[1]); - startEndPattern.Add(START_END_PATTERN[2]); - CFX_Int32Array* FindGuard = FindGuardPattern(row, endStart, FALSE, &startEndPattern, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return FindGuard; -} -CFX_Int32Array *CBC_OneDimReader::FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e) -{ - FX_INT32 patternLength = pattern->GetSize(); - CFX_Int32Array counters; - counters.SetSize(patternLength); - FX_INT32 width = row->GetSize(); - FX_BOOL isWhite = FALSE; - while (rowOffset < width) { - isWhite = !row->Get(rowOffset); - if (whiteFirst == isWhite) { - break; - } - rowOffset++; - } - FX_INT32 counterPosition = 0; - FX_INT32 patternStart = rowOffset; - for (FX_INT32 x = rowOffset; x < width; x++) { - FX_BOOL pixel = row->Get(x); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (PatternMatchVariance(&counters, &(*pattern)[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - CFX_Int32Array *result = FX_NEW CFX_Int32Array(); - result->SetSize(2); - (*result)[0] = patternStart; - (*result)[1] = x; - return result; - } - patternStart += counters[0] + counters[1]; - for (FX_INT32 y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return NULL; -} -FX_INT32 CBC_OneDimReader::DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e) -{ - RecordPattern(row, rowOffset, counters, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - FX_INT32 bestVariance = MAX_AVG_VARIANCE; - FX_INT32 bestMatch = -1; - FX_INT32 max = patternLength; - for (FX_INT32 i = 0; i < max; i++) { - FX_INT32 variance = PatternMatchVariance(counters, &patterns[i * 4], MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - e = BCExceptionNotFound; - return 0; - } - return 0; -} diff --git a/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp b/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp deleted file mode 100644 index b71ec79bcc..0000000000 --- a/xfa/src/fxbarcode/src/BC_OneDimWriter.cpp +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_OneDimWriter.h" -CBC_OneDimWriter::CBC_OneDimWriter() -{ - m_locTextLoc = BC_TEXT_LOC_BELOWEMBED; - m_bPrintChecksum = TRUE; - m_iDataLenth = 0; - m_bCalcChecksum = FALSE; - m_pFont = NULL; - m_fFontSize = 10; ; - m_iFontStyle = 0; - m_fontColor = 0xff000000; - m_iContentLen = 0; - m_bLeftPadding = FALSE; - m_bRightPadding = FALSE; - m_output = NULL; -} -CBC_OneDimWriter::~CBC_OneDimWriter() -{ - if (m_output != NULL) { - delete m_output; - m_output = NULL; - } -} -void CBC_OneDimWriter::SetPrintChecksum(FX_BOOL checksum) -{ - m_bPrintChecksum = checksum; -} -void CBC_OneDimWriter::SetDataLength(FX_INT32 length) -{ - m_iDataLenth = length; -} -void CBC_OneDimWriter::SetCalcChecksum(FX_INT32 state) -{ - m_bCalcChecksum = state; -} -FX_BOOL CBC_OneDimWriter::SetFont(CFX_Font * cFont) -{ - if (cFont == NULL) { - return FALSE; - } - m_pFont = cFont; - return TRUE; -} -void CBC_OneDimWriter::SetFontSize(FX_FLOAT size) -{ - m_fFontSize = size; -} -void CBC_OneDimWriter::SetFontStyle(FX_INT32 style) -{ - m_iFontStyle = style; -} -void CBC_OneDimWriter::SetFontColor(FX_ARGB color) -{ - m_fontColor = color; -} -FX_WCHAR CBC_OneDimWriter::Upper(FX_WCHAR ch) -{ - if(ch >= 'a' && ch <= 'z') { - ch = ch - ('a' - 'A'); - } - return ch; -} -FX_BYTE* CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - FX_BYTE *ret = NULL; - outHeight = 1; - if (m_Width >= 20) { - ret = Encode(contents, outWidth, e); - } else { - ret = Encode(contents, outWidth, e); - } - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OneDimWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_INT32 CBC_OneDimWriter::AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern , FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e) -{ - if (startColor != 0 && startColor != 1) { - e = BCExceptionValueMustBeEither0or1; - return 0; - } - FX_BYTE color = (FX_BYTE) startColor; - FX_INT32 numAdded = 0; - for (FX_INT32 i = 0; i < patternLength; i++) { - for (FX_INT32 j = 0; j < pattern[i]; j++) { - target[pos] = color; - pos += 1; - numAdded += 1; - } - color ^= 1; - } - return numAdded; -} -void CBC_OneDimWriter::CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen) -{ -#ifdef FXFM_ENCODING_NONE - IFX_FontEncodingEx* encoding = FX_CreateFontEncodingEx(cFont); -#else - IFX_FontEncoding * encoding = FXGE_CreateUnicodeEncoding(cFont); -#endif - FX_INT32 length = text.GetLength(); - FX_DWORD *pCharCode = FX_Alloc(FX_DWORD, text.GetLength()); - FX_FLOAT charWidth = 0; - for (FX_INT32 j = 0; j < text.GetLength(); j++) { - pCharCode[j] = encoding->CharCodeFromUnicode(text[j]); - FX_INT32 glyp_code = encoding->GlyphFromCharCode(pCharCode[j]); - FX_INT32 glyp_value = cFont->GetGlyphWidth(glyp_code); - FX_FLOAT temp = (FX_FLOAT)((glyp_value) * fontSize / 1000.0); - charWidth += temp; - } - charsLen = charWidth; - FX_FLOAT leftPositon = (FX_FLOAT)(geWidth - charsLen) / 2.0f; - if (leftPositon < 0 && geWidth == 0) { - leftPositon = 0; - } - FX_FLOAT penX = 0.0; - FX_FLOAT penY = (FX_FLOAT)FXSYS_abs(cFont->GetDescent()) * (FX_FLOAT)fontSize / 1000.0f; - FX_FLOAT left = leftPositon; - FX_FLOAT top = 0.0; - charPos[0].m_OriginX = penX + left; - charPos[0].m_OriginY = penY + top; - charPos[0].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[0]); - charPos[0].m_FontCharWidth = cFont->GetGlyphWidth(charPos[0].m_GlyphIndex); -#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ - charPos[0].m_ExtGID = charPos[0].m_GlyphIndex; -#endif - penX += (FX_FLOAT)(charPos[0].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; - for (FX_INT32 i = 1; i < length; i++) { - charPos[i].m_OriginX = penX + left; - charPos[i].m_OriginY = penY + top; - charPos[i].m_GlyphIndex = encoding->GlyphFromCharCode(pCharCode[i]); - charPos[i].m_FontCharWidth = cFont->GetGlyphWidth(charPos[i].m_GlyphIndex); -#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ - charPos[i].m_ExtGID = charPos[i].m_GlyphIndex; -#endif - penX += (FX_FLOAT)(charPos[i].m_FontCharWidth) * (FX_FLOAT)fontSize / 1000.0f; - } - FX_Free (pCharCode); - delete encoding; - encoding = NULL; -} -void CBC_OneDimWriter::ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) -{ - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - CFX_FloatRect rect((FX_FLOAT)locX, (FX_FLOAT)locY, (FX_FLOAT)(locX + geWidth), (FX_FLOAT)(locY + iTextHeight)); - if (geWidth != m_Width) { - rect.right -= 1; - } - matrix->TransformRect(rect); - FX_RECT re = rect.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - CFX_Matrix affine_matrix(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)locX, (FX_FLOAT)(locY + iFontSize)); - if (matrix != NULL) { - affine_matrix.Concat(*matrix); - } - FX_BOOL ret = device->DrawNormalText(str.GetLength(), - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize, - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); -} -void CBC_OneDimWriter::ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth) -{ - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - CFX_FxgeDevice ge; - ge.Create((int)geWidth, iTextHeight , m_colorSpace); - FX_RECT geRect(0, 0, (int)geWidth, iTextHeight); - ge.FillRect(&geRect, m_backgroundColor); - CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); - FX_BOOL ret = ge.DrawNormalText(str.GetLength(), - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize, - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - CFX_FxgeDevice geBitmap; - geBitmap.Attach(pOutBitmap); - geBitmap.SetDIBits(ge.GetBitmap(), (int)locX, (int)locY); -} -void CBC_OneDimWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) -{ - if (device == NULL && pOutBitmap == NULL) { - e = BCExceptionIllegalArgument; - return; - } - if (m_pFont == NULL) { - e = BCExceptionNullPointer; - return; - } - CFX_ByteString str = FX_UTF8Encode(contents); - FX_INT32 iLen = str.GetLength(); - FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); - if (!pCharPos) { - return; - } - FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); - FX_FLOAT charsLen = 0; - FX_FLOAT geWidth = 0; - if ( m_locTextLoc == BC_TEXT_LOC_ABOVEEMBED || - m_locTextLoc == BC_TEXT_LOC_BELOWEMBED ) { - geWidth = 0; - } else if ( m_locTextLoc == BC_TEXT_LOC_ABOVE || - m_locTextLoc == BC_TEXT_LOC_BELOW ) { - geWidth = (FX_FLOAT)barWidth; - } - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - CalcTextInfo(str, pCharPos, m_pFont, geWidth, iFontSize, charsLen); - if (charsLen < 1) { - return; - } - FX_INT32 locX = 0; - FX_INT32 locY = 0; - switch (m_locTextLoc) { - case BC_TEXT_LOC_ABOVEEMBED: - locX = (FX_INT32)(barWidth - charsLen) / 2; - locY = 0; - geWidth = charsLen; - break; - case BC_TEXT_LOC_ABOVE: - locX = 0; - locY = 0; - geWidth = (FX_FLOAT)barWidth; - break; - case BC_TEXT_LOC_BELOWEMBED: - locX = (FX_INT32)(barWidth - charsLen) / 2; - locY = m_Height - iTextHeight; - geWidth = charsLen; - break; - case BC_TEXT_LOC_BELOW: - default: - locX = 0; - locY = m_Height - iTextHeight; - geWidth = (FX_FLOAT)barWidth; - break; - } - if (device != NULL) { - ShowDeviceChars(device, matrix, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); - } else { - ShowBitmapChars(pOutBitmap, str, geWidth, pCharPos, (FX_FLOAT)locX, (FX_FLOAT)locY, barWidth); - } - FX_Free(pCharPos); -} -void CBC_OneDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e) -{ - if (m_output == NULL) { - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); - pOutBitmap->Clear(m_backgroundColor); - if (!pOutBitmap) { - e = BCExceptionFailToCreateBitmap; - return; - } - for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { - for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { - if (m_output->Get(x, y)) { - pOutBitmap->SetPixel(x, y, m_barColor); - } - } - } - FX_INT32 i = 0; - for (; i < contents.GetLength(); i++) - if (contents.GetAt(i) != ' ') { - break; - } - if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { - ShowChars(contents, pOutBitmap, NULL, NULL, m_barWidth, m_multiple, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); - if (pOutBitmap) { - delete pOutBitmap; - } - pOutBitmap = pStretchBitmap; -} -void CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e) -{ - if (m_output == NULL) { - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - CFX_GraphStateData stateData; - CFX_PathData path; - path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); - device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); - CFX_Matrix matri(m_outputHScale, 0.0, 0.0, (FX_FLOAT)m_Height, 0.0, 0.0); - matri.Concat(*matrix); - for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { - for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { - CFX_PathData rect; - rect.AppendRect((FX_FLOAT)x, (FX_FLOAT)y, (FX_FLOAT)(x + 1), (FX_FLOAT)(y + 1)); - CFX_GraphStateData stateData; - if (m_output->Get(x, y)) { - device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); - } - } - } - FX_INT32 i = 0; - for (; i < contents.GetLength(); i++) - if (contents.GetAt(i) != ' ') { - break; - } - if (m_locTextLoc != BC_TEXT_LOC_NONE && i < contents.GetLength()) { - ShowChars(contents, NULL, device, matrix, m_barWidth, m_multiple, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_OneDimWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - if (codeLength < 1) { - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if (m_ModuleHeight < 20.0) { - m_ModuleHeight = 20; - } - FX_INT32 codeOldLength = codeLength; - FX_INT32 leftPadding = 0; - FX_INT32 rightPadding = 0; - if (m_bLeftPadding) { - leftPadding = 7; - } - if (m_bRightPadding) { - rightPadding = 7; - } - codeLength += leftPadding; - codeLength += rightPadding; - m_outputHScale = 1.0; - if (m_Width > 0) { - m_outputHScale = (FX_FLOAT)m_Width / (FX_FLOAT)codeLength; - } - if (!isDevice) { - m_outputHScale = FX_MAX(m_outputHScale, m_ModuleWidth); - } - FX_FLOAT dataLengthScale = 1.0; - if (m_iDataLenth > 0 && contents.GetLength() != 0) { - dataLengthScale = FX_FLOAT(contents.GetLength()) / FX_FLOAT(m_iDataLenth); - } - if (m_iDataLenth > 0 && contents.GetLength() == 0) { - dataLengthScale = FX_FLOAT(1) / FX_FLOAT(m_iDataLenth); - } - m_multiple = 1; - if (!isDevice) { - m_multiple = (FX_INT32)ceil(m_outputHScale * dataLengthScale); - } - FX_INT32 outputHeight = 1; - if (!isDevice) { - if (m_Height == 0) { - outputHeight = FX_MAX(20, m_ModuleHeight); - } else { - outputHeight = m_Height; - } - } - FX_INT32 outputWidth = codeLength; - if (!isDevice) { - outputWidth = (FX_INT32)(codeLength * m_multiple / dataLengthScale); - } - m_barWidth = m_Width; - if (!isDevice) { - m_barWidth = codeLength * m_multiple; - } - m_output = FX_NEW CBC_CommonBitMatrix; - m_output->Init(outputWidth, outputHeight); - FX_INT32 outputX = leftPadding * m_multiple; - for (FX_INT32 inputX = 0; inputX < codeOldLength; inputX++) { - if (code[inputX] == 1) { - if (outputX >= outputWidth ) { - break; - } - if (outputX + m_multiple > outputWidth && outputWidth - outputX > 0) { - m_output->SetRegion(outputX, 0, outputWidth - outputX , outputHeight, e); - break; - } - m_output->SetRegion(outputX, 0, m_multiple, outputHeight, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - outputX += m_multiple; - } -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp b/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp deleted file mode 100644 index abe0dfb94e..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCodaBarReader.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OnedCode39Reader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OnedCodaBarReader.h" -FX_LPCSTR CBC_OnedCodaBarReader::ALPHABET_STRING = "0123456789-$:/.+ABCDTN"; -const FX_INT32 CBC_OnedCodaBarReader::CHARACTER_ENCODINGS[22] = { - 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, - 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, - 0x01A, 0x029 -}; -const FX_INT32 CBC_OnedCodaBarReader::minCharacterLength = 3; -const FX_CHAR CBC_OnedCodaBarReader::STARTEND_ENCODING[8] = {'E', '*', 'A', 'B', 'C', 'D', 'T', 'N'}; -CBC_OnedCodaBarReader::CBC_OnedCodaBarReader() -{ -} -CBC_OnedCodaBarReader::~CBC_OnedCodaBarReader() -{ -} -CFX_ByteString CBC_OnedCodaBarReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) -{ - CFX_Int32Array *int32Ptr = FindAsteriskPattern(row, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr start(int32Ptr); - (*start)[1] = 0; - FX_INT32 nextStart = (*start)[1]; - FX_INT32 end = row->GetSize(); - while (nextStart < end && !row->Get(nextStart)) { - nextStart++; - } - CFX_ByteString result; - CFX_Int32Array counters; - counters.SetSize(7); - FX_CHAR decodedChar; - FX_INT32 lastStart; - do { - RecordPattern(row, nextStart, &counters, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - decodedChar = ToNarrowWidePattern(&counters); - if (decodedChar == '!') { - e = BCExceptionNotFound; - return ""; - } - result += decodedChar; - lastStart = nextStart; - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - nextStart += counters[i]; - } - while (nextStart < end && !row->Get(nextStart)) { - nextStart++; - } - } while (nextStart < end); - FX_INT32 lastPatternSize = 0; - for (FX_INT32 j = 0; j < counters.GetSize(); j++) { - lastPatternSize += counters[j]; - } - FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; - if (nextStart != end && (whiteSpaceAfterEnd / 2 < lastPatternSize)) { - e = BCExceptionNotFound; - return ""; - } - if (result.GetLength() < 2) { - e = BCExceptionNotFound; - return ""; - } - FX_CHAR startchar = result[0]; - if (!ArrayContains(STARTEND_ENCODING, startchar)) { - e = BCExceptionNotFound; - return ""; - } - FX_INT32 len = result.GetLength(); - CFX_ByteString temp = result; - for (FX_INT32 k = 1; k < result.GetLength(); k++) { - if (ArrayContains(STARTEND_ENCODING, result[k])) { - if ((k + 1) != result.GetLength()) { - result.Delete(1, k); - k = 1; - } - } - } - if (result.GetLength() < 5) { - FX_INT32 index = temp.Find(result.Mid(1, result.GetLength() - 1)); - if (index == len - (result.GetLength() - 1)) { - e = BCExceptionNotFound; - return ""; - } - } - if (result.GetLength() > minCharacterLength) { - result = result.Mid(1, result.GetLength() - 2); - } else { - e = BCExceptionNotFound; - return ""; - } - return result; -} -CFX_Int32Array *CBC_OnedCodaBarReader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) -{ - FX_INT32 width = row->GetSize(); - FX_INT32 rowOffset = 0; - while (rowOffset < width) { - if (row->Get(rowOffset)) { - break; - } - rowOffset++; - } - FX_INT32 counterPosition = 0; - CFX_Int32Array counters; - counters.SetSize(7); - FX_INT32 patternStart = rowOffset; - FX_BOOL isWhite = FALSE; - FX_INT32 patternLength = counters.GetSize(); - for (FX_INT32 i = rowOffset; i < width; i++) { - FX_BOOL pixel = row->Get(i); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (ArrayContains(STARTEND_ENCODING, ToNarrowWidePattern(&counters))) { - FX_BOOL btemp3 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (btemp3) { - CFX_Int32Array *result = FX_NEW CFX_Int32Array(); - result->SetSize(2); - (*result)[0] = patternStart; - (*result)[1] = i; - return result; - } - } - patternStart += counters[0] + counters[1]; - for (FX_INT32 y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - e = BCExceptionNotFound; - return NULL; -} -FX_BOOL CBC_OnedCodaBarReader::ArrayContains(const FX_CHAR array[], FX_CHAR key) -{ - for(FX_INT32 i = 0; i < 8; i++) { - if(array[i] == key) { - return TRUE; - } - } - return FALSE; -} -FX_CHAR CBC_OnedCodaBarReader::ToNarrowWidePattern(CFX_Int32Array *counter) -{ - FX_INT32 numCounters = counter->GetSize(); - if (numCounters < 1) { - return '!'; - } - FX_INT32 averageCounter = 0; - FX_INT32 totalCounters = 0; - for (FX_INT32 i = 0; i < numCounters; i++) { - totalCounters += (*counter)[i]; - } - averageCounter = totalCounters / numCounters; - FX_INT32 pattern = 0; - FX_INT32 wideCounters = 0; - for (FX_INT32 j = 0; j < numCounters; j++) { - if ((*counter)[j] > averageCounter) { - pattern |= 1 << (numCounters - 1 - j); - wideCounters++; - } - } - if ((wideCounters == 2) || (wideCounters == 3)) { - for (FX_INT32 k = 0; k < 22; k++) { - if (CHARACTER_ENCODINGS[k] == pattern) { - return (ALPHABET_STRING)[k]; - } - } - } - return '!'; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp b/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp deleted file mode 100644 index 08eac25b79..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCodaBarWriter.cpp +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedCodaBarReader.h" -#include "include/BC_OnedCodaBarWriter.h" -#include "include/BC_CommonBitMatrix.h" -const FX_CHAR CBC_OnedCodaBarWriter::START_END_CHARS[] = {'A', 'B', 'C', 'D', 'T', 'N', '*', 'E', 'a', 'b', 'c', 'd', 't', 'n', 'e'}; -const FX_CHAR CBC_OnedCodaBarWriter::CONTENT_CHARS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '$', '/', ':', '+', '.'}; -CBC_OnedCodaBarWriter::CBC_OnedCodaBarWriter() -{ - m_chStart = 'A'; - m_chEnd = 'B'; - m_iWideNarrRatio = 2; -} -CBC_OnedCodaBarWriter::~CBC_OnedCodaBarWriter() -{ -} -FX_BOOL CBC_OnedCodaBarWriter::SetStartChar(FX_CHAR start) -{ - for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { - if (START_END_CHARS[i] == start) { - m_chStart = start; - return TRUE; - } - } - return FALSE; -} -FX_BOOL CBC_OnedCodaBarWriter::SetEndChar(FX_CHAR end) -{ - for (FX_INT32 i = 0; i < sizeof(START_END_CHARS) / sizeof(FX_CHAR); i++) { - if (START_END_CHARS[i] == end) { - m_chEnd = end; - return TRUE; - } - } - return FALSE; -} -void CBC_OnedCodaBarWriter::SetDataLength(FX_INT32 length) -{ - m_iDataLenth = length + 2; -} -FX_BOOL CBC_OnedCodaBarWriter::SetTextLocation(BC_TEXT_LOC location) -{ - if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { - return FALSE; - } - m_locTextLoc = location; - return TRUE; -} -FX_BOOL CBC_OnedCodaBarWriter::SetWideNarrowRatio(FX_INT32 ratio) -{ - if(ratio < 2 || ratio > 3) { - return FALSE; - } - m_iWideNarrRatio = ratio; - return TRUE; -} -FX_BOOL CBC_OnedCodaBarWriter::FindChar(FX_WCHAR ch, FX_BOOL isContent) -{ - if(isContent) { - for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { - if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { - return TRUE; - } - } - for(FX_INT32 j = 0 ; j < sizeof(START_END_CHARS) / sizeof(FX_CHAR) ; j++) { - if(ch == (FX_WCHAR)START_END_CHARS[j]) { - return TRUE; - } - } - return FALSE; - } else { - for(FX_INT32 i = 0 ; i < sizeof(CONTENT_CHARS) / sizeof(FX_CHAR) ; i++) { - if(ch == (FX_WCHAR)CONTENT_CHARS[i]) { - return TRUE; - } - } - return FALSE; - } -} -FX_BOOL CBC_OnedCodaBarWriter::CheckContentValidity(FX_WSTR contents) -{ - FX_WCHAR ch; - FX_INT32 index = 0; - for (index = 0; index < contents.GetLength(); index++) { - ch = contents.GetAt(index); - if (FindChar(ch, FALSE)) { - continue; - } else { - return FALSE; - } - } - return TRUE; -} -CFX_WideString CBC_OnedCodaBarWriter::FilterContents(FX_WSTR contents) -{ - CFX_WideString filtercontents; - FX_WCHAR ch; - for (FX_INT32 index = 0; index < contents.GetLength(); index ++) { - ch = contents.GetAt(index); - if(ch > 175) { - index++; - continue; - } - if (FindChar(ch, TRUE)) { - filtercontents += ch; - } else { - continue; - } - } - return filtercontents; -} -FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - if(format != BCFORMAT_CODABAR) { - e = BCExceptionOnlyEncodeCODEBAR; - return NULL; - } - FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE* CBC_OnedCodaBarWriter::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) -{ - CBC_OnedCodaBarReader CodaBarR; - CFX_ByteString data = m_chStart + contents + m_chEnd; - m_iContentLen = data.GetLength(); - FX_BYTE *result = FX_Alloc(FX_BYTE, m_iWideNarrRatio * 7 * data.GetLength()); - FX_CHAR ch; - FX_INT32 position = 0; - for (FX_INT32 index = 0; index < data.GetLength(); index++) { - ch = data.GetAt(index); - if (((ch >= 'a') && (ch <= 'z'))) { - ch = ch - 32; - } - switch (ch) { - case 'T': - ch = 'A'; - break; - case 'N': - ch = 'B'; - break; - case '*': - ch = 'C'; - break; - case 'E': - ch = 'D'; - break; - default: - break; - } - FX_INT32 code = 0; - FX_INT32 len = (FX_INT32)strlen(CodaBarR.ALPHABET_STRING); - for (FX_INT32 i = 0; i < len; i++) { - if (ch == CodaBarR.ALPHABET_STRING[i]) { - code = CodaBarR.CHARACTER_ENCODINGS[i]; - break; - } - } - FX_BYTE color = 1; - FX_INT32 counter = 0; - FX_INT32 bit = 0; - while (bit < 7) { - result[position] = color; - position++; - if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) { - color = !color; - bit++; - counter = 0; - } else { - counter++; - } - } - if (index < data.GetLength() - 1) { - result[position] = 0; - position ++; - } - } - outLength = position; - return result; -} -CFX_WideString CBC_OnedCodaBarWriter::encodedContents(FX_WSTR contents) -{ - CFX_WideString strStart(m_chStart); - CFX_WideString strEnd(m_chEnd); - return strStart + contents + strEnd; -} -void CBC_OnedCodaBarWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - CBC_OneDimWriter::RenderResult(encodedContents(contents), code, codeLength, isDevice, e); -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp deleted file mode 100644 index 805bd985c0..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCode128Reader.cpp +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OnedCode128Reader.h" -const FX_INT32 CBC_OnedCode128Reader::CODE_PATTERNS[107][7] = { - {2, 1, 2, 2, 2, 2, 0}, - {2, 2, 2, 1, 2, 2, 0}, - {2, 2, 2, 2, 2, 1, 0}, - {1, 2, 1, 2, 2, 3, 0}, - {1, 2, 1, 3, 2, 2, 0}, - {1, 3, 1, 2, 2, 2, 0}, - {1, 2, 2, 2, 1, 3, 0}, - {1, 2, 2, 3, 1, 2, 0}, - {1, 3, 2, 2, 1, 2, 0}, - {2, 2, 1, 2, 1, 3, 0}, - {2, 2, 1, 3, 1, 2, 0}, - {2, 3, 1, 2, 1, 2, 0}, - {1, 1, 2, 2, 3, 2, 0}, - {1, 2, 2, 1, 3, 2, 0}, - {1, 2, 2, 2, 3, 1, 0}, - {1, 1, 3, 2, 2, 2, 0}, - {1, 2, 3, 1, 2, 2, 0}, - {1, 2, 3, 2, 2, 1, 0}, - {2, 2, 3, 2, 1, 1, 0}, - {2, 2, 1, 1, 3, 2, 0}, - {2, 2, 1, 2, 3, 1, 0}, - {2, 1, 3, 2, 1, 2, 0}, - {2, 2, 3, 1, 1, 2, 0}, - {3, 1, 2, 1, 3, 1, 0}, - {3, 1, 1, 2, 2, 2, 0}, - {3, 2, 1, 1, 2, 2, 0}, - {3, 2, 1, 2, 2, 1, 0}, - {3, 1, 2, 2, 1, 2, 0}, - {3, 2, 2, 1, 1, 2, 0}, - {3, 2, 2, 2, 1, 1, 0}, - {2, 1, 2, 1, 2, 3, 0}, - {2, 1, 2, 3, 2, 1, 0}, - {2, 3, 2, 1, 2, 1, 0}, - {1, 1, 1, 3, 2, 3, 0}, - {1, 3, 1, 1, 2, 3, 0}, - {1, 3, 1, 3, 2, 1, 0}, - {1, 1, 2, 3, 1, 3, 0}, - {1, 3, 2, 1, 1, 3, 0}, - {1, 3, 2, 3, 1, 1, 0}, - {2, 1, 1, 3, 1, 3, 0}, - {2, 3, 1, 1, 1, 3, 0}, - {2, 3, 1, 3, 1, 1, 0}, - {1, 1, 2, 1, 3, 3, 0}, - {1, 1, 2, 3, 3, 1, 0}, - {1, 3, 2, 1, 3, 1, 0}, - {1, 1, 3, 1, 2, 3, 0}, - {1, 1, 3, 3, 2, 1, 0}, - {1, 3, 3, 1, 2, 1, 0}, - {3, 1, 3, 1, 2, 1, 0}, - {2, 1, 1, 3, 3, 1, 0}, - {2, 3, 1, 1, 3, 1, 0}, - {2, 1, 3, 1, 1, 3, 0}, - {2, 1, 3, 3, 1, 1, 0}, - {2, 1, 3, 1, 3, 1, 0}, - {3, 1, 1, 1, 2, 3, 0}, - {3, 1, 1, 3, 2, 1, 0}, - {3, 3, 1, 1, 2, 1, 0}, - {3, 1, 2, 1, 1, 3, 0}, - {3, 1, 2, 3, 1, 1, 0}, - {3, 3, 2, 1, 1, 1, 0}, - {3, 1, 4, 1, 1, 1, 0}, - {2, 2, 1, 4, 1, 1, 0}, - {4, 3, 1, 1, 1, 1, 0}, - {1, 1, 1, 2, 2, 4, 0}, - {1, 1, 1, 4, 2, 2, 0}, - {1, 2, 1, 1, 2, 4, 0}, - {1, 2, 1, 4, 2, 1, 0}, - {1, 4, 1, 1, 2, 2, 0}, - {1, 4, 1, 2, 2, 1, 0}, - {1, 1, 2, 2, 1, 4, 0}, - {1, 1, 2, 4, 1, 2, 0}, - {1, 2, 2, 1, 1, 4, 0}, - {1, 2, 2, 4, 1, 1, 0}, - {1, 4, 2, 1, 1, 2, 0}, - {1, 4, 2, 2, 1, 1, 0}, - {2, 4, 1, 2, 1, 1, 0}, - {2, 2, 1, 1, 1, 4, 0}, - {4, 1, 3, 1, 1, 1, 0}, - {2, 4, 1, 1, 1, 2, 0}, - {1, 3, 4, 1, 1, 1, 0}, - {1, 1, 1, 2, 4, 2, 0}, - {1, 2, 1, 1, 4, 2, 0}, - {1, 2, 1, 2, 4, 1, 0}, - {1, 1, 4, 2, 1, 2, 0}, - {1, 2, 4, 1, 1, 2, 0}, - {1, 2, 4, 2, 1, 1, 0}, - {4, 1, 1, 2, 1, 2, 0}, - {4, 2, 1, 1, 1, 2, 0}, - {4, 2, 1, 2, 1, 1, 0}, - {2, 1, 2, 1, 4, 1, 0}, - {2, 1, 4, 1, 2, 1, 0}, - {4, 1, 2, 1, 2, 1, 0}, - {1, 1, 1, 1, 4, 3, 0}, - {1, 1, 1, 3, 4, 1, 0}, - {1, 3, 1, 1, 4, 1, 0}, - {1, 1, 4, 1, 1, 3, 0}, - {1, 1, 4, 3, 1, 1, 0}, - {4, 1, 1, 1, 1, 3, 0}, - {4, 1, 1, 3, 1, 1, 0}, - {1, 1, 3, 1, 4, 1, 0}, - {1, 1, 4, 1, 3, 1, 0}, - {3, 1, 1, 1, 4, 1, 0}, - {4, 1, 1, 1, 3, 1, 0}, - {2, 1, 1, 4, 1, 2, 0}, - {2, 1, 1, 2, 1, 4, 0}, - {2, 1, 1, 2, 3, 2, 0}, - {2, 3, 3, 1, 1, 1, 2} -}; -const FX_INT32 CBC_OnedCode128Reader::MAX_AVG_VARIANCE = (FX_INT32) (256 * 0.25f); -const FX_INT32 CBC_OnedCode128Reader::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (256 * 0.7f); -const FX_INT32 CBC_OnedCode128Reader::CODE_SHIFT = 98; -const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_C = 99; -const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_B = 100; -const FX_INT32 CBC_OnedCode128Reader::CODE_CODE_A = 101; -const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_1 = 102; -const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_2 = 97; -const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_3 = 96; -const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_A = 101; -const FX_INT32 CBC_OnedCode128Reader::CODE_FNC_4_B = 100; -const FX_INT32 CBC_OnedCode128Reader::CODE_START_A = 103; -const FX_INT32 CBC_OnedCode128Reader::CODE_START_B = 104; -const FX_INT32 CBC_OnedCode128Reader::CODE_START_C = 105; -const FX_INT32 CBC_OnedCode128Reader::CODE_STOP = 106; -CBC_OnedCode128Reader::CBC_OnedCode128Reader() -{ -} -CBC_OnedCode128Reader::~CBC_OnedCode128Reader() -{ -} -CFX_Int32Array *CBC_OnedCode128Reader::FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e) -{ - FX_INT32 width = row->GetSize(); - FX_INT32 rowOffset = 0; - while (rowOffset < width) { - if (row->Get(rowOffset)) { - break; - } - rowOffset++; - } - FX_INT32 counterPosition = 0; - CFX_Int32Array counters; - counters.SetSize(6); - FX_INT32 patternStart = rowOffset; - FX_BOOL isWhite = FALSE; - FX_INT32 patternLength = counters.GetSize(); - for (FX_INT32 i = rowOffset; i < width; i++) { - FX_BOOL pixel = row->Get(i); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - FX_INT32 bestVariance = MAX_AVG_VARIANCE; - FX_INT32 bestMatch = -1; - for (FX_INT32 startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) { - FX_INT32 variance = PatternMatchVariance(&counters, &CODE_PATTERNS[startCode][0], MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = startCode; - } - } - if (bestMatch >= 0) { - FX_BOOL btemp2 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (btemp2) { - CFX_Int32Array *result = FX_NEW CFX_Int32Array; - result->SetSize(3); - (*result)[0] = patternStart; - (*result)[1] = i; - (*result)[2] = bestMatch; - return result; - } - } - patternStart += counters[0] + counters[1]; - for (FX_INT32 y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - e = BCExceptionNotFound; - return NULL; -} -FX_INT32 CBC_OnedCode128Reader::DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e) -{ - RecordPattern(row, rowOffset, counters, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - FX_INT32 bestVariance = MAX_AVG_VARIANCE; - FX_INT32 bestMatch = -1; - for (FX_INT32 d = 0; d < 107; d++) { - FX_INT32 variance = PatternMatchVariance(counters, &CODE_PATTERNS[d][0], MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = d; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - e = BCExceptionNotFound; - return 0; - } - return 0; -} -CFX_ByteString CBC_OnedCode128Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) -{ - CFX_Int32Array *startPatternInfo = FindStartPattern(row, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - FX_INT32 startCode = (*startPatternInfo)[2]; - FX_INT32 codeSet; - switch (startCode) { - case 103: - codeSet = CODE_CODE_A; - break; - case 104: - codeSet = CODE_CODE_B; - break; - case 105: - codeSet = CODE_CODE_C; - break; - default: - if(startPatternInfo != NULL) { - startPatternInfo->RemoveAll(); - delete startPatternInfo; - startPatternInfo = NULL; - } - e = BCExceptionFormatException; - return ""; - } - FX_BOOL done = FALSE; - FX_BOOL isNextShifted = FALSE; - CFX_ByteString result; - FX_INT32 lastStart = (*startPatternInfo)[0]; - FX_INT32 nextStart = (*startPatternInfo)[1]; - if(startPatternInfo != NULL) { - startPatternInfo->RemoveAll(); - delete startPatternInfo; - startPatternInfo = NULL; - } - CFX_Int32Array counters; - counters.SetSize(6); - FX_INT32 lastCode = 0; - FX_INT32 code = 0; - FX_INT32 checksumTotal = startCode; - FX_INT32 multiplier = 0; - FX_BOOL lastCharacterWasPrintable = TRUE; - while (!done) { - FX_BOOL unshift = isNextShifted; - isNextShifted = FALSE; - lastCode = code; - code = DecodeCode(row, &counters, nextStart, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - if (code != CODE_STOP) { - lastCharacterWasPrintable = TRUE; - } - if (code != CODE_STOP) { - multiplier++; - checksumTotal += multiplier * code; - } - lastStart = nextStart; - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - nextStart += counters[i]; - } - switch (code) { - case 103: - case 104: - case 105: - e = BCExceptionFormatException; - return ""; - } - switch (codeSet) { - case 101: - if (code < 64) { - result += (FX_CHAR) (' ' + code); - } else if (code < 96) { - result += (FX_CHAR) (code - 64); - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = FALSE; - } - switch (code) { - case 102: - case 97: - case 96: - case 101: - break; - case 98: - isNextShifted = TRUE; - codeSet = CODE_CODE_B; - break; - case 100: - codeSet = CODE_CODE_B; - break; - case 99: - codeSet = CODE_CODE_C; - break; - case 106: - done = TRUE; - break; - } - } - break; - case 100: - if (code < 96) { - result += (FX_CHAR) (' ' + code); - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = FALSE; - } - switch (code) { - case 102: - case 97: - case 96: - case 100: - break; - case 98: - isNextShifted = TRUE; - codeSet = CODE_CODE_A; - break; - case 101: - codeSet = CODE_CODE_A; - break; - case 99: - codeSet = CODE_CODE_C; - break; - case 106: - done = TRUE; - break; - } - } - break; - case 99: - if (code < 100) { - if (code < 10) { - result += '0'; - } - FX_CHAR temp[128]; -#if defined(_FX_WINAPI_PARTITION_APP_) - sprintf_s(temp, 128, "%d", code); -#else - sprintf(temp, "%d", code); -#endif - result += temp; - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = FALSE; - } - switch (code) { - case 102: - break; - case 101: - codeSet = CODE_CODE_A; - break; - case 100: - codeSet = CODE_CODE_B; - break; - case 106: - done = TRUE; - break; - } - } - break; - } - if (unshift) { - codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; - } - } - FX_INT32 width = row->GetSize(); - while (nextStart < width && row->Get(nextStart)) { - nextStart++; - } - FX_BOOL boolT1 = row->IsRange(nextStart, FX_MIN(width, nextStart + (nextStart - lastStart) / 2), FALSE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - if (!boolT1) { - e = BCExceptionNotFound; - return ""; - } - checksumTotal -= multiplier * lastCode; - if (checksumTotal % 103 != lastCode) { - e = BCExceptionChecksumException; - return ""; - } - FX_INT32 resultLength = result.GetLength(); - if (resultLength > 0 && lastCharacterWasPrintable) { - if (codeSet == CODE_CODE_C) { - result = result.Mid(0, result.GetLength() - 2); - } else { - result = result.Mid(0, result.GetLength() - 1); - } - } - if (result.GetLength() == 0) { - e = BCExceptionFormatException; - return ""; - } - return result; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp deleted file mode 100644 index 146f61186e..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCode128Writer.cpp +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedCode128Reader.h" -#include "include/BC_OnedCode128Writer.h" -const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_B = 100; -const FX_INT32 CBC_OnedCode128Writer::CODE_CODE_C = 99; -const FX_INT32 CBC_OnedCode128Writer::CODE_START_B = 104; -const FX_INT32 CBC_OnedCode128Writer::CODE_START_C = 105; -const FX_INT32 CBC_OnedCode128Writer::CODE_STOP = 106; -CBC_OnedCode128Writer::CBC_OnedCode128Writer() -{ - m_codeFormat = BC_CODE128_B; -} -CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) -{ - m_codeFormat = type; -} -CBC_OnedCode128Writer::~CBC_OnedCode128Writer() -{ -} -BC_TYPE CBC_OnedCode128Writer::GetType() -{ - return m_codeFormat; -} -FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(FX_WSTR contents) -{ - FX_BOOL ret = TRUE; - FX_INT32 position = 0; - FX_INT32 patternIndex = -1; - if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) { - while (position < contents.GetLength()) { - patternIndex = (FX_INT32)contents.GetAt(position); - if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) { - position++; - continue; - } else { - ret = FALSE; - break; - } - position ++; - } - } else { - ret = FALSE; - } - return ret; -} -CFX_WideString CBC_OnedCode128Writer::FilterContents(FX_WSTR contents) -{ - CFX_WideString filterChineseChar; - FX_WCHAR ch; - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - ch = contents.GetAt(i); - if(ch > 175) { - i++; - continue; - } - filterChineseChar += ch; - } - CFX_WideString filtercontents; - if (m_codeFormat == BC_CODE128_B) { - for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { - ch = filterChineseChar.GetAt(i); - if (ch >= 32 && ch <= 126) { - filtercontents += ch; - } else { - continue; - } - } - } else if (m_codeFormat == BC_CODE128_C) { - for (FX_INT32 i = 0; i < filterChineseChar.GetLength(); i++) { - ch = filterChineseChar.GetAt(i); - if (ch >= 32 && ch <= 106) { - filtercontents += ch; - } else { - continue; - } - } - } else { - filtercontents = contents; - } - return filtercontents; -} -FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) -{ - if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { - return FALSE; - } - m_locTextLoc = location; - return TRUE; -} -FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - if(format != BCFORMAT_CODE_128) { - e = BCExceptionOnlyEncodeCODE_128; - return NULL; - } - FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length) -{ - FX_INT32 end = start + length; - for (FX_INT32 i = start; i < end; i++) { - if (contents[i] < '0' || contents[i] > '9') { - return FALSE; - } - } - return TRUE; -} -FX_BYTE *CBC_OnedCode128Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) -{ - FX_INT32 length = contents.GetLength(); - if(contents.GetLength() < 1 || contents.GetLength() > 80) { - e = BCExceptionContentsLengthShouldBetween1and80; - return NULL; - } - CFX_PtrArray patterns; - FX_INT32 checkSum = 0; - if (m_codeFormat == BC_CODE128_B) { - checkSum = Encode128B(contents, patterns); - } else if (m_codeFormat == BC_CODE128_C) { - checkSum = Encode128C(contents, patterns); - } else { - e = BCExceptionFormatException; - return NULL; - } - checkSum %= 103; - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]); - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]); - m_iContentLen = contents.GetLength() + 3; - FX_INT32 codeWidth = 0; - for(FX_INT32 k = 0; k < patterns.GetSize(); k++) { - FX_INT32 *pattern = (FX_INT32*)patterns[k]; - for(FX_INT32 j = 0; j < 7; j++) { - codeWidth += pattern[j]; - } - } - outLength = codeWidth; - FX_BYTE *result = FX_Alloc(FX_BYTE, outLength); - FX_INT32 pos = 0; - for(FX_INT32 j = 0; j < patterns.GetSize(); j++) { - FX_INT32* pattern = (FX_INT32*)patterns[j]; - pos += AppendPattern(result, pos, pattern, 7, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - return result; -} -FX_INT32 CBC_OnedCode128Writer::Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns) -{ - FX_INT32 checkSum = 0; - FX_INT32 checkWeight = 1; - FX_INT32 position = 0; - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]); - checkSum += CODE_START_B * checkWeight; - while (position < contents.GetLength()) { - FX_INT32 patternIndex = 0; - patternIndex = contents[position] - ' '; - position += 1; - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); - checkSum += patternIndex * checkWeight; - if (position != 0) { - checkWeight++; - } - } - return checkSum; -} -FX_INT32 CBC_OnedCode128Writer::Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns) -{ - FX_INT32 checkSum = 0; - FX_INT32 checkWeight = 1; - FX_INT32 position = 0; - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]); - checkSum += CODE_START_C * checkWeight; - while (position < contents.GetLength()) { - FX_INT32 patternIndex = 0; - FX_CHAR ch = contents.GetAt(position); - if (ch < '0' || ch > '9') { - patternIndex = (FX_INT32)ch; - position++; - } else { - patternIndex = FXSYS_atoi(contents.Mid(position, 2)); - if (contents.GetAt(position + 1) < '0' || contents.GetAt(position + 1) > '9') { - position += 1; - } else { - position += 2; - } - } - patterns.Add((FX_INT32*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]); - checkSum += patternIndex * checkWeight; - if (position != 0) { - checkWeight++; - } - } - return checkSum; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp deleted file mode 100644 index 95b1785fef..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCode39Reader.cpp +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OnedCode39Reader.h" -FX_LPCSTR CBC_OnedCode39Reader::ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; -FX_LPCSTR CBC_OnedCode39Reader::CHECKSUM_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; -const FX_INT32 CBC_OnedCode39Reader::CHARACTER_ENCODINGS[44] = { - 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, - 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, - 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, - 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, - 0x0A8, 0x0A2, 0x08A, 0x02A -}; -const FX_INT32 CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094; -CBC_OnedCode39Reader::CBC_OnedCode39Reader(): m_extendedMode(FALSE), m_usingCheckDigit(FALSE) -{ -} -CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit) -{ - m_usingCheckDigit = usingCheckDigit; - m_extendedMode = FALSE; -} -CBC_OnedCode39Reader::CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) -{ - m_extendedMode = extendedMode; - m_usingCheckDigit = usingCheckDigit; -} -CBC_OnedCode39Reader::~CBC_OnedCode39Reader() -{ -} -CFX_ByteString CBC_OnedCode39Reader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) -{ - CFX_Int32Array *start = FindAsteriskPattern(row, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - FX_INT32 nextStart = (*start)[1]; - if(start != NULL) { - delete start; - start = NULL; - } - FX_INT32 end = row->GetSize(); - while (nextStart < end && !row->Get(nextStart)) { - nextStart++; - } - CFX_ByteString result; - CFX_Int32Array counters; - counters.SetSize(9); - FX_CHAR decodedChar; - FX_INT32 lastStart; - do { - RecordPattern(row, nextStart, &counters, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - FX_INT32 pattern = ToNarrowWidePattern(&counters); - if (pattern < 0) { - e = BCExceptionNotFound; - return ""; - } - decodedChar = PatternToChar(pattern, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - result += decodedChar; - lastStart = nextStart; - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - nextStart += counters[i]; - } - while (nextStart < end && !row->Get(nextStart)) { - nextStart++; - } - } while (decodedChar != '*'); - result = result.Mid(0, result.GetLength() - 1); - FX_INT32 lastPatternSize = 0; - for (FX_INT32 j = 0; j < counters.GetSize(); j++) { - lastPatternSize += counters[j]; - } - FX_INT32 whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; - if(m_usingCheckDigit) { - FX_INT32 max = result.GetLength() - 1; - FX_INT32 total = 0; - FX_INT32 len = (FX_INT32)strlen(ALPHABET_STRING); - for (FX_INT32 k = 0; k < max; k++) { - for (FX_INT32 j = 0; j < len; j++) - if (ALPHABET_STRING[j] == result[k]) { - total += j; - } - } - if (result[max] != (ALPHABET_STRING)[total % 43]) { - e = BCExceptionChecksumException; - return ""; - } - result = result.Mid(0, result.GetLength() - 1); - } - if (result.GetLength() == 0) { - e = BCExceptionNotFound; - return ""; - } - if(m_extendedMode) { - CFX_ByteString bytestr = DecodeExtended(result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bytestr; - } else { - return result; - } -} -CFX_Int32Array *CBC_OnedCode39Reader::FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e) -{ - FX_INT32 width = row->GetSize(); - FX_INT32 rowOffset = 0; - while (rowOffset < width) { - if (row->Get(rowOffset)) { - break; - } - rowOffset++; - } - FX_INT32 counterPosition = 0; - CFX_Int32Array counters; - counters.SetSize(9); - FX_INT32 patternStart = rowOffset; - FX_BOOL isWhite = FALSE; - FX_INT32 patternLength = counters.GetSize(); - for (FX_INT32 i = rowOffset; i < width; i++) { - FX_BOOL pixel = row->Get(i); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (ToNarrowWidePattern(&counters) == ASTERISK_ENCODING) { - FX_BOOL bT1 = row->IsRange(FX_MAX(0, patternStart - (i - patternStart) / 2), patternStart, FALSE, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (bT1) { - CFX_Int32Array *result = FX_NEW CFX_Int32Array; - result->SetSize(2); - (*result)[0] = patternStart; - (*result)[1] = i; - return result; - } - } - patternStart += counters[0] + counters[1]; - for (FX_INT32 y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - e = BCExceptionNotFound; - return NULL; -} -FX_INT32 CBC_OnedCode39Reader::ToNarrowWidePattern(CFX_Int32Array *counters) -{ - FX_INT32 numCounters = counters->GetSize(); - FX_INT32 maxNarrowCounter = 0; - FX_INT32 wideCounters; - do { -#undef max - FX_INT32 minCounter = FXSYS_IntMax; - for (FX_INT32 i = 0; i < numCounters; i++) { - FX_INT32 counter = (*counters)[i]; - if (counter < minCounter && counter > maxNarrowCounter) { - minCounter = counter; - } - } - maxNarrowCounter = minCounter; - wideCounters = 0; - FX_INT32 totalWideCountersWidth = 0; - FX_INT32 pattern = 0; - for (FX_INT32 j = 0; j < numCounters; j++) { - FX_INT32 counter = (*counters)[j]; - if ((*counters)[j] > maxNarrowCounter) { - pattern |= 1 << (numCounters - 1 - j); - wideCounters++; - totalWideCountersWidth += counter; - } - } - if (wideCounters == 3) { - for (FX_INT32 k = 0; k < numCounters && wideCounters > 0; k++) { - FX_INT32 counter = (*counters)[k]; - if ((*counters)[k] > maxNarrowCounter) { - wideCounters--; - if ((counter << 1) >= totalWideCountersWidth) { - return -1; - } - } - } - return pattern; - } - } while (wideCounters > 3); - return -1; -} -FX_CHAR CBC_OnedCode39Reader::PatternToChar(FX_INT32 pattern, FX_INT32 &e) -{ - for (FX_INT32 i = 0; i < 44; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return (ALPHABET_STRING)[i]; - } - } - e = BCExceptionNotFound; - return 0; -} -CFX_ByteString CBC_OnedCode39Reader::DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e) -{ - FX_INT32 length = encoded.GetLength(); - CFX_ByteString decoded; - FX_CHAR c, next; - for(FX_INT32 i = 0; i < length; i++) { - c = encoded[i]; - if(c == '+' || c == '$' || c == '%' || c == '/') { - next = encoded[i + 1]; - FX_CHAR decodedChar = '\0'; - switch (c) { - case '+': - if (next >= 'A' && next <= 'Z') { - decodedChar = (FX_CHAR) (next + 32); - } else { - e = BCExceptionFormatException; - return ""; - } - break; - case '$': - if (next >= 'A' && next <= 'Z') { - decodedChar = (FX_CHAR) (next - 64); - } else { - e = BCExceptionFormatException; - return ""; - } - break; - case '%': - if (next >= 'A' && next <= 'E') { - decodedChar = (FX_CHAR) (next - 38); - } else if (next >= 'F' && next <= 'J') { - decodedChar = (FX_CHAR) (next - 11); - } else if (next >= 'K' && next <= 'O' && next != 'M' && next != 'N') { - decodedChar = (FX_CHAR) (next + 16); - } else if (next >= 'P' && next <= 'S') { - decodedChar = (FX_CHAR) (next + 43); - } else if (next == 'U') { - decodedChar = (FX_CHAR) 0; - } else if (next == 'V') { - decodedChar = (FX_CHAR) 64; - } else if (next == 'W') { - decodedChar = (FX_CHAR) 96; - } else if (next == 'T' || next == 'X' || next == 'Y' || next == 'Z') { - decodedChar = (FX_CHAR) 127; - } else { - e = BCExceptionFormatException; - return ""; - } - break; - case '/': - if (next >= 'A' && next <= 'O') { - decodedChar = (FX_CHAR) (next - 32); - } else if (next == 'Z') { - decodedChar = ':'; - } else { - e = BCExceptionFormatException; - return ""; - } - break; - } - decoded += decodedChar; - i++; - } else { - decoded += c; - } - } - return decoded; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp deleted file mode 100644 index 5ebbd7380f..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedCode39Writer.cpp +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedCode39Reader.h" -#include "include/BC_OnedCode39Writer.h" -#include "include/BC_CommonBitMatrix.h" -CBC_OnedCode39Writer::CBC_OnedCode39Writer() -{ - m_extendedMode = FALSE; - m_iWideNarrRatio = 3; -} -CBC_OnedCode39Writer::CBC_OnedCode39Writer(FX_BOOL extendedMode) -{ - m_iWideNarrRatio = 3; - m_extendedMode = extendedMode; -} -CBC_OnedCode39Writer::~CBC_OnedCode39Writer() -{ -} -FX_BOOL CBC_OnedCode39Writer::CheckContentValidity(FX_WSTR contents) -{ - if (m_extendedMode) { - return CheckExtendedContentValidity(contents); - } - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') - || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' - || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { - continue; - } - return FALSE; - } - return TRUE; -} -FX_BOOL CBC_OnedCode39Writer::CheckExtendedContentValidity(FX_WSTR contents) -{ - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if (ch > 127) { - return FALSE; - } - } - return TRUE; -} -CFX_WideString CBC_OnedCode39Writer::FilterContents(FX_WSTR contents) -{ - if (m_extendedMode) { - return FilterExtendedContents(contents); - } - CFX_WideString filtercontents; - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { - continue; - } - if(ch > 175) { - i++; - continue; - } else { - ch = Upper(ch); - } - if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') - || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' - || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { - filtercontents += ch; - } - } - return filtercontents; -} -CFX_WideString CBC_OnedCode39Writer::FilterExtendedContents(FX_WSTR contents) -{ - CFX_WideString filtercontents; - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { - continue; - } - if(ch > 175) { - i++; - continue; - } - if (ch > 127 && ch < 176) { - continue; - } - if (ch == 0) { - filtercontents += '%'; - filtercontents += 'U'; - } else if(ch >= 1 && ch <= 26) { - filtercontents += '$'; - filtercontents += (ch + 64); - } else if (ch >= 27 && ch <= 31) { - filtercontents += '%'; - filtercontents += (ch + 38); - } else if (ch >= 33 && ch <= 47 && ch != 45 && ch != 46) { - filtercontents += '/'; - filtercontents += (ch + 32); - } else if (ch == 58) { - filtercontents += '/'; - filtercontents += 'Z'; - } else if (ch >= 59 && ch <= 63) { - filtercontents += '%'; - filtercontents += ch + 11; - } else if (ch == 64) { - filtercontents += '%'; - filtercontents += 'V'; - } else if (ch >= 91 && ch <= 95) { - filtercontents += '%'; - filtercontents += ch - 16; - } else if (ch == 96) { - filtercontents += '%'; - filtercontents += 'W'; - } else if (ch >= 97 && ch <= 122) { - filtercontents += '+'; - filtercontents += ch - 32; - } else if (ch >= 123 && ch <= 126) { - filtercontents += '%'; - filtercontents += ch - 43; - } else if (ch == 127) { - filtercontents += '%'; - filtercontents += 'T'; - } else { - filtercontents += ch; - } - } - return filtercontents; -} -CFX_WideString CBC_OnedCode39Writer::RenderTextContents(FX_WSTR contents) -{ - if (m_extendedMode) { - return RenderExtendedTextContents(contents); - } - CFX_WideString renderContents; - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { - continue; - } - if(ch > 175) { - i++; - continue; - } - if ((ch >= (FX_WCHAR)'0' && ch <= (FX_WCHAR)'9') || (ch >= (FX_WCHAR)'A' && ch <= (FX_WCHAR)'Z') - || (ch >= (FX_WCHAR)'a' && ch <= (FX_WCHAR)'z') || ch == (FX_WCHAR)'-' || ch == (FX_WCHAR)'.' - || ch == (FX_WCHAR)' ' || ch == (FX_WCHAR)'*' || ch == (FX_WCHAR)'$' || ch == (FX_WCHAR)'/' - || ch == (FX_WCHAR)'+' || ch == (FX_WCHAR)'%') { - renderContents += ch; - } - } - return renderContents; -} -CFX_WideString CBC_OnedCode39Writer::RenderExtendedTextContents(FX_WSTR contents) -{ - CFX_WideString renderContents; - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_WCHAR ch = contents.GetAt(i); - if ( ch == (FX_WCHAR)'*' && (i == 0 || i == contents.GetLength() - 1) ) { - continue; - } - if(ch > 175) { - i++; - continue; - } - if (ch > 127 && ch < 176) { - continue; - } - renderContents += ch; - } - return renderContents; -} -FX_BOOL CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) -{ - if ( location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) { - return FALSE; - } - m_locTextLoc = location; - return TRUE; -} -FX_BOOL CBC_OnedCode39Writer::SetWideNarrowRatio(FX_INT32 ratio) -{ - if ( ratio < 2 || ratio > 3) { - return FALSE; - } - m_iWideNarrRatio = ratio; - return TRUE; -} -FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0 , e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - if(format != BCFORMAT_CODE_39) { - e = BCExceptionOnlyEncodeCODE_39; - return NULL; - } - FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -void CBC_OnedCode39Writer::ToIntArray(FX_INT32 a, FX_INT32 *toReturn) -{ - for(FX_INT32 i = 0; i < 9; i++) { - toReturn[i] = (a & (1 << i) ) == 0 ? 1 : m_iWideNarrRatio; - } -} -FX_CHAR CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e) -{ - FX_INT32 length = contents.GetLength(); - if (length > 80) { - e = BCExceptionContentsLengthShouldBetween1and80; - return '*'; - } - FX_INT32 checksum = 0; - FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); - for(FX_INT32 i = 0; i < contents.GetLength(); i++) { - FX_INT32 j = 0; - for (; j < len; j++) { - if (CBC_OnedCode39Reader::ALPHABET_STRING[j] == contents[i]) { - if(contents[i] != '*') { - checksum += j; - break; - } else { - break; - } - } - } - if (j >= len) { - e = BCExceptionUnSupportedString; - return '*'; - } - } - checksum = checksum % 43; - return CBC_OnedCode39Reader::CHECKSUM_STRING[checksum]; -} -FX_BYTE *CBC_OnedCode39Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outlength , FX_INT32 &e) -{ - FX_CHAR checksum = CalcCheckSum(contents, e); - if (checksum == '*') { - return NULL; - } - FX_INT32 widths[9] = {0}; - FX_INT32 wideStrideNum = 3; - FX_INT32 narrStrideNum = 9 - wideStrideNum; - CFX_ByteString encodedContents = contents; - if ( m_bCalcChecksum ) { - encodedContents += checksum; - } - m_iContentLen = encodedContents.GetLength(); - FX_INT32 codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 + 1 + m_iContentLen; - FX_INT32 len = (FX_INT32)strlen(CBC_OnedCode39Reader::ALPHABET_STRING); - for (FX_INT32 j = 0; j < m_iContentLen; j++) { - for (FX_INT32 i = 0; i < len; i++) { - if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[j]) { - ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); - for(FX_INT32 k = 0; k < 9; k++) { - codeWidth += widths[k]; - } - } - } - } - outlength = codeWidth; - FX_BYTE *result = FX_Alloc(FX_BYTE, codeWidth); - ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); - FX_INT32 pos = AppendPattern(result, 0, widths, 9, 1 , e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - FX_INT32 narrowWhite[] = {1}; - pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - for(FX_INT32 l = m_iContentLen - 1; l >= 0; l--) { - for (FX_INT32 i = 0; i < len; i++) { - if (CBC_OnedCode39Reader::ALPHABET_STRING[i] == encodedContents[l]) { - ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[i], widths); - pos += AppendPattern(result, pos, widths, 9, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - } - pos += AppendPattern(result, pos, narrowWhite, 1, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - ToIntArray(CBC_OnedCode39Reader::CHARACTER_ENCODINGS[39], widths); - pos += AppendPattern(result, pos, widths, 9, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - for (FX_INT32 i = 0; i < codeWidth / 2; i++) { - result[i] ^= result[codeWidth - 1 - i]; - result[codeWidth - 1 - i] ^= result[i]; - result[i] ^= result[codeWidth - 1 - i]; - } - return result; -} -CFX_WideString CBC_OnedCode39Writer::encodedContents(FX_WSTR contents, FX_INT32 &e) -{ - CFX_WideString encodedContents = contents; - if (m_bCalcChecksum && m_bPrintChecksum) { - CFX_WideString checksumContent = FilterContents(contents); - CFX_ByteString str = checksumContent.UTF8Encode(); - FX_CHAR checksum; - checksum = CalcCheckSum(str, e); - BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L"")); - str += checksum; - encodedContents += checksum; - } - return encodedContents; -} -void CBC_OnedCode39Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - CFX_WideString encodedCon = encodedContents(contents, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_OneDimWriter::RenderResult(encodedCon, code, codeLength, isDevice, e); -} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp deleted file mode 100644 index 36c62e3c76..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedEAN13Reader.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OnedEAN13Reader.h" -const FX_INT32 CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = { - 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A -}; -CBC_OnedEAN13Reader::CBC_OnedEAN13Reader() -{ -} -CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader() -{ -} -void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e) -{ - for (FX_INT32 d = 0; d < 10; d++) { - if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) { - result.Insert(0, (FX_CHAR) ('0' + d)); - return; - } - } - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -FX_INT32 CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) -{ - CFX_Int32Array counters; - counters.Add(0); - counters.Add(0); - counters.Add(0); - counters.Add(0); - FX_INT32 end = row->GetSize(); - FX_INT32 rowOffset = (*startRange)[1]; - FX_INT32 lgPatternFound = 0; - for (FX_INT32 x = 0; x < 6 && rowOffset < end; x++) { - FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - resultString += (FX_CHAR) ('0' + bestMatch % 10); - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - rowOffset += counters[i]; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - DetermineFirstDigit(resultString, lgPatternFound, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - CFX_Int32Array result; - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); - CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - rowOffset = (*middleRange)[1]; - if(middleRange != NULL) { - delete middleRange; - middleRange = NULL; - } - for (FX_INT32 Y = 0; Y < 6 && rowOffset < end; Y++) { - FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - resultString += (FX_CHAR) ('0' + bestMatch); - for (FX_INT32 k = 0; k < counters.GetSize(); k++) { - rowOffset += counters[k]; - } - } - return rowOffset; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp deleted file mode 100644 index 5f349ea31b..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedEAN13Writer.cpp +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedEAN13Reader.h" -#include "include/BC_OnedEAN13Writer.h" -CBC_OnedEAN13Writer::CBC_OnedEAN13Writer() -{ - m_bLeftPadding = TRUE; - m_codeWidth = 3 + - (7 * 6) + - 5 + - (7 * 6) + - 3; -} -CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() -{ -} -FX_BOOL CBC_OnedEAN13Writer::CheckContentValidity(FX_WSTR contents) -{ - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { - continue; - } else { - return FALSE; - } - } - return TRUE; -} -CFX_WideString CBC_OnedEAN13Writer::FilterContents(FX_WSTR contents) -{ - CFX_WideString filtercontents; - FX_WCHAR ch; - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - ch = contents.GetAt(i); - if(ch > 175) { - i++; - continue; - } - if (ch >= '0' && ch <= '9') { - filtercontents += ch; - } - } - return filtercontents; -} -FX_INT32 CBC_OnedEAN13Writer::CalcChecksum(const CFX_ByteString &contents) -{ - FX_INT32 odd = 0; - FX_INT32 even = 0; - FX_INT32 j = 1; - for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { - if(j % 2) { - odd += FXSYS_atoi(contents.Mid(i, 1)); - } else { - even += FXSYS_atoi(contents.Mid(i, 1)); - } - j++; - } - FX_INT32 checksum = (odd * 3 + even) % 10; - checksum = (10 - checksum) % 10; - return (checksum); -} -FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - if(format != BCFORMAT_EAN_13) { - e = BCExceptionOnlyEncodeEAN_13; - } - FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedEAN13Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) -{ - if (contents.GetLength() != 13) { - e = BCExceptionDigitLengthShould13; - return NULL; - } - m_iDataLenth = 13; - FX_INT32 firstDigit = FXSYS_atoi(contents.Mid(0, 1)); - FX_INT32 parities = CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[firstDigit]; - outLength = m_codeWidth; - FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); - FX_INT32 pos = 0; - pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - FX_INT32 i = 0; - for ( i = 1; i <= 6; i++) { - FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); - if ((parities >> (6 - i) & 1) == 1) { - digit += 10; - } - pos += AppendPattern(result, pos, CBC_OneDimReader::L_AND_G_PATTERNS[digit], 4, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - for (i = 7; i <= 12; i++) { - FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); - pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - return result; -} -void CBC_OnedEAN13Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) -{ - if (device == NULL && pOutBitmap == NULL) { - e = BCExceptionIllegalArgument; - return; - } - FX_INT32 leftPadding = 7 * multiple; - FX_INT32 leftPosition = 3 * multiple + leftPadding; - CFX_ByteString str = FX_UTF8Encode(contents); - FX_INT32 iLen = str.GetLength(); - FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); - if (!pCharPos) { - return; - } - FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); - CFX_FxgeDevice geBitmap; - if (pOutBitmap != NULL) { - geBitmap.Attach(pOutBitmap); - } - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - CFX_ByteString tempStr = str.Mid(1, 6); - FX_INT32 strWidth = multiple * 42; - if (pOutBitmap == NULL) { - CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); - matr.Concat(*matrix); - matr.TransformRect(rect); - FX_RECT re = rect.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 47 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 47 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); - CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - matr1.Concat(*matrix); - matr1.TransformRect(rect1); - re = rect1.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - FX_INT32 strWidth1 = multiple * 7; - CFX_Matrix matr2(m_outputHScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); - CFX_FloatRect rect2(0.0f, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 0.5f, (FX_FLOAT)m_Height); - matr2.Concat(*matrix); - matr2.TransformRect(rect2); - re = rect2.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - } - FX_FLOAT blank = 0.0; - FX_FLOAT charsWidth = 0; - iLen = tempStr.GetLength(); - if (pOutBitmap == NULL) { - strWidth = (FX_INT32)(strWidth * m_outputHScale); - } - CalcTextInfo(tempStr, pCharPos + 1, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); - CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); - CFX_FxgeDevice ge; - if (pOutBitmap != NULL) { - ge.Create(strWidth, iTextHeight, FXDIB_Argb); - FX_RECT rect(0, 0, strWidth, iTextHeight); - ge.FillRect(&rect, m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 1, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight) + iFontSize); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos + 1, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(7, 6); - iLen = tempStr.GetLength(); - charsWidth = 0.0f; - CalcTextInfo(tempStr, pCharPos + 7, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); - if(pOutBitmap != NULL) { - FX_RECT rect1(0, 0, strWidth, iTextHeight); - ge.FillRect(&rect1, m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 7, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 47 * multiple, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 47 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos + 7, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(0, 1); - iLen = tempStr.GetLength(); - strWidth = multiple * 7; - if (pOutBitmap == NULL) { - strWidth = (FX_INT32)(strWidth * m_outputHScale); - } - CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); - if(pOutBitmap != NULL) { - delete ge.GetBitmap(); - ge.Create(strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - FX_Free(pCharPos); -} -void CBC_OnedEAN13Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); -} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp deleted file mode 100644 index 19c10bab50..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedEAN8Reader.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_OnedEAN8Reader.h" -CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() -{ -} -CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() -{ -} -FX_INT32 CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) -{ - CFX_Int32Array counters; - counters.Add(0); - counters.Add(0); - counters.Add(0); - counters.Add(0); - FX_INT32 end = row->GetSize(); - FX_INT32 rowOffset = (*startRange)[1]; - FX_INT32 rowOffsetLeft = rowOffset; - for (FX_INT32 x = 0; x < 4 && rowOffset < end; x++) { - FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - resultResult += (FX_CHAR) ('0' + bestMatch); - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - rowOffset += counters[i]; - } - } - FX_INT32 RowOffsetLen = (rowOffset - rowOffsetLeft) / 4; - CFX_Int32Array result; - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); - result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); - CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - FX_INT32 rowOffsetMid = rowOffset; - rowOffset = (*middleRange)[1]; - if((rowOffset - rowOffsetMid) > RowOffsetLen) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - if(middleRange != NULL) { - delete middleRange; - middleRange = NULL; - } - for (FX_INT32 y = 0; y < 4 && rowOffset < end; y++) { - FX_INT32 bestMatch = DecodeDigit(row, & counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - resultResult += (FX_CHAR) ('0' + bestMatch); - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - rowOffset += counters[i]; - } - } - return rowOffset; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp b/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp deleted file mode 100644 index 2bb50ba588..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedEAN8Writer.cpp +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_OnedEAN8Writer.h" -#include "include/BC_CommonBitMatrix.h" -CBC_OnedEAN8Writer::CBC_OnedEAN8Writer() -{ - m_iDataLenth = 8; - m_codeWidth = 3 + - (7 * 4) + - 5 + - (7 * 4) + - 3; -} -CBC_OnedEAN8Writer::~CBC_OnedEAN8Writer() -{ -} -void CBC_OnedEAN8Writer::SetDataLength(FX_INT32 length) -{ - m_iDataLenth = 8; -} -FX_BOOL CBC_OnedEAN8Writer::SetTextLocation(BC_TEXT_LOC location) -{ - if ( location == BC_TEXT_LOC_BELOWEMBED) { - m_locTextLoc = location; - return TRUE; - } - return FALSE; -} -FX_BOOL CBC_OnedEAN8Writer::CheckContentValidity(FX_WSTR contents) -{ - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { - continue; - } else { - return FALSE; - } - } - return TRUE; -} -CFX_WideString CBC_OnedEAN8Writer::FilterContents(FX_WSTR contents) -{ - CFX_WideString filtercontents; - FX_WCHAR ch; - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - ch = contents.GetAt(i); - if(ch > 175) { - i++; - continue; - } - if (ch >= '0' && ch <= '9') { - filtercontents += ch; - } - } - return filtercontents; -} -FX_INT32 CBC_OnedEAN8Writer::CalcChecksum(const CFX_ByteString &contents) -{ - FX_INT32 odd = 0; - FX_INT32 even = 0; - FX_INT32 j = 1; - for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { - if(j % 2) { - odd += FXSYS_atoi(contents.Mid(i, 1)); - } else { - even += FXSYS_atoi(contents.Mid(i, 1)); - } - j++; - } - FX_INT32 checksum = (odd * 3 + even) % 10; - checksum = (10 - checksum) % 10; - return (checksum); -} -FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e) -{ - if (format != BCFORMAT_EAN_8) { - e = BCExceptionOnlyEncodeEAN_8; - return NULL; - } - FX_BYTE *ret = CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedEAN8Writer::Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e) -{ - if (contents.GetLength() != 8) { - e = BCExceptionDigitLengthMustBe8; - return NULL; - } - outLength = m_codeWidth; - FX_BYTE *result = FX_Alloc(FX_BYTE, m_codeWidth); - FX_INT32 pos = 0; - pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - FX_INT32 i = 0; - for (i = 0; i <= 3; i++) { - FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); - pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - pos += AppendPattern(result, pos, CBC_OneDimReader::MIDDLE_PATTERN, 5, 0, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - for (i = 4; i <= 7; i++) { - FX_INT32 digit = FXSYS_atoi(contents.Mid(i, 1)); - pos += AppendPattern(result, pos, CBC_OneDimReader::L_PATTERNS[digit], 4, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - } - pos += AppendPattern(result, pos, CBC_OneDimReader::START_END_PATTERN, 3, 1, e); - if (e != BCExceptionNO) { - FX_Free (result); - return NULL; - } - return result; -} -void CBC_OnedEAN8Writer::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) -{ - if (device == NULL && pOutBitmap == NULL) { - e = BCExceptionIllegalArgument; - return; - } - FX_INT32 leftPosition = 3 * multiple; - CFX_ByteString str = FX_UTF8Encode(contents); - FX_INT32 iLength = str.GetLength(); - FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLength); - if (!pCharPos) { - return; - } - FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLength); - CFX_ByteString tempStr = str.Mid(0, 4); - FX_INT32 iLen = tempStr.GetLength(); - FX_INT32 strWidth = 7 * multiple * 4; - FX_FLOAT blank = 0.0; - CFX_FxgeDevice geBitmap; - if (pOutBitmap != NULL) { - geBitmap.Attach(pOutBitmap); - } - FX_FLOAT charsWidth = 0; - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - if (pOutBitmap == NULL) { - CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); - matr.Concat(*matrix); - matr.TransformRect(rect); - FX_RECT re = rect.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 33 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + 33 * multiple + strWidth - 0.5), (FX_FLOAT)m_Height); - matr1.Concat(*matrix); - matr1.TransformRect(rect1); - re = rect1.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - } - if (pOutBitmap == NULL) { - strWidth = (FX_INT32)(strWidth * m_outputHScale); - } - CalcTextInfo(tempStr, pCharPos, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); - CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); - CFX_FxgeDevice ge; - if (pOutBitmap != NULL) { - delete ge.GetBitmap(); - ge.Create(strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - affine_matrix1.Concat(*matrix); - FX_BOOL ret = device->DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize, - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(4, 4); - iLen = tempStr.GetLength(); - charsWidth = 0.0f; - CalcTextInfo(tempStr, pCharPos + 4, m_pFont, (FX_FLOAT)strWidth, iFontSize, blank); - if (pOutBitmap != NULL) { - delete ge.GetBitmap(); - ge.Create(strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 4, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 33 * multiple, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 33 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - FX_BOOL ret = device->DrawNormalText(iLen, - pCharPos + 4, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - FX_Free(pCharPos); -} -void CBC_OnedEAN8Writer::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); -} diff --git a/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp b/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp deleted file mode 100644 index b5362496aa..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedUPCAReader.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_OneDReader.h" -#include "include/BC_OneDimReader.h" -#include "include/BC_OnedEAN13Reader.h" -#include "include/BC_OnedUPCAReader.h" -CBC_OnedUPCAReader::CBC_OnedUPCAReader() -{ - m_ean13Reader = NULL; -} -void CBC_OnedUPCAReader::Init() -{ - m_ean13Reader = FX_NEW CBC_OnedEAN13Reader; -} -CBC_OnedUPCAReader::~CBC_OnedUPCAReader() -{ - if(m_ean13Reader != NULL) { - delete m_ean13Reader; - } - m_ean13Reader = NULL; -} -CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CFX_ByteString temp = MaybeReturnResult(bytestring, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return temp; -} -CFX_ByteString CBC_OnedUPCAReader::DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString bytestring = m_ean13Reader->DecodeRow(rowNumber, row, startGuardRange, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CFX_ByteString temp = MaybeReturnResult(bytestring, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return temp; -} -CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) -{ - CFX_ByteString bytestring = m_ean13Reader->Decode(image, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CFX_ByteString temp = MaybeReturnResult(bytestring, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return temp; -} -CFX_ByteString CBC_OnedUPCAReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString bytestring = m_ean13Reader->Decode(image, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CFX_ByteString temp = MaybeReturnResult(bytestring, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return temp; -} -FX_INT32 CBC_OnedUPCAReader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e) -{ - FX_INT32 temp = m_ean13Reader->DecodeMiddle(row, startRange, resultString, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - return temp; -} -CFX_ByteString CBC_OnedUPCAReader::MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e) -{ - if(result[0] == '0') { - result.Delete(0); - return result; - } else { - e = BCExceptionFormatException; - return ""; - } - return ""; -} diff --git a/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp b/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp deleted file mode 100644 index bd7b4668a7..0000000000 --- a/xfa/src/fxbarcode/src/BC_OnedUPCAWriter.cpp +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_OneDimWriter.h" -#include "include/BC_OnedEAN13Writer.h" -#include "include/BC_OnedUPCAWriter.h" -CBC_OnedUPCAWriter::CBC_OnedUPCAWriter() -{ - m_subWriter = NULL; - m_bLeftPadding = TRUE; - m_bRightPadding = TRUE; -} -void CBC_OnedUPCAWriter::Init() -{ - m_subWriter = FX_NEW CBC_OnedEAN13Writer; -} -CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() -{ - if(m_subWriter != NULL) { - delete m_subWriter; - } - m_subWriter = NULL; -} -FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(FX_WSTR contents) -{ - FX_INT32 i = 0; - for (i = 0; i < contents.GetLength(); i++) { - if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') { - continue; - } else { - return FALSE; - } - } - return TRUE; -} -CFX_WideString CBC_OnedUPCAWriter::FilterContents(FX_WSTR contents) -{ - CFX_WideString filtercontents; - FX_WCHAR ch; - for (FX_INT32 i = 0; i < contents.GetLength(); i++) { - ch = contents.GetAt(i); - if(ch > 175) { - i++; - continue; - } - if (ch >= '0' && ch <= '9') { - filtercontents += ch; - } - } - return filtercontents; -} -FX_INT32 CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString &contents) -{ - FX_INT32 odd = 0; - FX_INT32 even = 0; - FX_INT32 j = 1; - for(FX_INT32 i = contents.GetLength() - 1; i >= 0; i--) { - if(j % 2) { - odd += FXSYS_atoi(contents.Mid(i, 1)); - } else { - even += FXSYS_atoi(contents.Mid(i, 1)); - } - j++; - } - FX_INT32 checksum = (odd * 3 + even) % 10; - checksum = (10 - checksum) % 10; - return (checksum); -} -FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - FX_BYTE *ret = Encode(contents, format, outWidth, outHeight, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -FX_BYTE *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - if (format != BCFORMAT_UPC_A) { - e = BCExceptionOnlyEncodeUPC_A; - return NULL; - } - CFX_ByteString toEAN13String = '0' + contents; - m_iDataLenth = 13; - FX_BYTE *ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth, outHeight, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return ret; -} -void CBC_OnedUPCAWriter::ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e) -{ - if (device == NULL && pOutBitmap == NULL) { - e = BCExceptionIllegalArgument; - return; - } - FX_INT32 leftPadding = 7 * multiple; - FX_INT32 leftPosition = 10 * multiple + leftPadding; - CFX_ByteString str = FX_UTF8Encode(contents); - FX_INT32 iLen = str.GetLength(); - FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen); - if (!pCharPos) { - return; - } - FXSYS_memset32(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen); - CFX_ByteString tempStr = str.Mid(1, 5); - FX_FLOAT strWidth = (FX_FLOAT)35 * multiple; - FX_FLOAT blank = 0.0; - CFX_FxgeDevice geBitmap; - if (pOutBitmap != NULL) { - geBitmap.Attach(pOutBitmap); - } - FX_FLOAT charsWidth = 0; - iLen = tempStr.GetLength(); - FX_INT32 iFontSize = (FX_INT32)fabs(m_fFontSize); - FX_INT32 iTextHeight = iFontSize + 1; - if (pOutBitmap == NULL) { - CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition + strWidth - 0.5), (FX_FLOAT)m_Height); - matr.Concat(*matrix); - matr.TransformRect(rect); - FX_RECT re = rect.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 40 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5), (FX_FLOAT)m_Height); - matr1.Concat(*matrix); - matr1.TransformRect(rect1); - re = rect1.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7; - CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height); - matr2.Concat(*matrix); - matr2.TransformRect(rect2); - re = rect2.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0); - CFX_FloatRect rect3((FX_FLOAT)(leftPosition + 85 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5), (FX_FLOAT)m_Height); - matr3.Concat(*matrix); - matr3.TransformRect(rect3); - re = rect3.GetOutterRect(); - device->FillRect(&re, m_backgroundColor); - } - if (pOutBitmap == NULL) { - strWidth = strWidth * m_outputHScale; - } - CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank); - CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize); - CFX_FxgeDevice ge; - if(pOutBitmap != NULL) { - ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 1, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos + 1, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(6, 5); - iLen = tempStr.GetLength(); - charsWidth = 0.0f; - CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank); - if(pOutBitmap != NULL) { - FX_RECT rect2(0, 0, (int)strWidth, iTextHeight); - ge.FillRect(&rect2, m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 6, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos + 6, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(0, 1); - iLen = tempStr.GetLength(); - strWidth = (FX_FLOAT)multiple * 7; - if (pOutBitmap == NULL) { - strWidth = strWidth * m_outputHScale; - } - CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank); - if(pOutBitmap != NULL) { - delete ge.GetBitmap(); - ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - tempStr = str.Mid(11, 1); - iLen = tempStr.GetLength(); - CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank); - if (pOutBitmap != NULL) { - delete ge.GetBitmap(); - ge.Create((int)strWidth, iTextHeight, FXDIB_Argb); - ge.GetBitmap()->Clear(m_backgroundColor); - ge.DrawNormalText(iLen, - pCharPos + 11, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix, - m_fontColor, FXTEXT_CLEARTYPE); - geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple, m_Height - iTextHeight); - } else { - CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize)); - if (matrix != NULL) { - affine_matrix1.Concat(*matrix); - } - device->DrawNormalText(iLen, - pCharPos + 11, - m_pFont, - CFX_GEModule::Get()->GetFontCache(), - (FX_FLOAT)iFontSize , - (CFX_AffineMatrix *) &affine_matrix1, - m_fontColor, FXTEXT_CLEARTYPE); - } - FX_Free(pCharPos); -} -void CBC_OnedUPCAWriter::RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e) -{ - CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e); -} - diff --git a/xfa/src/fxbarcode/src/BC_PDF417.cpp b/xfa/src/fxbarcode/src/BC_PDF417.cpp deleted file mode 100644 index 668835a694..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417.cpp +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Compaction.h" -#include "include/BC_PDF417BarcodeRow.h" -#include "include/BC_PDF417BarcodeMatrix.h" -#include "include/BC_PDF417ErrorCorrection.h" -#include "include/BC_PDF417HighLevelEncoder.h" -#include "include/BC_PDF417.h" -FX_INT32 CBC_PDF417::START_PATTERN = 0x1fea8; -FX_INT32 CBC_PDF417::STOP_PATTERN = 0x3fa29; -FX_INT32 CBC_PDF417::CODEWORD_TABLE[][1000] = { - { - 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, - 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, - 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, - 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, - 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, - 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, - 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, - 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, - 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, - 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, - 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, - 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, - 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, - 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, - 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, - 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, - 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, - 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, - 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, - 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, - 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, - 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, - 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, - 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, - 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, - 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, - 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, - 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, - 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, - 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, - 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, - 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, - 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, - 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, - 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, - 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, - 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, - 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, - 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, - 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, - 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, - 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, - 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, - 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, - 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, - 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, - 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, - 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, - 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, - 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, - 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, - 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, - 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, - 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, - 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, - 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, - 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, - 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, - 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, - 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, - 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, - 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, - 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, - 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, - 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, - 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, - 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, - 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, - 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, - 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, - 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, - 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, - 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, - 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, - 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, - 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, - 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, - 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, - 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, - 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, - 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, - 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, - 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, - 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, - 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, - 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, - 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, - 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, - 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, - 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, - 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, - 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, - 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, - 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, - 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, - 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, - 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, - 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, - 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, - 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, - 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, - 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, - 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, - 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, - 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, - 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, - 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, - 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, - 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, - 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, - 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, - 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, - 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, - 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, - 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, - 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, - 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, - 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, - 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, - 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, - 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, - 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, - 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, - 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, - 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, - 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, - 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, - 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, - 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, - 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, - 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, - 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, - 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, - 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, - 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, - 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, - 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, - 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, - 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, - 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, - 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, - 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, - 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, - 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, - 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, - 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, - 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, - 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, - 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, - 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, - 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, - 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, - 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, - 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, - 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4 - }, - { - 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, - 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, - 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, - 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, - 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, - 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, - 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, - 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, - 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, - 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, - 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, - 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, - 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, - 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, - 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, - 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, - 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, - 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, - 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, - 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, - 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, - 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, - 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, - 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, - 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, - 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, - 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, - 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, - 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, - 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, - 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, - 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, - 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, - 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, - 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, - 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, - 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, - 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, - 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, - 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, - 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, - 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, - 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, - 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, - 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, - 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, - 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, - 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, - 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, - 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, - 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, - 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, - 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, - 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, - 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, - 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, - 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, - 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, - 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, - 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, - 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, - 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, - 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, - 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, - 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, - 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, - 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, - 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, - 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, - 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, - 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, - 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, - 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, - 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, - 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, - 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, - 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, - 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, - 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, - 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, - 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, - 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, - 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, - 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, - 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, - 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, - 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, - 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, - 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, - 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, - 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, - 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, - 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, - 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, - 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, - 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, - 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, - 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, - 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, - 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, - 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, - 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, - 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, - 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, - 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, - 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, - 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, - 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, - 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, - 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, - 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, - 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, - 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, - 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, - 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, - 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, - 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, - 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, - 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, - 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, - 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, - 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, - 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, - 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, - 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, - 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, - 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, - 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, - 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, - 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, - 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, - 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, - 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, - 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, - 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, - 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, - 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, - 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, - 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, - 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, - 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, - 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, - 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, - 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, - 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, - 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, - 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, - 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, - 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, - 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, - 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, - 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, - 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, - 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, - 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26 - }, - { - 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, - 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, - 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, - 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, - 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, - 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, - 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, - 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, - 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, - 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, - 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, - 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, - 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, - 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, - 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, - 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, - 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, - 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, - 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, - 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, - 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, - 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, - 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, - 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, - 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, - 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, - 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, - 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, - 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, - 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, - 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, - 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, - 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, - 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, - 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, - 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, - 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, - 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, - 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, - 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, - 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, - 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, - 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, - 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, - 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, - 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, - 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, - 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, - 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, - 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, - 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, - 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, - 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, - 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, - 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, - 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, - 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, - 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, - 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, - 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, - 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, - 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, - 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, - 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, - 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, - 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, - 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, - 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, - 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, - 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, - 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, - 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, - 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, - 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, - 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, - 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, - 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, - 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, - 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, - 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, - 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, - 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, - 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, - 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, - 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, - 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, - 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, - 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, - 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, - 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, - 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, - 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, - 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, - 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, - 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, - 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, - 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, - 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, - 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, - 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, - 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, - 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, - 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, - 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, - 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, - 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, - 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, - 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, - 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, - 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, - 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, - 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, - 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, - 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, - 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, - 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, - 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, - 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, - 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, - 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, - 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, - 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, - 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, - 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, - 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, - 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, - 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, - 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, - 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, - 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, - 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, - 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, - 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, - 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, - 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, - 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, - 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, - 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, - 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, - 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, - 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, - 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, - 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, - 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, - 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, - 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, - 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, - 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, - 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, - 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, - 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, - 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, - 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, - 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, - 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea - } -}; -FX_FLOAT CBC_PDF417::PREFERRED_RATIO = 3.0f; -FX_FLOAT CBC_PDF417::DEFAULT_MODULE_WIDTH = 0.357f; -FX_FLOAT CBC_PDF417::HEIGHT = 2.0f; -CBC_PDF417::CBC_PDF417() -{ - m_compact = FALSE; - m_compaction = AUTO; - m_minCols = 1; - m_maxCols = 30; - m_maxRows = 90; - m_minRows = 3; - m_barcodeMatrix = NULL; -} -CBC_PDF417::CBC_PDF417(FX_BOOL compact) -{ - m_compact = compact; - m_compaction = AUTO; - m_minCols = 1; - m_maxCols = 30; - m_maxRows = 90; - m_minRows = 3; - m_barcodeMatrix = NULL; -} -CBC_PDF417::~CBC_PDF417() -{ - if (m_barcodeMatrix) { - delete m_barcodeMatrix; - } -} -CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() -{ - return m_barcodeMatrix; -} -void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e) -{ - FX_INT32 errorCorrectionCodeWords = CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(errorCorrectionLevel, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CFX_WideString highLevel = CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 sourceCodeWords = highLevel.GetLength(); - CFX_Int32Array* dimension = determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 cols = dimension->GetAt(0); - FX_INT32 rows = dimension->GetAt(1); - delete dimension; - FX_INT32 pad = getNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows); - if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { - e = BCExceptionEncodedMessageContainsTooManyCodeWords; - return; - } - FX_INT32 n = sourceCodeWords + pad + 1; - CFX_WideString sb; - sb += (FX_WCHAR) n; - sb += highLevel; - for (FX_INT32 i = 0; i < pad; i++) { - sb += (FX_WCHAR) 900; - } - CFX_WideString dataCodewords(sb); - CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(dataCodewords, errorCorrectionLevel, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CFX_WideString fullCodewords = dataCodewords + ec; - m_barcodeMatrix = FX_NEW CBC_BarcodeMatrix(rows, cols); - encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel, m_barcodeMatrix); -} -void CBC_PDF417::setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows) -{ - m_maxCols = maxCols; - m_minCols = minCols; - m_maxRows = maxRows; - m_minRows = minRows; -} -void CBC_PDF417::setCompaction(Compaction compaction) -{ - m_compaction = compaction; -} -void CBC_PDF417::setCompact(FX_BOOL compact) -{ - m_compact = compact; -} -FX_INT32 CBC_PDF417::calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c) -{ - FX_INT32 r = ((m + 1 + k) / c) + 1; - if (c * r >= (m + 1 + k + c)) { - r--; - } - return r; -} -FX_INT32 CBC_PDF417::getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r) -{ - FX_INT32 n = c * r - k; - return n > m + 1 ? n - m - 1 : 0; -} -void CBC_PDF417::encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic) -{ - FX_INT32 map = 1 << (len - 1); - FX_BOOL last = ((pattern & map) != 0); - FX_INT32 width = 0; - for (FX_INT32 i = 0; i < len; i++) { - FX_BOOL black = ((pattern & map) != 0); - if (last == black) { - width++; - } else { - logic->addBar(last, width); - last = black; - width = 1; - } - map >>= 1; - } - logic->addBar(last, width); -} -void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic) -{ - FX_INT32 idx = 0; - for (FX_INT32 y = 0; y < r; y++) { - FX_INT32 cluster = y % 3; - logic->startRow(); - FX_INT32 a = START_PATTERN; - encodeChar(START_PATTERN, 17, logic->getCurrentRow()); - FX_INT32 left; - FX_INT32 right; - if (cluster == 0) { - left = (30 * (y / 3)) + ((r - 1) / 3); - right = (30 * (y / 3)) + (c - 1); - } else if (cluster == 1) { - left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); - right = (30 * (y / 3)) + ((r - 1) / 3); - } else { - left = (30 * (y / 3)) + (c - 1); - right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); - } - FX_INT32 pattern = CODEWORD_TABLE[cluster][left]; - encodeChar(pattern, 17, logic->getCurrentRow()); - for (FX_INT32 x = 0; x < c; x++) { - pattern = CODEWORD_TABLE[cluster][fullCodewords.GetAt(idx)]; - encodeChar(pattern, 17, logic->getCurrentRow()); - idx++; - } - if (m_compact) { - encodeChar(STOP_PATTERN, 1, logic->getCurrentRow()); - } else { - pattern = CODEWORD_TABLE[cluster][right]; - encodeChar(pattern, 17, logic->getCurrentRow()); - encodeChar(STOP_PATTERN, 18, logic->getCurrentRow()); - } - } -} -CFX_Int32Array* CBC_PDF417::determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e) -{ - FX_FLOAT ratio = 0.0f; - CFX_Int32Array* dimension = NULL; - for (FX_INT32 cols = m_minCols; cols <= m_maxCols; cols++) { - FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); - if (rows < m_minRows) { - break; - } - if (rows > m_maxRows) { - continue; - } - FX_FLOAT newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); - if (dimension != NULL && fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) { - continue; - } - ratio = newRatio; - if (dimension) { - delete dimension; - } - dimension = FX_NEW CFX_Int32Array; - dimension->Add(cols); - dimension->Add(rows); - } - if (dimension == NULL) { - FX_INT32 rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, m_minCols); - if (rows < m_minRows) { - dimension = FX_NEW CFX_Int32Array; - dimension->Add(m_minCols); - dimension->Add(m_minRows); - } else if (rows >= 3 && rows <= 90) { - dimension = FX_NEW CFX_Int32Array; - dimension->Add(m_minCols); - dimension->Add(rows); - } - } - if (dimension == NULL) { - e = BCExceptionUnableToFitMessageInColumns; - return NULL; - } - return dimension; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp deleted file mode 100644 index 342d1ec2b2..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMatrix.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417BarcodeRow.h" -#include "include/BC_PDF417BarcodeMatrix.h" -CBC_BarcodeMatrix::CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width) -{ - m_matrix.SetSize(height + 2); - for (FX_INT32 i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength; i++) { - m_matrix[i] = FX_NEW CBC_BarcodeRow((width + 4) * 17 + 1); - } - m_width = width * 17; - m_height = height + 2; - m_currentRow = 0; - m_outHeight = 0; - m_outWidth = 0; -} -CBC_BarcodeMatrix::~CBC_BarcodeMatrix() -{ - for (FX_INT32 i = 0; i < m_matrix.GetSize(); i++) { - delete (CBC_BarcodeRow*)m_matrix.GetAt(i); - } - m_matrix.RemoveAll(); - m_matrixOut.RemoveAll(); -} -void CBC_BarcodeMatrix::set(FX_INT32 x, FX_INT32 y, FX_BYTE value) -{ - ((CBC_BarcodeRow*)m_matrix[y])->set(x, value); -} -void CBC_BarcodeMatrix::setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black) -{ - set(x, y, (FX_BYTE) (black ? 1 : 0)); -} -void CBC_BarcodeMatrix::startRow() -{ - ++m_currentRow; -} -CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow() -{ - return (CBC_BarcodeRow*)m_matrix[m_currentRow]; -} -FX_INT32 CBC_BarcodeMatrix::getWidth() -{ - return m_outWidth; -} -FX_INT32 CBC_BarcodeMatrix::getHeight() -{ - return m_outHeight; -} -CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() -{ - return getScaledMatrix(1, 1); -} -CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 scale) -{ - return getScaledMatrix(scale, scale); -} -CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale) -{ - FX_INT32 yMax = m_height * yScale; - CFX_ByteArray bytearray; - bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale)); - FX_INT32 xMax = bytearray.GetSize(); - m_matrixOut.SetSize(xMax * yMax); - m_outWidth = xMax; - m_outHeight = yMax; - FX_INT32 k = 0; - for (FX_INT32 i = 0; i < yMax; i++) { - if (i != 0) { - bytearray.Copy(((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale)); - } - k = i * xMax; - for (FX_INT32 l = 0; l < xMax; l++) { - m_matrixOut[k + l] = bytearray.GetAt(l); - } - } - return m_matrixOut; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp deleted file mode 100644 index 50f3a1e2c2..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417BarcodeMetadata.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417BarcodeMetadata.h" -CBC_BarcodeMetadata::CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel) -{ - m_columnCount = columnCount; - m_rowCountUpperPart = rowCountUpperPart; - m_rowCountLowerPart = rowCountLowerPart; - m_errorCorrectionLevel = errorCorrectionLevel; - m_rowCount = m_rowCountUpperPart + m_rowCountLowerPart; -} -CBC_BarcodeMetadata::~CBC_BarcodeMetadata() -{ -} -FX_INT32 CBC_BarcodeMetadata::getColumnCount() -{ - return m_columnCount; -} -FX_INT32 CBC_BarcodeMetadata::getErrorCorrectionLevel() -{ - return m_errorCorrectionLevel; -} -FX_INT32 CBC_BarcodeMetadata::getRowCount() -{ - return m_rowCount; -} -FX_INT32 CBC_BarcodeMetadata::getRowCountUpperPart() -{ - return m_rowCountUpperPart; -} -FX_INT32 CBC_BarcodeMetadata::getRowCountLowerPart() -{ - return m_rowCountLowerPart; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp deleted file mode 100644 index eec89010ab..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417BarcodeRow.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417BarcodeRow.h" -CBC_BarcodeRow::CBC_BarcodeRow(FX_INT32 width) -{ - m_row.SetSize(width); - m_currentLocation = 0; -} -CBC_BarcodeRow::~CBC_BarcodeRow() -{ - m_output.RemoveAll(); - m_row.RemoveAll(); -} -void CBC_BarcodeRow::set(FX_INT32 x, FX_BYTE value) -{ - m_row.SetAt(x, value); -} -void CBC_BarcodeRow::set(FX_INT32 x, FX_BOOL black) -{ - m_row.SetAt(x, (FX_BYTE) (black ? 1 : 0)); -} -void CBC_BarcodeRow::addBar(FX_BOOL black, FX_INT32 width) -{ - for (FX_INT32 ii = 0; ii < width; ii++) { - set(m_currentLocation++, black); - } -} -CFX_ByteArray& CBC_BarcodeRow::getRow() -{ - return m_row; -} -CFX_ByteArray& CBC_BarcodeRow::getScaledRow(FX_INT32 scale) -{ - m_output.SetSize(m_row.GetSize() * scale); - for (FX_INT32 i = 0; i < m_output.GetSize(); i++) { - m_output[i] = (m_row[i / scale]); - } - return m_output; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp b/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp deleted file mode 100644 index d861365b17..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417BarcodeValue.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417BarcodeValue.h" -CBC_BarcodeValue::CBC_BarcodeValue() -{ -} -CBC_BarcodeValue::~CBC_BarcodeValue() -{ -} -void CBC_BarcodeValue::setValue(FX_INT32 value) -{ - FX_INT32 confidence = 0; - for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { - if (m_keys.GetAt(i) == value) { - confidence = m_values.GetAt(i); - m_values.SetAt(i, confidence + 1); - return; - } - } - confidence = 1; - m_keys.Add(value); - m_values.Add(confidence); -} -CFX_Int32Array* CBC_BarcodeValue::getValue() -{ - FX_INT32 maxConfidence = -1; - CFX_Int32Array* result = FX_NEW CFX_Int32Array; - for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) { - if (m_values.GetAt(i) > maxConfidence) { - maxConfidence = m_values.GetAt(i); - result->RemoveAll(); - result->Add(m_keys.GetAt(i)); - } else if (m_values.GetAt(i) == maxConfidence) { - result->Add(m_keys.GetAt(i)); - } - } - return result; -} -FX_INT32 CBC_BarcodeValue::getConfidence(FX_INT32 value) -{ - for (FX_INT32 i = 0; i < m_keys.GetSize(); i++) - if (m_keys.GetAt(i) == value) { - return m_values.GetAt(i); - } - return -1; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp b/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp deleted file mode 100644 index be3f3277e3..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417BoundingBox.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417BoundingBox.h" -CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e) -{ - if ((topLeft == NULL && topRight == NULL) || - (bottomLeft == NULL && bottomRight == NULL) || - (topLeft != NULL && bottomLeft == NULL) || - (topRight != NULL && bottomRight == NULL)) { - e = BCExceptionNotFoundInstance; - } - init(image, topLeft, bottomLeft, topRight, bottomRight); -} -CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) -{ - init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft, boundingBox->m_topRight, boundingBox->m_bottomRight); -} -CBC_BoundingBox::~CBC_BoundingBox() -{ - if (m_topLeft) { - delete m_topLeft; - } - if (m_bottomLeft) { - delete m_bottomLeft; - } - if (m_topRight) { - delete m_topRight; - } - if (m_bottomRight) { - delete m_bottomRight; - } -} -CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e) -{ - CBC_BoundingBox* boundingBox = NULL; - if (leftBox == NULL) { - boundingBox = FX_NEW CBC_BoundingBox(rightBox); - return boundingBox; - } - if (rightBox == NULL) { - boundingBox = FX_NEW CBC_BoundingBox(leftBox); - return boundingBox; - } - boundingBox = FX_NEW CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft, leftBox->m_bottomLeft, rightBox->m_topRight, rightBox->m_bottomRight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return boundingBox; -} -CBC_BoundingBox* CBC_BoundingBox::addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e) -{ - CBC_ResultPoint* newTopLeft = m_topLeft; - CBC_ResultPoint* newBottomLeft = m_bottomLeft; - CBC_ResultPoint* newTopRight = m_topRight; - CBC_ResultPoint* newBottomRight = m_bottomRight; - CBC_ResultPoint* newTop = NULL; - CBC_ResultPoint* newBottom = NULL; - if (missingStartRows > 0) { - CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight; - FX_INT32 newMinY = (FX_INT32) top->GetY() - missingStartRows; - if (newMinY < 0) { - newMinY = 0; - } - newTop = FX_NEW CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY); - if (isLeft) { - newTopLeft = newTop; - } else { - newTopRight = newTop; - } - } - if (missingEndRows > 0) { - CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight; - FX_INT32 newMaxY = (FX_INT32) bottom->GetY() + missingEndRows; - if (newMaxY >= m_image->GetHeight()) { - newMaxY = m_image->GetHeight() - 1; - } - newBottom = FX_NEW CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY); - if (isLeft) { - newBottomLeft = newBottom; - } else { - newBottomRight = newBottom; - } - } - calculateMinMaxValues(); - CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e); - delete newTop; - delete newBottom; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return boundingBox; -} -void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) -{ - if (m_topRight) { - delete m_topRight; - } - m_topRight = FX_NEW CBC_ResultPoint(topRight.GetX(), topRight.GetY()); - calculateMinMaxValues(); -} -void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) -{ - if (m_bottomRight) { - delete m_bottomRight; - } - m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY()); - calculateMinMaxValues(); -} -FX_INT32 CBC_BoundingBox::getMinX() -{ - return m_minX; -} -FX_INT32 CBC_BoundingBox::getMaxX() -{ - return m_maxX; -} -FX_INT32 CBC_BoundingBox::getMinY() -{ - return m_minY; -} -FX_INT32 CBC_BoundingBox::getMaxY() -{ - return m_maxY; -} -CBC_ResultPoint* CBC_BoundingBox::getTopLeft() -{ - return m_topLeft; -} -CBC_ResultPoint* CBC_BoundingBox::getTopRight() -{ - return m_topRight; -} -CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() -{ - return m_bottomLeft; -} -CBC_ResultPoint* CBC_BoundingBox::getBottomRight() -{ - return m_bottomRight; -} -void CBC_BoundingBox::init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight) -{ - m_topLeft = NULL; - m_bottomLeft = NULL; - m_topRight = NULL; - m_bottomRight = NULL; - m_image = image; - if (topLeft) { - m_topLeft = FX_NEW CBC_ResultPoint(topLeft->GetX(), topLeft->GetY()); - } - if (bottomLeft) { - m_bottomLeft = FX_NEW CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY()); - } - if (topRight) { - m_topRight = FX_NEW CBC_ResultPoint(topRight->GetX(), topRight->GetY()); - } - if (bottomRight) { - m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY()); - } - calculateMinMaxValues(); -} -void CBC_BoundingBox::calculateMinMaxValues() -{ - if (m_topLeft == NULL) { - m_topLeft = FX_NEW CBC_ResultPoint(0, m_topRight->GetY()); - m_bottomLeft = FX_NEW CBC_ResultPoint(0, m_bottomRight->GetY()); - } else if (m_topRight == NULL) { - m_topRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_topLeft->GetY()); - m_bottomRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_bottomLeft->GetY()); - } - m_minX = (FX_INT32) (m_topLeft->GetX() < m_bottomLeft->GetX() ? m_topLeft->GetX() : m_bottomLeft->GetX()); - m_maxX = (FX_INT32) (m_topRight->GetX() > m_bottomRight->GetX() ? m_topRight->GetX() : m_bottomRight->GetX()); - m_minY = (FX_INT32) (m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY() : m_topRight->GetY()); - m_maxY = (FX_INT32) (m_bottomLeft->GetY() > m_bottomRight->GetY() ? m_bottomLeft->GetY() : m_bottomRight->GetY()); -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp b/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp deleted file mode 100644 index 529e41f432..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Codeword.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Codeword.h" -FX_INT32 CBC_Codeword::BARCODE_ROW_UNKNOWN = -1; -CBC_Codeword::CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 cvalue) -{ - m_startX = startX; - m_endX = endX; - m_bucket = bucket; - m_value = cvalue; - m_rowNumber = BARCODE_ROW_UNKNOWN; -} -CBC_Codeword::~CBC_Codeword() -{ -} -FX_BOOL CBC_Codeword::hasValidRowNumber() -{ - return isValidRowNumber(m_rowNumber); -} -FX_BOOL CBC_Codeword::isValidRowNumber(FX_INT32 rowNumber) -{ - return m_rowNumber != BARCODE_ROW_UNKNOWN && m_bucket == (m_rowNumber % 3) * 3; -} -void CBC_Codeword::setRowNumberAsRowIndicatorColumn() -{ - m_rowNumber = (m_value / 30) * 3 + m_bucket / 3; -} -FX_INT32 CBC_Codeword::getWidth() -{ - return m_endX - m_startX; -} -FX_INT32 CBC_Codeword::getStartX() -{ - return m_startX; -} -FX_INT32 CBC_Codeword::getEndX() -{ - return m_endX; -} -FX_INT32 CBC_Codeword::getBucket() -{ - return m_bucket; -} -FX_INT32 CBC_Codeword::getValue() -{ - return m_value; -} -FX_INT32 CBC_Codeword::getRowNumber() -{ - return m_rowNumber; -} -void CBC_Codeword::setRowNumber(FX_INT32 rowNumber) -{ - m_rowNumber = rowNumber; -} -CFX_ByteString CBC_Codeword::toString() -{ - return m_rowNumber + (FX_CHAR)'|' + m_value; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp deleted file mode 100644 index ca458210f4..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417CodewordDecoder.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417CodewordDecoder.h" -#define SYMBOL_TABLE_Length 2787 -#define Float_MAX_VALUE 2147483647 -FX_FLOAT CBC_PDF417CodewordDecoder::RATIOS_TABLE[2787][8] = {0}; -CBC_PDF417CodewordDecoder::CBC_PDF417CodewordDecoder() -{ -} -CBC_PDF417CodewordDecoder::~CBC_PDF417CodewordDecoder() -{ -} -void CBC_PDF417CodewordDecoder::Initialize() -{ - for (FX_INT32 i = 0; i < SYMBOL_TABLE_Length; i++) { - FX_INT32 currentSymbol = CBC_PDF417Common::SYMBOL_TABLE[i]; - FX_INT32 currentBit = currentSymbol & 0x1; - for (FX_INT32 j = 0; j < CBC_PDF417Common::BARS_IN_MODULE; j++) { - FX_FLOAT size = 0.0f; - while ((currentSymbol & 0x1) == currentBit) { - size += 1.0f; - currentSymbol >>= 1; - } - currentBit = currentSymbol & 0x1; - RATIOS_TABLE[i][CBC_PDF417Common::BARS_IN_MODULE - j - 1] = size / CBC_PDF417Common::MODULES_IN_CODEWORD; - } - } -} -void CBC_PDF417CodewordDecoder::Finalize() -{ -} -FX_INT32 CBC_PDF417CodewordDecoder::getDecodedValue(CFX_Int32Array& moduleBitCount) -{ - CFX_Int32Array* array = sampleBitCounts(moduleBitCount); - FX_INT32 decodedValue = getDecodedCodewordValue(*array); - delete array; - if (decodedValue != -1) { - return decodedValue; - } - return getClosestDecodedValue(moduleBitCount); -} -CFX_Int32Array* CBC_PDF417CodewordDecoder::sampleBitCounts(CFX_Int32Array& moduleBitCount) -{ - FX_FLOAT bitCountSum = (FX_FLOAT)CBC_PDF417Common::getBitCountSum(moduleBitCount); - CFX_Int32Array* bitCount = FX_NEW CFX_Int32Array(); - bitCount->SetSize(CBC_PDF417Common::BARS_IN_MODULE); - FX_INT32 bitCountIndex = 0; - FX_INT32 sumPreviousBits = 0; - for (FX_INT32 i = 0; i < CBC_PDF417Common::MODULES_IN_CODEWORD; i++) { - FX_FLOAT sampleIndex = bitCountSum / (2 * CBC_PDF417Common::MODULES_IN_CODEWORD) + (i * bitCountSum) / CBC_PDF417Common::MODULES_IN_CODEWORD; - if (sumPreviousBits + moduleBitCount.GetAt(bitCountIndex) <= sampleIndex) { - sumPreviousBits += moduleBitCount.GetAt(bitCountIndex); - bitCountIndex++; - } - bitCount->SetAt(bitCountIndex, bitCount->GetAt(bitCountIndex) + 1); - } - return bitCount; -} -FX_INT32 CBC_PDF417CodewordDecoder::getDecodedCodewordValue(CFX_Int32Array& moduleBitCount) -{ - FX_INT32 decodedValue = getBitValue(moduleBitCount); - return CBC_PDF417Common::getCodeword(decodedValue) == -1 ? -1 : decodedValue; -} -FX_INT32 CBC_PDF417CodewordDecoder::getBitValue(CFX_Int32Array& moduleBitCount) -{ - FX_INT64 result = 0; - for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { - for (FX_INT32 bit = 0; bit < moduleBitCount.GetAt(i); bit++) { - result = (result << 1) | (i % 2 == 0 ? 1 : 0); - } - } - return (FX_INT32) result; -} -FX_INT32 CBC_PDF417CodewordDecoder::getClosestDecodedValue(CFX_Int32Array& moduleBitCount) -{ - FX_INT32 bitCountSum = CBC_PDF417Common::getBitCountSum(moduleBitCount); - CFX_FloatArray bitCountRatios; - bitCountRatios.SetSize(CBC_PDF417Common::BARS_IN_MODULE); - for (FX_INT32 i = 0; i < bitCountRatios.GetSize(); i++) { - bitCountRatios[i] = moduleBitCount.GetAt(i) / (FX_FLOAT) bitCountSum; - } - FX_FLOAT bestMatchError = (FX_FLOAT)Float_MAX_VALUE; - FX_INT32 bestMatch = -1; - for (FX_INT32 j = 0; j < SYMBOL_TABLE_Length; j++) { - FX_FLOAT error = 0.0f; - for (FX_INT32 k = 0; k < CBC_PDF417Common::BARS_IN_MODULE; k++) { - FX_FLOAT diff = RATIOS_TABLE[j][k] - bitCountRatios[k]; - error += diff * diff; - } - if (error < bestMatchError) { - bestMatchError = error; - bestMatch = CBC_PDF417Common::SYMBOL_TABLE[j]; - } - } - return bestMatch; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Common.cpp b/xfa/src/fxbarcode/src/BC_PDF417Common.cpp deleted file mode 100644 index f195e4b4ef..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Common.cpp +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -FX_INT32 CBC_PDF417Common::NUMBER_OF_CODEWORDS = 929; -FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1; -FX_INT32 CBC_PDF417Common::MIN_ROWS_IN_BARCODE = 3; -FX_INT32 CBC_PDF417Common::MAX_ROWS_IN_BARCODE = 90; -FX_INT32 CBC_PDF417Common::MAX_CODEWORDS_IN_ROW = 32; -FX_INT32 CBC_PDF417Common::MODULES_IN_CODEWORD = 17; -FX_INT32 CBC_PDF417Common::MODULES_IN_STOP_PATTERN = 18; -FX_INT32 CBC_PDF417Common::BARS_IN_MODULE = 8; -CFX_Int32Array* CBC_PDF417Common::EMPTY_INT_ARRAY = NULL; -FX_INT32 CBC_PDF417Common::SYMBOL_TABLE[] = { - 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, - 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, - 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, - 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, - 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, - 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, - 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, - 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, - 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, - 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, - 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, - 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, - 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, - 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, - 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, - 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, - 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, - 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, - 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, - 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, - 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, - 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, - 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, - 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, - 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, - 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, - 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, - 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, - 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, - 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, - 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, - 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, - 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, - 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, - 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, - 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, - 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, - 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, - 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, - 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, - 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, - 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, - 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, - 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, - 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, - 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, - 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, - 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, - 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, - 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, - 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, - 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, - 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, - 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, - 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, - 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, - 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, - 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, - 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, - 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, - 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, - 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, - 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, - 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, - 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, - 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, - 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, - 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, - 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, - 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, - 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, - 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, - 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, - 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, - 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, - 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, - 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, - 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, - 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, - 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, - 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, - 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, - 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, - 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, - 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, - 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, - 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, - 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, - 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, - 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, - 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, - 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, - 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, - 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, - 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, - 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, - 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, - 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, - 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, - 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, - 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, - 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, - 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, - 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, - 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, - 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, - 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, - 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, - 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, - 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, - 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, - 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, - 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, - 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, - 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, - 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, - 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, - 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, - 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, - 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, - 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, - 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, - 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, - 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, - 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, - 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, - 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, - 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, - 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, - 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, - 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, - 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, - 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, - 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, - 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, - 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, - 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, - 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, - 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, - 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, - 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, - 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, - 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, - 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, - 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, - 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, - 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, - 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, - 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, - 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, - 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, - 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, - 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, - 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, - 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, - 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, - 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, - 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, - 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, - 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, - 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, - 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, - 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, - 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, - 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, - 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, - 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, - 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, - 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, - 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, - 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, - 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, - 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, - 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, - 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, - 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, - 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, - 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, - 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, - 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, - 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, - 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, - 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, - 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, - 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, - 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, - 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, - 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, - 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, - 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, - 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, - 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, - 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, - 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, - 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, - 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, - 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, - 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, - 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, - 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, - 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, - 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, - 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, - 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, - 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, - 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, - 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, - 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, - 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, - 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, - 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, - 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, - 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, - 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, - 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, - 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, - 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, - 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, - 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, - 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, - 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, - 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, - 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, - 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, - 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, - 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, - 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, - 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, - 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, - 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, - 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, - 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, - 0x1fba8, 0x1fbb6, 0x1fbda -}; -FX_INT32 CBC_PDF417Common::CODEWORD_TABLE[] = { - 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, - 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, - 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, - 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, - 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, - 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, - 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, - 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, - 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, - 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, - 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, - 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, - 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, - 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, - 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, - 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, - 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, - 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, - 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, - 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, - 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, - 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, - 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, - 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, - 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, - 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, - 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, - 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, - 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, - 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, - 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, - 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, - 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, - 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, - 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, - 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, - 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, - 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, - 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, - 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, - 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, - 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, - 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, - 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, - 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, - 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, - 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, - 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, - 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, - 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, - 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, - 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, - 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, - 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, - 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, - 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, - 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, - 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, - 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, - 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, - 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, - 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, - 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, - 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, - 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, - 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, - 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, - 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, - 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, - 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, - 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, - 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, - 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, - 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, - 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, - 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, - 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, - 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, - 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, - 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, - 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, - 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, - 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, - 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, - 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, - 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, - 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, - 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, - 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, - 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, - 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, - 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, - 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, - 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, - 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, - 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, - 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, - 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, - 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, - 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, - 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, - 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, - 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, - 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, - 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, - 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, - 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, - 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, - 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, - 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, - 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, - 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, - 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, - 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, - 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, - 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, - 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, - 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, - 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, - 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, - 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, - 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, - 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, - 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, - 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, - 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, - 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, - 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, - 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, - 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, - 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, - 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, - 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, - 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, - 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, - 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, - 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, - 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, - 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, - 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700 -}; -CBC_PDF417Common::CBC_PDF417Common() -{ -} -CBC_PDF417Common::~CBC_PDF417Common() -{ -} -FX_INT32 CBC_PDF417Common::getBitCountSum(CFX_Int32Array& moduleBitCount) -{ - FX_INT32 bitCountSum = 0; - for (FX_INT32 i = 0; i < moduleBitCount.GetSize(); i++) { - FX_INT32 count = moduleBitCount.GetAt(i); - bitCountSum += count; - } - return bitCountSum; -} -FX_INT32 CBC_PDF417Common::getCodeword(FX_DWORD symbol) -{ - FX_DWORD sym = symbol & 0x3FFFF; - FX_INT32 i = findCodewordIndex(sym); - if (i == -1) { - return -1; - } - return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS; -} -FX_INT32 CBC_PDF417Common::findCodewordIndex(FX_DWORD symbol) -{ - FX_INT32 first = 0; - FX_INT32 upto = sizeof(SYMBOL_TABLE) / sizeof(SYMBOL_TABLE[0]); - while (first < upto) { - FX_INT32 mid = ((FX_DWORD)(first + upto)) >> 1; - if (symbol < (FX_DWORD)SYMBOL_TABLE[mid]) { - upto = mid; - } else if (symbol > (FX_DWORD)SYMBOL_TABLE[mid]) { - first = mid + 1; - } else { - return mid; - } - } - return -1; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp b/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp deleted file mode 100644 index 1ff93dd55c..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Compaction.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Compaction.h" -CBC_Compaction::CBC_Compaction() -{ -} -CBC_Compaction::~CBC_Compaction() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp deleted file mode 100644 index e3583bcddc..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417DecodedBitStreamParser.cpp +++ /dev/null @@ -1,485 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "barcode.h" -#include "include/BC_DecoderResult.h" -#include "include/BC_PDF417ResultMetadata.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "../../../../third_party/bigint/BigIntegerLibrary.hh" -#define TEXT_COMPACTION_MODE_LATCH 900 -#define BYTE_COMPACTION_MODE_LATCH 901 -#define NUMERIC_COMPACTION_MODE_LATCH 902 -#define BYTE_COMPACTION_MODE_LATCH_6 924 -#define BEGIN_MACRO_PDF417_CONTROL_BLOCK 928 -#define BEGIN_MACRO_PDF417_OPTIONAL_FIELD 923 -#define MACRO_PDF417_TERMINATOR 922 -#define MODE_SHIFT_TO_BYTE_COMPACTION_MODE 913 - -FX_INT32 CBC_DecodedBitStreamPaser::MAX_NUMERIC_CODEWORDS = 15; -FX_INT32 CBC_DecodedBitStreamPaser::NUMBER_OF_SEQUENCE_CODEWORDS = 2; -FX_INT32 CBC_DecodedBitStreamPaser::PL = 25; -FX_INT32 CBC_DecodedBitStreamPaser::LL = 27; -FX_INT32 CBC_DecodedBitStreamPaser::AS = 27; -FX_INT32 CBC_DecodedBitStreamPaser::ML = 28; -FX_INT32 CBC_DecodedBitStreamPaser::AL = 28; -FX_INT32 CBC_DecodedBitStreamPaser::PS = 29; -FX_INT32 CBC_DecodedBitStreamPaser::PAL = 29; -FX_CHAR CBC_DecodedBitStreamPaser::PUNCT_CHARS[29] = { - ';', '<', '>', '@', '[', '\\', '}', '_', '`', '~', '!', - '\r', '\t', ',', ':', '\n', '-', '.', '$', '/', '"', '|', '*', - '(', ')', '?', '{', '}', '\'' -}; -FX_CHAR CBC_DecodedBitStreamPaser::MIXED_CHARS[30] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', - '\r', '\t', ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', - '=', '^' -}; -void CBC_DecodedBitStreamPaser::Initialize() -{ -} -void CBC_DecodedBitStreamPaser::Finalize() -{ -} -CBC_DecodedBitStreamPaser::CBC_DecodedBitStreamPaser() -{ -} -CBC_DecodedBitStreamPaser::~CBC_DecodedBitStreamPaser() -{ -} -CBC_CommonDecoderResult* CBC_DecodedBitStreamPaser::decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e) -{ - CFX_ByteString result; - FX_INT32 codeIndex = 1; - FX_INT32 code = codewords.GetAt(codeIndex); - codeIndex++; - CBC_PDF417ResultMetadata* resultMetadata = FX_NEW CBC_PDF417ResultMetadata; - while (codeIndex < codewords[0]) { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - codeIndex = textCompaction(codewords, codeIndex, result); - break; - case BYTE_COMPACTION_MODE_LATCH: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - case NUMERIC_COMPACTION_MODE_LATCH: - codeIndex = numericCompaction(codewords, codeIndex, result, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - case BYTE_COMPACTION_MODE_LATCH_6: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - case BEGIN_MACRO_PDF417_CONTROL_BLOCK: - codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata, e); - if (e != BCExceptionNO) { - delete resultMetadata; - return NULL; - } - break; - default: - codeIndex--; - codeIndex = textCompaction(codewords, codeIndex, result); - break; - } - if (codeIndex < codewords.GetSize()) { - code = codewords[codeIndex++]; - } else { - e = BCExceptionFormatInstance; - delete resultMetadata; - return NULL; - } - } - if (result.GetLength() == 0) { - e = BCExceptionFormatInstance; - delete resultMetadata; - return NULL; - } - CFX_ByteArray rawBytes; - CFX_PtrArray byteSegments; - CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); - tempCd->Init(rawBytes, result, byteSegments, ecLevel, e); - if (e != BCExceptionNO) { - delete resultMetadata; - return NULL; - } - tempCd->setOther(resultMetadata); - return tempCd; -} -FX_INT32 CBC_DecodedBitStreamPaser::decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e) -{ - if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { - e = BCExceptionFormatInstance; - return -1; - } - CFX_Int32Array segmentIndexArray; - segmentIndexArray.SetSize(NUMBER_OF_SEQUENCE_CODEWORDS); - for (FX_INT32 i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { - segmentIndexArray.SetAt(i, codewords[codeIndex]); - } - CFX_ByteString str = decodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - resultMetadata->setSegmentIndex(atoi(str.GetBuffer(str.GetLength()))); - CFX_ByteString fileId; - codeIndex = textCompaction(codewords, codeIndex, fileId); - resultMetadata->setFileId(fileId); - if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { - codeIndex++; - CFX_Int32Array additionalOptionCodeWords; - additionalOptionCodeWords.SetSize(codewords[0] - codeIndex); - FX_INT32 additionalOptionCodeWordsIndex = 0; - FX_BOOL end = FALSE; - while ((codeIndex < codewords[0]) && !end) { - FX_INT32 code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code; - } else { - switch (code) { - case MACRO_PDF417_TERMINATOR: - resultMetadata->setLastSegment(TRUE); - codeIndex++; - end = TRUE; - break; - default: - e = BCExceptionFormatInstance; - return -1; - } - } - } - CFX_Int32Array array; - array.SetSize(additionalOptionCodeWordsIndex); - array.Copy(additionalOptionCodeWords); - resultMetadata->setOptionalData(array); - } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) { - resultMetadata->setLastSegment(TRUE); - codeIndex++; - } - return codeIndex; -} -FX_INT32 CBC_DecodedBitStreamPaser::textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) -{ - CFX_Int32Array textCompactionData; - textCompactionData.SetSize((codewords[0] - codeIndex) << 1); - CFX_Int32Array byteCompactionData; - byteCompactionData.SetSize((codewords[0] - codeIndex) << 1); - FX_INT32 index = 0; - FX_BOOL end = FALSE; - while ((codeIndex < codewords[0]) && !end) { - FX_INT32 code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - textCompactionData[index] = code / 30; - textCompactionData[index + 1] = code % 30; - index += 2; - } else { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; - break; - case BYTE_COMPACTION_MODE_LATCH: - codeIndex--; - end = TRUE; - break; - case NUMERIC_COMPACTION_MODE_LATCH: - codeIndex--; - end = TRUE; - break; - case BEGIN_MACRO_PDF417_CONTROL_BLOCK: - codeIndex--; - end = TRUE; - break; - case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - codeIndex--; - end = TRUE; - break; - case MACRO_PDF417_TERMINATOR: - codeIndex--; - end = TRUE; - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; - code = codewords[codeIndex++]; - byteCompactionData[index] = code; - index++; - break; - case BYTE_COMPACTION_MODE_LATCH_6: - codeIndex--; - end = TRUE; - break; - } - } - } - decodeTextCompaction(textCompactionData, byteCompactionData, index, result); - return codeIndex; -} -void CBC_DecodedBitStreamPaser::decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result) -{ - Mode subMode = ALPHA; - Mode priorToShiftMode = ALPHA; - FX_INT32 i = 0; - while (i < length) { - FX_INT32 subModeCh = textCompactionData[i]; - FX_CHAR ch = 0; - switch (subMode) { - case ALPHA: - if (subModeCh < 26) { - ch = (FX_CHAR) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = LOWER; - } else if (subModeCh == ML) { - subMode = MIXED; - } else if (subModeCh == PS) { - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result += (FX_CHAR) byteCompactionData[i]; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - case LOWER: - if (subModeCh < 26) { - ch = (FX_CHAR) ('a' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == AS) { - priorToShiftMode = subMode; - subMode = ALPHA_SHIFT; - } else if (subModeCh == ML) { - subMode = MIXED; - } else if (subModeCh == PS) { - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result += (FX_CHAR) byteCompactionData[i]; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - case MIXED: - if (subModeCh < PL) { - ch = MIXED_CHARS[subModeCh]; - } else { - if (subModeCh == PL) { - subMode = PUNCT; - } else if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = LOWER; - } else if (subModeCh == AL) { - subMode = ALPHA; - } else if (subModeCh == PS) { - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result += (FX_CHAR) byteCompactionData[i]; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - case PUNCT: - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = ALPHA; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result += (FX_CHAR) byteCompactionData[i]; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - case ALPHA_SHIFT: - subMode = priorToShiftMode; - if (subModeCh < 26) { - ch = (FX_CHAR) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - case PUNCT_SHIFT: - subMode = priorToShiftMode; - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = ALPHA; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result += (FX_CHAR) byteCompactionData[i]; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - } - if (ch != 0) { - result += ch; - } - i++; - } -} -FX_INT32 CBC_DecodedBitStreamPaser::byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result) -{ - if (mode == BYTE_COMPACTION_MODE_LATCH) { - FX_INT32 count = 0; - FX_INT64 value = 0; - FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); - CFX_Int32Array byteCompactedCodewords; - byteCompactedCodewords.SetSize(6); - FX_BOOL end = FALSE; - FX_INT32 nextCode = codewords[codeIndex++]; - while ((codeIndex < codewords[0]) && !end) { - byteCompactedCodewords[count++] = nextCode; - value = 900 * value + nextCode; - nextCode = codewords[codeIndex++]; - if (nextCode == TEXT_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH || - nextCode == NUMERIC_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH_6 || - nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - nextCode == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = TRUE; - } else { - if ((count % 5 == 0) && (count > 0)) { - FX_INT32 j = 0; - for (; j < 6; ++j) { - decodedData[5 - j] = (FX_WORD) (value % 256); - value >>= 8; - } - for (j = 0; j < 6; ++j) { - result += (FX_CHAR)decodedData[j]; - } - count = 0; - } - } - } - FX_Free(decodedData); - if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) { - byteCompactedCodewords[count++] = nextCode; - } - for (FX_INT32 i = 0; i < count; i++) { - result += (FX_CHAR)(FX_WORD) byteCompactedCodewords[i]; - } - } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { - FX_INT32 count = 0; - FX_INT64 value = 0; - FX_BOOL end = FALSE; - while (codeIndex < codewords[0] && !end) { - FX_INT32 code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - count++; - value = 900 * value + code; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == NUMERIC_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = TRUE; - } - } - if ((count % 5 == 0) && (count > 0)) { - FX_WORD* decodedData = FX_Alloc(FX_WORD, 6 * sizeof(FX_WORD)); - FX_INT32 j = 0; - for (; j < 6; ++j) { - decodedData[5 - j] = (FX_WORD) (value & 0xFF); - value >>= 8; - } - for (j = 0; j < 6; ++j) { - result += (FX_CHAR)decodedData[j]; - } - count = 0; - FX_Free(decodedData); - } - } - } - return codeIndex; -} -FX_INT32 CBC_DecodedBitStreamPaser::numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e) -{ - FX_INT32 count = 0; - FX_BOOL end = FALSE; - CFX_Int32Array numericCodewords; - numericCodewords.SetSize(MAX_NUMERIC_CODEWORDS); - while (codeIndex < codewords[0] && !end) { - FX_INT32 code = codewords[codeIndex++]; - if (codeIndex == codewords[0]) { - end = TRUE; - } - if (code < TEXT_COMPACTION_MODE_LATCH) { - numericCodewords[count] = code; - count++; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = TRUE; - } - } - if (count % MAX_NUMERIC_CODEWORDS == 0 || - code == NUMERIC_COMPACTION_MODE_LATCH || - end) { - CFX_ByteString s = decodeBase900toBase10(numericCodewords, count, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - result += s; - count = 0; - } - } - return codeIndex; -} -CFX_ByteString CBC_DecodedBitStreamPaser::decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e) -{ - BigInteger result = 0; - BigInteger nineHundred(900); - for (FX_INT32 i = 0; i < count; i++) { - result = result * nineHundred + BigInteger(codewords[i]); - } - CFX_ByteString resultString(bigIntegerToString(result).c_str()); - if (resultString.GetAt(0) != '1') { - e = BCExceptionFormatInstance; - return ' '; - } - return resultString.Mid(1, resultString.GetLength() - 1); -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp deleted file mode 100644 index e343b4a038..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417DetectionResult.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -#include "include/BC_PDF417DetectionResult.h" -FX_INT32 CBC_DetectionResult::ADJUST_ROW_NUMBER_SKIP = 2; -CBC_DetectionResult::CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox) -{ - m_barcodeMetadata = barcodeMetadata; - m_barcodeColumnCount = barcodeMetadata->getColumnCount(); - m_boundingBox = boundingBox; - m_detectionResultColumns.SetSize(m_barcodeColumnCount + 2); - for (FX_INT32 i = 0; i < m_barcodeColumnCount + 2; i++) { - m_detectionResultColumns[i] = NULL; - } -} -CBC_DetectionResult::~CBC_DetectionResult() -{ - delete m_boundingBox; - delete m_barcodeMetadata; - m_detectionResultColumns.RemoveAll(); -} -CFX_PtrArray& CBC_DetectionResult::getDetectionResultColumns() -{ - adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0)); - adjustIndicatorColumnRowNumbers((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1)); - FX_INT32 unadjustedCodewordCount = CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE; - FX_INT32 previousUnadjustedCount; - do { - previousUnadjustedCount = unadjustedCodewordCount; - unadjustedCodewordCount = adjustRowNumbers(); - } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); - return m_detectionResultColumns; -} -void CBC_DetectionResult::setBoundingBox(CBC_BoundingBox* boundingBox) -{ - m_boundingBox = boundingBox; -} -CBC_BoundingBox* CBC_DetectionResult::getBoundingBox() -{ - return m_boundingBox; -} -void CBC_DetectionResult::setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn) -{ - m_detectionResultColumns[barcodeColumn] = detectionResultColumn; -} -CBC_DetectionResultColumn* CBC_DetectionResult::getDetectionResultColumn(FX_INT32 barcodeColumn) -{ - return (CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn]; -} -CFX_ByteString CBC_DetectionResult::toString() -{ - CBC_DetectionResultColumn* rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[0]; - if (rowIndicatorColumn == NULL) { - rowIndicatorColumn = (CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1]; - } - CFX_ByteString result; - for (FX_INT32 codewordsRow = 0; codewordsRow < rowIndicatorColumn->getCodewords()->GetSize(); codewordsRow++) { - result += (FX_CHAR) codewordsRow; - for (FX_INT32 barcodeColumn = 0; barcodeColumn < m_barcodeColumnCount + 2; barcodeColumn++) { - if (m_detectionResultColumns[barcodeColumn] == NULL) { - result += " | "; - continue; - } - CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); - if (codeword == NULL) { - result += " | "; - continue; - } - result += codeword->getRowNumber(); - result += codeword->getValue(); - } - } - return result; -} -void CBC_DetectionResult::adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn) -{ - if (detectionResultColumn != NULL) { - ((CBC_DetectionResultRowIndicatorColumn*)detectionResultColumn)->adjustCompleteIndicatorColumnRowNumbers(*m_barcodeMetadata); - } -} -FX_INT32 CBC_DetectionResult::adjustRowNumbers() -{ - FX_INT32 unadjustedCount = adjustRowNumbersByRow(); - if (unadjustedCount == 0) { - return 0; - } - for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1; barcodeColumn++) { - CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords(); - for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { - if (codewords->GetAt(codewordsRow) == NULL) { - continue; - } - if (!((CBC_Codeword*)codewords->GetAt(codewordsRow))->hasValidRowNumber()) { - adjustRowNumbers(barcodeColumn, codewordsRow, codewords); - } - } - } - return unadjustedCount; -} -FX_INT32 CBC_DetectionResult::adjustRowNumbersByRow() -{ - adjustRowNumbersFromBothRI(); - FX_INT32 unadjustedCount = adjustRowNumbersFromLRI(); - return unadjustedCount + adjustRowNumbersFromRRI(); -} -FX_INT32 CBC_DetectionResult::adjustRowNumbersFromBothRI() -{ - if (m_detectionResultColumns[0] == NULL || m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { - return 0; - } - CFX_PtrArray* LRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[0])->getCodewords(); - CFX_PtrArray* RRIcodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[m_barcodeColumnCount + 1])->getCodewords(); - for (FX_INT32 codewordsRow = 0; codewordsRow < LRIcodewords->GetSize(); codewordsRow++) { - if (LRIcodewords->GetAt(codewordsRow) != NULL && - RRIcodewords->GetAt(codewordsRow) != NULL && - ((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber() == ((CBC_Codeword*)RRIcodewords->GetAt(codewordsRow))->getRowNumber()) { - for (FX_INT32 barcodeColumn = 1; barcodeColumn <= m_barcodeColumnCount; barcodeColumn++) { - CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); - if (codeword == NULL) { - continue; - } - codeword->setRowNumber(((CBC_Codeword*)LRIcodewords->GetAt(codewordsRow))->getRowNumber()); - if (!codeword->hasValidRowNumber()) { - ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->SetAt(codewordsRow, NULL); - } - } - } - } - return 0; -} -FX_INT32 CBC_DetectionResult::adjustRowNumbersFromRRI() -{ - if (m_detectionResultColumns[m_barcodeColumnCount + 1] == NULL) { - return 0; - } - FX_INT32 unadjustedCount = 0; - CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*) m_detectionResultColumns.GetAt(m_barcodeColumnCount + 1))->getCodewords(); - for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { - if (codewords->GetAt(codewordsRow) == NULL) { - continue; - } - FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); - FX_INT32 invalidRowCounts = 0; - for (FX_INT32 barcodeColumn = m_barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { - CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn))->getCodewords()->GetAt(codewordsRow); - if (codeword != NULL) { - invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword->hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; -} -FX_INT32 CBC_DetectionResult::adjustRowNumbersFromLRI() -{ - if (m_detectionResultColumns[0] == NULL) { - return 0; - } - FX_INT32 unadjustedCount = 0; - CFX_PtrArray* codewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(0))->getCodewords(); - for (FX_INT32 codewordsRow = 0; codewordsRow < codewords->GetSize(); codewordsRow++) { - if (codewords->GetAt(codewordsRow) == NULL) { - continue; - } - FX_INT32 rowIndicatorRowNumber = ((CBC_Codeword*)codewords->GetAt(codewordsRow))->getRowNumber(); - FX_INT32 invalidRowCounts = 0; - for (FX_INT32 barcodeColumn = 1; barcodeColumn < m_barcodeColumnCount + 1 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { - CBC_Codeword* codeword = (CBC_Codeword*)((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn])->getCodewords()->GetAt(codewordsRow); - if (codeword != NULL) { - invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword->hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; -} -FX_INT32 CBC_DetectionResult::adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword) -{ - if (codeword == NULL) { - return invalidRowCounts; - } - if (!codeword->hasValidRowNumber()) { - if (codeword->isValidRowNumber(rowIndicatorRowNumber)) { - codeword->setRowNumber(rowIndicatorRowNumber); - invalidRowCounts = 0; - } else { - ++invalidRowCounts; - } - } - return invalidRowCounts; -} -void CBC_DetectionResult::adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords) -{ - CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); - CFX_PtrArray* previousColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns.GetAt(barcodeColumn - 1))->getCodewords(); - CFX_PtrArray* nextColumnCodewords = previousColumnCodewords; - if (m_detectionResultColumns[barcodeColumn + 1] != NULL) { - nextColumnCodewords = ((CBC_DetectionResultColumn*)m_detectionResultColumns[barcodeColumn + 1])->getCodewords(); - } - CFX_PtrArray otherCodewords; - otherCodewords.SetSize(14); - otherCodewords[2] = previousColumnCodewords->GetAt(codewordsRow); - otherCodewords[3] = nextColumnCodewords->GetAt(codewordsRow); - if (codewordsRow > 0) { - otherCodewords[0] = codewords->GetAt(codewordsRow - 1); - otherCodewords[4] = previousColumnCodewords->GetAt(codewordsRow - 1); - otherCodewords[5] = nextColumnCodewords->GetAt(codewordsRow - 1); - } - if (codewordsRow > 1) { - otherCodewords[8] = codewords->GetAt(codewordsRow - 2); - otherCodewords[10] = previousColumnCodewords->GetAt(codewordsRow - 2); - otherCodewords[11] = nextColumnCodewords->GetAt(codewordsRow - 2); - } - if (codewordsRow < codewords->GetSize() - 1) { - otherCodewords[1] = codewords->GetAt(codewordsRow + 1); - otherCodewords[6] = previousColumnCodewords->GetAt(codewordsRow + 1); - otherCodewords[7] = nextColumnCodewords->GetAt(codewordsRow + 1); - } - if (codewordsRow < codewords->GetSize() - 2) { - otherCodewords[9] = codewords->GetAt(codewordsRow + 2); - otherCodewords[12] = previousColumnCodewords->GetAt(codewordsRow + 2); - otherCodewords[13] = nextColumnCodewords->GetAt(codewordsRow + 2); - } - for (FX_INT32 i = 0; i < otherCodewords.GetSize(); i++) { - CBC_Codeword* otherCodeword = (CBC_Codeword*)otherCodewords.GetAt(i); - if (adjustRowNumber(codeword, otherCodeword)) { - return; - } - } -} -FX_BOOL CBC_DetectionResult::adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword) -{ - if (otherCodeword == NULL) { - return FALSE; - } - if (otherCodeword->hasValidRowNumber() && otherCodeword->getBucket() == codeword->getBucket()) { - codeword->setRowNumber(otherCodeword->getRowNumber()); - return TRUE; - } - return FALSE; -} -FX_INT32 CBC_DetectionResult::getBarcodeColumnCount() -{ - return m_barcodeColumnCount; -} -FX_INT32 CBC_DetectionResult::getBarcodeRowCount() -{ - return m_barcodeMetadata->getRowCount(); -} -FX_INT32 CBC_DetectionResult::getBarcodeECLevel() -{ - return m_barcodeMetadata->getErrorCorrectionLevel(); -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp deleted file mode 100644 index 1556194f46..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultColumn.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -FX_INT32 CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5; -CBC_DetectionResultColumn::CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox) -{ - m_boundingBox = boundingBox; - m_codewords = FX_NEW CFX_PtrArray; - m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1); -} -CBC_DetectionResultColumn::~CBC_DetectionResultColumn() -{ - for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { - delete (CBC_Codeword*)m_codewords->GetAt(i); - } - m_codewords->RemoveAll(); - delete m_codewords; -} -CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(FX_INT32 imageRow) -{ - CBC_Codeword* codeword = getCodeword(imageRow); - if (codeword != NULL) { - return codeword; - } - for (FX_INT32 i = 1; i < MAX_NEARBY_DISTANCE; i++) { - FX_INT32 nearImageRow = imageRowToCodewordIndex(imageRow) - i; - if (nearImageRow >= 0) { - codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); - if (codeword != NULL) { - return codeword; - } - } - nearImageRow = imageRowToCodewordIndex(imageRow) + i; - if (nearImageRow < m_codewords->GetSize()) { - codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow); - if (codeword != NULL) { - return codeword; - } - } - } - return NULL; -} -FX_INT32 CBC_DetectionResultColumn::imageRowToCodewordIndex(FX_INT32 imageRow) -{ - return imageRow - m_boundingBox->getMinY(); -} -FX_INT32 CBC_DetectionResultColumn::codewordIndexToImageRow(FX_INT32 codewordIndex) -{ - return m_boundingBox->getMinY() + codewordIndex; -} -void CBC_DetectionResultColumn::setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword) -{ - m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword); -} -CBC_Codeword* CBC_DetectionResultColumn::getCodeword(FX_INT32 imageRow) -{ - return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow)); -} -CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() -{ - return m_boundingBox; -} -CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() -{ - return m_codewords; -} -CFX_ByteString CBC_DetectionResultColumn::toString() -{ - CFX_ByteString result; - FX_INT32 row = 0; - for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { - CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i); - if (codeword == NULL) { - result += (FX_CHAR) row; - row++; - continue; - } - result += (FX_CHAR) row; - result += codeword->getRowNumber(); - result += codeword->getValue(); - row++; - } - return result; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp deleted file mode 100644 index 0ad8b8e527..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417DetectionResultRowIndicatorColumn.cpp +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_PDF417BarcodeValue.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft) - : CBC_DetectionResultColumn(boundingBox) -{ - m_isLeft = isLeft; -} -CBC_DetectionResultRowIndicatorColumn::~CBC_DetectionResultRowIndicatorColumn() -{ -} -void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() -{ - for (FX_INT32 i = 0; i < m_codewords->GetSize(); i++) { - CBC_Codeword * codeword = (CBC_Codeword*)m_codewords->GetAt(i); - if (codeword != NULL) { - codeword->setRowNumberAsRowIndicatorColumn(); - } - } -} -FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) -{ - CFX_PtrArray* codewords = getCodewords(); - setRowNumbers(); - removeIncorrectCodewords(codewords, barcodeMetadata); - CBC_BoundingBox* boundingBox = getBoundingBox(); - CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); - CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); - FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); - FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); - FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); - FX_INT32 barcodeRow = -1; - FX_INT32 maxRowHeight = 1; - FX_INT32 currentRowHeight = 0; - for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords->GetAt(codewordsRow) == NULL) { - continue; - } - CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); - FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; - if (rowDifference == 0) { - currentRowHeight++; - } else if (rowDifference == 1) { - maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; - currentRowHeight = 1; - barcodeRow = codeword->getRowNumber(); - } else if (rowDifference < 0) { - codewords->SetAt(codewordsRow, NULL); - } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { - codewords->SetAt(codewordsRow, NULL); - } else if (rowDifference > codewordsRow) { - codewords->SetAt(codewordsRow, NULL); - } else { - FX_INT32 checkedRows; - if (maxRowHeight > 2) { - checkedRows = (maxRowHeight - 2) * rowDifference; - } else { - checkedRows = rowDifference; - } - FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; - for (FX_INT32 i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { - closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL; - } - if (closePreviousCodewordFound) { - codewords->SetAt(codewordsRow, NULL); - } else { - barcodeRow = codeword->getRowNumber(); - currentRowHeight = 1; - } - } - } - return (FX_INT32) (averageRowHeight + 0.5); -} -CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights(FX_INT32 &e) -{ - CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(); - if (barcodeMetadata == NULL) { - e = BCExceptionCannotMetadata; - return NULL; - } - adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata); - CFX_Int32Array* result = FX_NEW CFX_Int32Array; - result->SetSize(barcodeMetadata->getRowCount()); - for (FX_INT32 i = 0; i < getCodewords()->GetSize(); i++) { - CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i); - if (codeword != NULL) { - result->SetAt(codeword->getRowNumber(), result->GetAt(codeword->getRowNumber()) + 1); - } - } - return result; -} -FX_INT32 CBC_DetectionResultRowIndicatorColumn::adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata) -{ - CBC_BoundingBox* boundingBox = getBoundingBox(); - CBC_ResultPoint* top = m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); - CBC_ResultPoint* bottom = m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); - FX_INT32 firstRow = imageRowToCodewordIndex((FX_INT32) top->GetY()); - FX_INT32 lastRow = imageRowToCodewordIndex((FX_INT32) bottom->GetY()); - FX_FLOAT averageRowHeight = (lastRow - firstRow) / (FX_FLOAT) barcodeMetadata.getRowCount(); - CFX_PtrArray* codewords = getCodewords(); - FX_INT32 barcodeRow = -1; - FX_INT32 maxRowHeight = 1; - FX_INT32 currentRowHeight = 0; - for (FX_INT32 codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords->GetAt(codewordsRow) == NULL) { - continue; - } - CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); - codeword->setRowNumberAsRowIndicatorColumn(); - FX_INT32 rowDifference = codeword->getRowNumber() - barcodeRow; - if (rowDifference == 0) { - currentRowHeight++; - } else if (rowDifference == 1) { - maxRowHeight = maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; - currentRowHeight = 1; - barcodeRow = codeword->getRowNumber(); - } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { - codewords->SetAt(codewordsRow, NULL); - } else { - barcodeRow = codeword->getRowNumber(); - currentRowHeight = 1; - } - } - return (FX_INT32) (averageRowHeight + 0.5); -} -CBC_BarcodeMetadata* CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() -{ - CFX_PtrArray* codewords = getCodewords(); - CBC_BarcodeValue barcodeColumnCount; - CBC_BarcodeValue barcodeRowCountUpperPart; - CBC_BarcodeValue barcodeRowCountLowerPart; - CBC_BarcodeValue barcodeECLevel; - for (FX_INT32 i = 0; i < codewords->GetSize(); i++) { - CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i); - if (codeword == NULL) { - continue; - } - codeword->setRowNumberAsRowIndicatorColumn(); - FX_INT32 rowIndicatorValue = codeword->getValue() % 30; - FX_INT32 codewordRowNumber = codeword->getRowNumber(); - if (!m_isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); - break; - case 1: - barcodeECLevel.setValue(rowIndicatorValue / 3); - barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); - break; - case 2: - barcodeColumnCount.setValue(rowIndicatorValue + 1); - break; - } - } - if ((barcodeColumnCount.getValue()->GetSize() == 0) || - (barcodeRowCountUpperPart.getValue()->GetSize() == 0) || - (barcodeRowCountLowerPart.getValue()->GetSize() == 0) || - (barcodeECLevel.getValue()->GetSize() == 0) || - barcodeColumnCount.getValue()->GetAt(0) < 1 || - barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) < CBC_PDF417Common::MIN_ROWS_IN_BARCODE || - barcodeRowCountUpperPart.getValue()->GetAt(0) + barcodeRowCountLowerPart.getValue()->GetAt(0) > CBC_PDF417Common::MAX_ROWS_IN_BARCODE) { - return NULL; - } - CBC_BarcodeMetadata* barcodeMetadata = FX_NEW CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0), barcodeRowCountUpperPart.getValue()->GetAt(0), barcodeRowCountLowerPart.getValue()->GetAt(0), barcodeECLevel.getValue()->GetAt(0)); - removeIncorrectCodewords(codewords, *barcodeMetadata); - return barcodeMetadata; -} -FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() -{ - return m_isLeft; -} -CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() -{ - return (CFX_ByteString)"IsLeft: " + (CFX_ByteString)m_isLeft + '\n' + CBC_DetectionResultColumn::toString(); -} -void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata) -{ - for (FX_INT32 codewordRow = 0; codewordRow < codewords->GetSize(); codewordRow++) { - CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow); - if (codeword == NULL) { - continue; - } - FX_INT32 rowIndicatorValue = codeword->getValue() % 30; - FX_INT32 codewordRowNumber = codeword->getRowNumber(); - if (codewordRowNumber > barcodeMetadata.getRowCount()) { - codewords->SetAt(codewordRow, NULL); - continue; - } - if (!m_isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - if (rowIndicatorValue * 3 + 1 != barcodeMetadata.getRowCountUpperPart()) { - codewords->SetAt(codewordRow, NULL); - } - break; - case 1: - if (rowIndicatorValue / 3 != barcodeMetadata.getErrorCorrectionLevel() || - rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { - codewords->SetAt(codewordRow, NULL); - } - break; - case 2: - if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { - codewords->SetAt(codewordRow, NULL); - } - break; - } - } -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp b/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp deleted file mode 100644 index 2c5728e2e7..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Detector.cpp +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_PDF417Detector.h" -#define INTERGER_MAX 2147483647 -FX_INT32 CBC_Detector::INDEXES_START_PATTERN[] = {0, 4, 1, 5}; -FX_INT32 CBC_Detector::INDEXES_STOP_PATTERN[] = {6, 2, 7, 3}; -FX_INT32 CBC_Detector::INTEGER_MATH_SHIFT = 8; -FX_INT32 CBC_Detector::PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; -FX_INT32 CBC_Detector::MAX_AVG_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f); -FX_INT32 CBC_Detector::MAX_INDIVIDUAL_VARIANCE = (FX_INT32) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f); -FX_INT32 CBC_Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3}; -FX_INT32 CBC_Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1}; -FX_INT32 CBC_Detector::MAX_PIXEL_DRIFT = 3; -FX_INT32 CBC_Detector::MAX_PATTERN_DRIFT = 5; -FX_INT32 CBC_Detector::SKIPPED_ROW_COUNT_MAX = 25; -FX_INT32 CBC_Detector::ROW_STEP = 5; -FX_INT32 CBC_Detector::BARCODE_MIN_HEIGHT = 10; -CBC_Detector::CBC_Detector() -{ -} -CBC_Detector::~CBC_Detector() -{ -} -CBC_PDF417DetectorResult* CBC_Detector::detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e) -{ - CBC_CommonBitMatrix* bitMatrix = image->GetBlackMatrix(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CFX_PtrArray* barcodeCoordinates = detect(multiple, bitMatrix); - if (barcodeCoordinates->GetSize() == 0) { - rotate180(bitMatrix); - barcodeCoordinates = detect(multiple, bitMatrix); - } - if (barcodeCoordinates->GetSize() == 0) { - e = BCExceptionUnSupportedBarcode; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_PDF417DetectorResult* detectorResult = FX_NEW CBC_PDF417DetectorResult(bitMatrix, barcodeCoordinates); - return detectorResult; -} -void CBC_Detector::rotate180(CBC_CommonBitMatrix* bitMatrix) -{ - FX_INT32 width = bitMatrix->GetWidth(); - FX_INT32 height = bitMatrix->GetHeight(); - CBC_CommonBitArray* firstRowBitArray = FX_NEW CBC_CommonBitArray(width); - CBC_CommonBitArray* secondRowBitArray = FX_NEW CBC_CommonBitArray(width); - CBC_CommonBitArray* tmpBitArray = FX_NEW CBC_CommonBitArray(width); - for (FX_INT32 y = 0; y < (height + 1) >> 1; y++) { - CBC_CommonBitArray* temp = bitMatrix->GetRow(height - 1 - y, secondRowBitArray); - CBC_CommonBitArray* tempfirstRow = firstRowBitArray; - firstRowBitArray = bitMatrix->GetRow(y, tempfirstRow); - delete tempfirstRow; - CBC_CommonBitArray* row = mirror(temp, tmpBitArray); - delete temp; - bitMatrix->SetRow(y, row); - delete row; - CBC_CommonBitArray* rowfirstRow = mirror(firstRowBitArray, tmpBitArray); - bitMatrix->SetRow(height - 1 - y, rowfirstRow); - delete rowfirstRow; - } - delete tmpBitArray; - delete firstRowBitArray; - delete secondRowBitArray; -} -CBC_CommonBitArray* CBC_Detector::mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result) -{ - CBC_CommonBitArray* array = FX_NEW CBC_CommonBitArray(result->GetSize()); - array->Clear(); - FX_INT32 size = input->GetSize(); - for (FX_INT32 i = 0; i < size; i++) { - if (input->Get(i)) { - array->Set(size - 1 - i); - } - } - return array; -} -CFX_PtrArray* CBC_Detector::detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix) -{ - CFX_PtrArray* barcodeCoordinates = FX_NEW CFX_PtrArray; - FX_INT32 row = 0; - FX_INT32 column = 0; - FX_BOOL foundBarcodeInRow = FALSE; - while (row < bitMatrix->GetHeight()) { - CFX_PtrArray* vertices = findVertices(bitMatrix, row, column); - if (vertices->GetAt(0) == NULL && vertices->GetAt(3) == NULL) { - if (!foundBarcodeInRow) { - if (vertices) { - delete(vertices); - } - break; - } - foundBarcodeInRow = FALSE; - column = 0; - for (FX_INT32 i = 0; i < barcodeCoordinates->GetSize(); i++) { - CFX_PtrArray* barcodeCoordinate = (CFX_PtrArray*)barcodeCoordinates->GetAt(i); - if (barcodeCoordinate->GetAt(1) != NULL) { - row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY(); - } - if (barcodeCoordinate->GetAt(3) != NULL) { - row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY(); - } - } - row += ROW_STEP; - if (vertices) { - delete(vertices); - } - continue; - } - foundBarcodeInRow = TRUE; - barcodeCoordinates->Add(vertices); - if (!multiple) { - break; - } - if (vertices->GetAt(2) != NULL) { - column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetX(); - row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(2))->GetY(); - } else { - column = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetX(); - row = (FX_INT32) ((CBC_ResultPoint*)vertices->GetAt(4))->GetY(); - } - } - return barcodeCoordinates; -} -CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn) -{ - FX_INT32 height = matrix->GetHeight(); - FX_INT32 width = matrix->GetWidth(); - CFX_PtrArray* result = FX_NEW CFX_PtrArray; - result->SetSize(8); - CFX_PtrArray* startptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN, sizeof(START_PATTERN) / sizeof(START_PATTERN[0])); - copyToResult(result, startptr, INDEXES_START_PATTERN, sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0])); - startptr->RemoveAll(); - delete startptr; - if (result->GetAt(4) != NULL) { - startColumn = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetX(); - startRow = (FX_INT32) ((CBC_ResultPoint*)result->GetAt(4))->GetY(); - } - CFX_PtrArray* stopptr = findRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN, sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0])); - copyToResult(result, stopptr, INDEXES_STOP_PATTERN, sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0])); - stopptr->RemoveAll(); - delete stopptr; - return result; -} -void CBC_Detector::copyToResult(CFX_PtrArray *result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength) -{ - for (FX_INT32 i = 0; i < destinationLength; i++) { - result->SetAt(destinationIndexes[i], tmpResult->GetAt(i)); - } -} -CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength) -{ - CFX_PtrArray* result = FX_NEW CFX_PtrArray; - result->SetSize(4); - FX_BOOL found = FALSE; - CFX_Int32Array counters; - counters.SetSize(patternLength); - for (; startRow < height; startRow += ROW_STEP) { - CFX_Int32Array* loc = findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, patternLength, counters); - if (loc != NULL) { - while (startRow > 0) { - CFX_Int32Array* previousRowLoc = findGuardPattern(matrix, startColumn, --startRow, width, FALSE, pattern, patternLength, counters); - if (previousRowLoc != NULL) { - delete loc; - loc = previousRowLoc; - } else { - startRow++; - break; - } - } - result->SetAt(0, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); - result->SetAt(1, FX_NEW CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); - found = TRUE; - delete loc; - break; - } - } - FX_INT32 stopRow = startRow + 1; - if (found) { - FX_INT32 skippedRowCount = 0; - CFX_Int32Array previousRowLoc; - previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(0))->GetX()); - previousRowLoc.Add((FX_INT32)((CBC_ResultPoint*)result->GetAt(1))->GetX()); - for (; stopRow < height; stopRow++) { - CFX_Int32Array* loc = findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, pattern, patternLength, counters); - if (loc != NULL && - abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && - abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { - previousRowLoc.Copy(*loc); - skippedRowCount = 0; - } else { - if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { - delete loc; - break; - } else { - skippedRowCount++; - } - } - delete loc; - } - stopRow -= skippedRowCount + 1; - result->SetAt(2, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0), (FX_FLOAT)stopRow)); - result->SetAt(3, FX_NEW CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1), (FX_FLOAT)stopRow)); - } - if (stopRow - startRow < BARCODE_MIN_HEIGHT) { - for (FX_INT32 i = 0; i < result->GetSize(); i++) { - result->SetAt(i, NULL); - } - } - return result; -} -CFX_Int32Array* CBC_Detector::findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters) -{ - for (FX_INT32 i = 0; i < counters.GetSize(); i++) { - counters.SetAt(i, 0); - } - FX_BOOL isWhite = whiteFirst; - FX_INT32 patternStart = column; - FX_INT32 pixelDrift = 0; - CFX_Int32Array* intarray = FX_NEW CFX_Int32Array; - while (matrix->Get(patternStart, row) && patternStart > 0 && pixelDrift++ < MAX_PIXEL_DRIFT) { - patternStart--; - } - FX_INT32 x = patternStart; - FX_INT32 counterPosition = 0; - for (; x < width; x++) { - FX_BOOL pixel = matrix->Get(x, row); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - intarray->Add(patternStart); - intarray->Add(x); - return intarray; - } - patternStart += counters[0] + counters[1]; - for (FX_INT32 l = 2, k = 0; l < patternLength; l++, k++) { - counters.SetAt(k, counters.GetAt(l)); - } - counters.SetAt(patternLength - 2, 0); - counters.SetAt(patternLength - 1, 0); - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - intarray->Add(patternStart); - intarray->Add(x - 1); - return intarray; - } - } - delete intarray; - return NULL; -} -FX_INT32 CBC_Detector::patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance) -{ - FX_INT32 numCounters = counters.GetSize(); - FX_INT32 total = 0; - FX_INT32 patternLength = 0; - for (FX_INT32 i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - return INTERGER_MAX; - } - FX_INT32 unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; - maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; - FX_INT32 totalVariance = 0; - for (FX_INT32 x = 0; x < numCounters; x++) { - FX_INT32 counter = counters[x] << INTEGER_MATH_SHIFT; - FX_INT32 scaledPattern = pattern[x] * unitBarWidth; - FX_INT32 variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return INTERGER_MAX; - } - totalVariance += variance; - } - return totalVariance / total; -} - diff --git a/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp b/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp deleted file mode 100644 index 8c9aa29b47..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417DetectorResult.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417DetectorResult.h" -CBC_PDF417DetectorResult::CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points) -{ - m_bits = bits; - m_points = points; -} -CBC_PDF417DetectorResult::~CBC_PDF417DetectorResult() -{ - for (FX_INT32 i = 0; i < m_points->GetSize(); i++) { - CFX_PtrArray* temp = (CFX_PtrArray*)m_points->GetAt(i); - for (FX_INT32 j = 0; j < temp->GetSize(); j++) { - delete (CBC_ResultPoint*)temp->GetAt(j); - } - temp->RemoveAll(); - delete temp; - } - m_points->RemoveAll(); - delete m_points; -} -CBC_CommonBitMatrix* CBC_PDF417DetectorResult::getBits() -{ - return m_bits; -} - -CFX_PtrArray* CBC_PDF417DetectorResult::getPoints() -{ - return m_points; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp b/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp deleted file mode 100644 index 77ca0c42a1..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Dimensions.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "barcode.h" -#include "include/BC_PDF417Dimensions.h" -CBC_Dimensions::CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows) -{ - m_minCols = minCols; - m_maxCols = maxCols; - m_minRows = minRows; - m_maxRows = maxRows; -} -CBC_Dimensions::~CBC_Dimensions() -{ -} -FX_INT32 CBC_Dimensions::getMinCols() -{ - return m_minCols; -} -FX_INT32 CBC_Dimensions::getMaxCols() -{ - return m_maxCols; -} -FX_INT32 CBC_Dimensions::getMinRows() -{ - return m_minRows; -} -FX_INT32 CBC_Dimensions::getMaxRows() -{ - return m_maxRows; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp deleted file mode 100644 index bdfe27d97c..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ECErrorCorrection.cpp +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECErrorCorrection.h" -CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL; -void CBC_PDF417ECErrorCorrection::Initialize(FX_INT32 &e) -{ - m_field = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); -} -void CBC_PDF417ECErrorCorrection::Finalize() -{ - delete m_field; -} -CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() -{ -} -CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() -{ -} -FX_INT32 CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e) -{ - CBC_PDF417ECModulusPoly poly(m_field, received, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - CFX_Int32Array S; - S.SetSize(numECCodewords); - FX_BOOL error = FALSE; - for (FX_INT32 l = numECCodewords; l > 0; l--) { - FX_INT32 eval = poly.evaluateAt(m_field->exp(l)); - S[numECCodewords - l] = eval; - if (eval != 0) { - error = TRUE; - } - } - if (!error) { - return 0; - } - CBC_PDF417ECModulusPoly* syndrome = FX_NEW CBC_PDF417ECModulusPoly(m_field, S, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(numECCodewords, 1, e); - if (e != BCExceptionNO) { - delete syndrome; - return -1; - } - CFX_PtrArray* sigmaOmega = runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e); - delete buildmonomial; - delete syndrome; - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - CBC_PDF417ECModulusPoly* sigma = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0); - CBC_PDF417ECModulusPoly* omega = (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1); - CFX_Int32Array* errorLocations = findErrorLocations(sigma, e); - if (e != BCExceptionNO) { - for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); - } - sigmaOmega->RemoveAll(); - delete sigmaOmega; - return -1; - } - CFX_Int32Array* errorMagnitudes = findErrorMagnitudes(omega, sigma, *errorLocations, e); - if (e != BCExceptionNO) { - delete errorLocations; - for (FX_INT32 i = 0; i < sigmaOmega->GetSize(); i++) { - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i); - } - sigmaOmega->RemoveAll(); - delete sigmaOmega; - return -1; - } - for (FX_INT32 i = 0; i < errorLocations->GetSize(); i++) { - FX_INT32 log = m_field->log(errorLocations->GetAt(i), e);; - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - FX_INT32 position = received.GetSize() - 1 - log; - if (position < 0) { - e = BCExceptionChecksumException; - delete errorLocations; - delete errorMagnitudes; - for (FX_INT32 j = 0; j < sigmaOmega->GetSize(); j++) { - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j); - } - sigmaOmega->RemoveAll(); - delete sigmaOmega; - return -1; - } - received[position] = m_field->subtract(received[position], errorMagnitudes->GetAt(i)); - } - FX_INT32 result = errorLocations->GetSize(); - delete errorLocations; - delete errorMagnitudes; - for (FX_INT32 k = 0; k < sigmaOmega->GetSize(); k++) { - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k); - } - sigmaOmega->RemoveAll(); - delete sigmaOmega; - return result; -} -CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e) -{ - if (a->getDegree() < b->getDegree()) { - CBC_PDF417ECModulusPoly* temp = a; - a = b; - b = temp; - } - CBC_PDF417ECModulusPoly* rLast = a; - CBC_PDF417ECModulusPoly* r = b; - CBC_PDF417ECModulusPoly* tLast = m_field->getZero(); - CBC_PDF417ECModulusPoly* t = m_field->getOne(); - CBC_PDF417ECModulusPoly* qtemp = NULL; - CBC_PDF417ECModulusPoly* rtemp = NULL; - CBC_PDF417ECModulusPoly* ttemp = NULL; - FX_INT32 i = 0; - FX_INT32 j = 0; - FX_INT32 m = 0; - FX_INT32 n = 0; - while (r->getDegree() >= R / 2) { - CBC_PDF417ECModulusPoly* rLastLast = rLast; - CBC_PDF417ECModulusPoly* tLastLast = tLast; - rLast = r; - tLast = t; - m = i; - n = j; - if (rLast->isZero()) { - e = BCExceptionChecksumException; - if (qtemp) { - delete qtemp; - } - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - r = rLastLast; - CBC_PDF417ECModulusPoly* q = m_field->getZero(); - FX_INT32 denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree()); - FX_INT32 dltInverse = m_field->inverse(denominatorLeadingTerm, e); - if (e != BCExceptionNO) { - if (qtemp) { - delete qtemp; - } - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - while (r->getDegree() >= rLast->getDegree() && !r->isZero()) { - FX_INT32 degreeDiff = r->getDegree() - rLast->getDegree(); - FX_INT32 scale = m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse); - CBC_PDF417ECModulusPoly* buildmonomial = m_field->buildMonomial(degreeDiff, scale, e); - if (e != BCExceptionNO) { - if (qtemp) { - delete qtemp; - } - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - q = q->add(buildmonomial, e); - delete buildmonomial; - if (qtemp) { - delete qtemp; - } - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - qtemp = q; - CBC_PDF417ECModulusPoly* multiply = rLast->multiplyByMonomial(degreeDiff, scale, e); - if (e != BCExceptionNO) { - if (qtemp) { - delete qtemp; - } - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - CBC_PDF417ECModulusPoly* temp = r; - r = temp->subtract(multiply, e); - delete multiply; - if (m > 1 && i > m) { - delete temp; - temp = NULL; - } - if (e != BCExceptionNO) { - if (qtemp) { - delete qtemp; - } - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - rtemp = r; - i = m + 1; - } - ttemp = q->multiply(tLast, e); - if (qtemp) { - delete qtemp; - qtemp = NULL; - } - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - t = ttemp->subtract(tLastLast, e); - if (n > 1 && j > n) { - delete tLastLast; - } - delete ttemp; - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - return NULL; - } - ttemp = t; - t = ttemp->negative(e); - delete ttemp; - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - return NULL; - } - ttemp = t; - j++; - } - FX_INT32 aa = t->getCoefficient(1); - FX_INT32 sigmaTildeAtZero = t->getCoefficient(0); - if (sigmaTildeAtZero == 0) { - e = BCExceptionChecksumException; - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - FX_INT32 inverse = m_field->inverse(sigmaTildeAtZero, e); - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - if (ttemp) { - delete ttemp; - } - return NULL; - } - CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e); - if (ttemp) { - delete ttemp; - } - if (e != BCExceptionNO) { - if (rtemp) { - delete rtemp; - } - return NULL; - } - CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e); - if (rtemp) { - delete rtemp; - } - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; - modulusPoly->Add(sigma); - modulusPoly->Add(omega); - return modulusPoly; -} -CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e) -{ - FX_INT32 numErrors = errorLocator->getDegree(); - CFX_Int32Array* result = FX_NEW CFX_Int32Array; - result->SetSize(numErrors); - FX_INT32 ee = 0; - for (FX_INT32 i = 1; i < m_field->getSize() && ee < numErrors; i++) { - if (errorLocator->evaluateAt(i) == 0) { - result->SetAt(ee, m_field->inverse(i, e)); - if (e != BCExceptionNO) { - delete result; - return NULL; - } - ee++; - } - } - if (ee != numErrors) { - e = BCExceptionChecksumException; - delete result; - return NULL; - } - return result; -} -CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e) -{ - FX_INT32 errorLocatorDegree = errorLocator->getDegree(); - CFX_Int32Array formalDerivativeCoefficients; - formalDerivativeCoefficients.SetSize(errorLocatorDegree); - for (FX_INT32 l = 1; l <= errorLocatorDegree; l++) { - formalDerivativeCoefficients[errorLocatorDegree - l] = m_field->multiply(l, errorLocator->getCoefficient(l)); - } - CBC_PDF417ECModulusPoly formalDerivative(m_field, formalDerivativeCoefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 s = errorLocations.GetSize(); - CFX_Int32Array* result = FX_NEW CFX_Int32Array; - result->SetSize(s); - for (FX_INT32 i = 0; i < s; i++) { - FX_INT32 xiInverse = m_field->inverse(errorLocations[i], e); - if (e != BCExceptionNO) { - delete result; - return NULL; - } - FX_INT32 numerator = m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse)); - FX_INT32 denominator = m_field->inverse(formalDerivative.evaluateAt(xiInverse), e); - if (e != BCExceptionNO) { - delete result; - return NULL; - } - result->SetAt(i, m_field->multiply(numerator, denominator)); - } - return result; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp deleted file mode 100644 index 7d445cb3b4..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ECModulusGF.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL; -void CBC_PDF417ECModulusGF::Initialize(FX_INT32 &e) -{ - PDF417_GF = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e); -} -void CBC_PDF417ECModulusGF::Finalize() -{ - delete PDF417_GF; -} -CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e) -{ - m_modulus = modulus; - m_expTable.SetSize(modulus); - m_logTable.SetSize(modulus); - FX_INT32 x = 1; - for (FX_INT32 i = 0; i < modulus; i++) { - m_expTable[i] = x; - x = (x * generator) % modulus; - } - for (FX_INT32 j = 0; j < modulus - 1; j++) { - m_logTable[m_expTable[j]] = j; - } - CFX_Int32Array zero; - zero.Add(0); - m_zero = FX_NEW CBC_PDF417ECModulusPoly(this, zero, e); - CFX_Int32Array one; - one.Add(1); - m_one = FX_NEW CBC_PDF417ECModulusPoly(this, one, e); -} -CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() -{ - delete m_zero; - delete m_one; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() -{ - return m_zero; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() -{ - return m_one; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) -{ - if (degree < 0) { - e = BCExceptionIllegalArgument; - return NULL; - } - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (coefficient == 0) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_zero->getField(), m_zero->getCoefficients(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - CFX_Int32Array coefficients; - coefficients.SetSize(degree + 1); - coefficients[0] = coefficient; - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(this, coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -FX_INT32 CBC_PDF417ECModulusGF::add(FX_INT32 a, FX_INT32 b) -{ - return (a + b) % m_modulus; -} -FX_INT32 CBC_PDF417ECModulusGF::subtract(FX_INT32 a, FX_INT32 b) -{ - return (m_modulus + a - b) % m_modulus; -} -FX_INT32 CBC_PDF417ECModulusGF::exp(FX_INT32 a) -{ - return m_expTable[a]; -} -FX_INT32 CBC_PDF417ECModulusGF::log(FX_INT32 a, FX_INT32 &e) -{ - if (a == 0) { - e = BCExceptionIllegalArgument; - return -1; - } - return m_logTable[a]; -} -FX_INT32 CBC_PDF417ECModulusGF::inverse(FX_INT32 a, FX_INT32 &e) -{ - if (a == 0) { - e = BCExceptionIllegalArgument; - return -1; - } - return m_expTable[m_modulus - m_logTable[a] - 1]; -} -FX_INT32 CBC_PDF417ECModulusGF::multiply(FX_INT32 a, FX_INT32 b) -{ - if (a == 0 || b == 0) { - return 0; - } - return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)]; -} -FX_INT32 CBC_PDF417ECModulusGF::getSize() -{ - return m_modulus; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp b/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp deleted file mode 100644 index f484619587..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ECModulusPoly.cpp +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECModulusPoly.h" -CBC_PDF417ECModulusPoly::CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e) -{ - if (coefficients.GetSize() == 0) { - e = BCExceptionIllegalArgument; - } - m_field = field; - FX_INT32 coefficientsLength = coefficients.GetSize(); - if (coefficientsLength > 1 && coefficients[0] == 0) { - FX_INT32 firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) { - m_coefficients = field->getZero()->m_coefficients; - } else { - m_coefficients.SetSize(coefficientsLength - firstNonZero); - FX_INT32 l = 0; - for (FX_INT32 i = firstNonZero; i < firstNonZero + m_coefficients.GetSize(); i++) { - m_coefficients.SetAt(l, coefficients.GetAt(i)); - l++; - } - } - } else { - m_coefficients.Copy(coefficients); - } -} -CBC_PDF417ECModulusPoly::~CBC_PDF417ECModulusPoly() -{ -} -CFX_Int32Array& CBC_PDF417ECModulusPoly::getCoefficients() -{ - return m_coefficients; -} -CBC_PDF417ECModulusGF* CBC_PDF417ECModulusPoly::getField() -{ - return m_field; -} -FX_INT32 CBC_PDF417ECModulusPoly::getDegree() -{ - return m_coefficients.GetSize() - 1; -} -FX_BOOL CBC_PDF417ECModulusPoly::isZero() -{ - return m_coefficients[0] == 0; -} -FX_INT32 CBC_PDF417ECModulusPoly::getCoefficient(FX_INT32 degree) -{ - return m_coefficients[m_coefficients.GetSize() - 1 - degree]; -} -FX_INT32 CBC_PDF417ECModulusPoly::evaluateAt(FX_INT32 a) -{ - if (a == 0) { - return getCoefficient(0); - } - FX_INT32 size = m_coefficients.GetSize(); - if (a == 1) { - FX_INT32 result = 0; - for (FX_INT32 l = 0; l < m_coefficients.GetSize(); l++) { - FX_INT32 coefficient = m_coefficients.GetAt(l); - result = m_field->add(result, coefficient); - } - return result; - } - FX_INT32 result = m_coefficients[0]; - for (FX_INT32 i = 1; i < size; i++) { - result = m_field->add(m_field->multiply(a, result), m_coefficients[i]); - } - return result; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) -{ - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (isZero()) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(other->getField(), other->getCoefficients(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - if (other->isZero()) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - CFX_Int32Array smallerCoefficients; - smallerCoefficients.Copy(m_coefficients); - CFX_Int32Array largerCoefficients; - largerCoefficients.Copy(other->m_coefficients); - if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { - CFX_Int32Array temp; - temp.Copy(smallerCoefficients); - smallerCoefficients.Copy(largerCoefficients); - largerCoefficients.Copy(temp); - } - CFX_Int32Array sumDiff; - sumDiff.SetSize(largerCoefficients.GetSize()); - FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); - for (FX_INT32 l = 0; l < lengthDiff; l++) { - sumDiff.SetAt(l, largerCoefficients.GetAt(l)); - } - for (FX_INT32 i = lengthDiff; i < largerCoefficients.GetSize(); i++) { - sumDiff[i] = m_field->add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, sumDiff, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) -{ - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (other->isZero()) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - CBC_PDF417ECModulusPoly* poly = other->negative(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - modulusPoly = add(poly, e); - delete poly; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) -{ - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (isZero() || other->isZero()) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - CFX_Int32Array aCoefficients; - aCoefficients.Copy(m_coefficients); - FX_INT32 aLength = aCoefficients.GetSize(); - CFX_Int32Array bCoefficients; - bCoefficients.Copy(other->m_coefficients); - FX_INT32 bLength = bCoefficients.GetSize(); - CFX_Int32Array product; - product.SetSize(aLength + bLength - 1); - for (FX_INT32 i = 0; i < aLength; i++) { - FX_INT32 aCoeff = aCoefficients[i]; - for (FX_INT32 j = 0; j < bLength; j++) { - product[i + j] = m_field->add(product[i + j], m_field->multiply(aCoeff, bCoefficients[j])); - } - } - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::negative(FX_INT32 &e) -{ - FX_INT32 size = m_coefficients.GetSize(); - CFX_Int32Array negativeCoefficients; - negativeCoefficients.SetSize(size); - for (FX_INT32 i = 0; i < size; i++) { - negativeCoefficients[i] = m_field->subtract(0, m_coefficients[i]); - } - CBC_PDF417ECModulusPoly* modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, negativeCoefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiply(FX_INT32 scalar, FX_INT32 &e) -{ - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (scalar == 0) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->getField(), m_field->getZero()->getCoefficients(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - if (scalar == 1) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - FX_INT32 size = m_coefficients.GetSize(); - CFX_Int32Array product; - product.SetSize(size); - for (FX_INT32 i = 0; i < size; i++) { - product[i] = m_field->multiply(m_coefficients[i], scalar); - } - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusPoly::multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) -{ - if (degree < 0) { - e = BCExceptionIllegalArgument; - return NULL; - } - CBC_PDF417ECModulusPoly* modulusPoly = NULL; - if (coefficient == 0) { - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; - } - FX_INT32 size = m_coefficients.GetSize(); - CFX_Int32Array product; - product.SetSize(size + degree); - for (FX_INT32 i = 0; i < size; i++) { - product[i] = m_field->multiply(m_coefficients[i], coefficient); - } - modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_field, product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return modulusPoly; -} -CFX_PtrArray* CBC_PDF417ECModulusPoly::divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e) -{ - if (other->isZero()) { - e = BCExceptionDivideByZero; - return NULL; - } - CBC_PDF417ECModulusPoly* quotient = FX_NEW CBC_PDF417ECModulusPoly(m_field->getZero()->m_field, m_field->getZero()->m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_PDF417ECModulusPoly* remainder = FX_NEW CBC_PDF417ECModulusPoly(m_field, m_coefficients, e); - if (e != BCExceptionNO) { - delete quotient; - return NULL; - } - FX_INT32 denominatorLeadingTerm = other->getCoefficient(other->getDegree()); - FX_INT32 inverseDenominatorLeadingTerm = m_field->inverse(denominatorLeadingTerm, e); - if (e != BCExceptionNO) { - delete quotient; - delete remainder; - return NULL; - } - while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) { - FX_INT32 degreeDifference = remainder->getDegree() - other->getDegree(); - FX_INT32 scale = m_field->multiply(remainder->getCoefficient(remainder->getDegree()), inverseDenominatorLeadingTerm); - CBC_PDF417ECModulusPoly* term = other->multiplyByMonomial(degreeDifference, scale, e); - if (e != BCExceptionNO) { - delete quotient; - delete remainder; - return NULL; - } - CBC_PDF417ECModulusPoly* iterationQuotient = m_field->buildMonomial(degreeDifference, scale, e); - if (e != BCExceptionNO) { - delete quotient; - delete remainder; - delete term; - return NULL; - } - CBC_PDF417ECModulusPoly* temp = quotient; - quotient = temp->add(iterationQuotient, e); - delete iterationQuotient; - delete temp; - if (e != BCExceptionNO) { - delete remainder; - return NULL; - } - temp = remainder; - remainder = temp->subtract(term, e); - delete term; - delete temp; - if (e != BCExceptionNO) { - delete quotient; - return NULL; - } - } - CFX_PtrArray* modulusPoly = FX_NEW CFX_PtrArray; - modulusPoly->Add(quotient); - modulusPoly->Add(remainder); - return modulusPoly; -} -CFX_ByteString CBC_PDF417ECModulusPoly::toString() -{ - CFX_ByteString result; - for (FX_INT32 degree = getDegree(); degree >= 0; degree--) { - FX_INT32 coefficient = getCoefficient(degree); - if (coefficient != 0) { - if (coefficient < 0) { - result += " - "; - coefficient = -coefficient; - } else { - if (result.GetLength() > 0) { - result += " + "; - } - } - if (degree == 0 || coefficient != 1) { - result += coefficient; - } - if (degree != 0) { - if (degree == 1) { - result += 'x'; - } else { - result += "x^"; - result += degree; - } - } - } - } - return result; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp b/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp deleted file mode 100644 index 3f83175e87..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ErrorCorrection.cpp +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417ErrorCorrection.h" -FX_INT32 CBC_PDF417ErrorCorrection::EC_COEFFICIENTS[][2500] = { - {27, 917}, - {522, 568, 723, 809}, - {237, 308, 436, 284, 646, 653, 428, 379}, - { - 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, - 42, 176, 65 - }, - { - 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, - 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, - 133, 231, 390, 685, 330, 63, 410 - }, - { - 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, - 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, - 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, - 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, - 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, - 623, 264, 543 - }, - { - 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, - 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, - 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, - 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, - 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, - 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, - 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, - 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, - 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, - 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, - 315, 550, 86, 801, 4, 108, 539 - }, - { - 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, - 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, - 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, - 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, - 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, - 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, - 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, - 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, - 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, - 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, - 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, - 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, - 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, - 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, - 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, - 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, - 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, - 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, - 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, - 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, - 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, - 55, 497, 10 - }, - { - 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, - 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, - 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, - 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, - 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, - 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, - 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, - 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, - 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, - 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, - 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, - 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, - 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, - 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, - 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, - 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, - 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, - 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, - 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, - 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, - 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, - 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, - 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, - 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, - 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, - 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, - 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, - 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, - 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, - 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, - 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, - 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, - 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, - 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, - 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, - 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, - 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, - 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, - 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, - 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, - 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, - 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, - 410, 389, 244, 31, 121, 303, 263 - } -}; -CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() -{ -} -CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() -{ -} -FX_INT32 CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e) -{ - if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { - e = BCExceptionErrorCorrectionLevelMustBeBetween0And8; - return -1; - } - return 1 << (errorCorrectionLevel + 1); -} -FX_INT32 CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e) -{ - if (n <= 0) { - e = BCExceptionIllegalArgumentnMustBeAbove0; - return -1; - } - if (n <= 40) { - return 2; - } - if (n <= 160) { - return 3; - } - if (n <= 320) { - return 4; - } - if (n <= 863) { - return 5; - } - e = BCExceptionNoRecommendationPossible; - return -1; -} -CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e) -{ - FX_INT32 k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); - FX_WCHAR* ech = FX_Alloc(FX_WCHAR, k * sizeof(FX_WCHAR)); - FXSYS_memset32(ech, 0, k * sizeof(FX_WCHAR)); - FX_INT32 sld = dataCodewords.GetLength(); - for (FX_INT32 i = 0; i < sld; i++) { - FX_INT32 t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929; - FX_INT32 t2; - FX_INT32 t3; - for (FX_INT32 j = k - 1; j >= 1; j--) { - t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; - t3 = 929 - t2; - ech[j] = (FX_WCHAR) ((ech[j - 1] + t3) % 929); - } - t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; - t3 = 929 - t2; - ech[0] = (FX_WCHAR) (t3 % 929); - } - CFX_WideString sb; - for (FX_INT32 j = k - 1; j >= 0; j--) { - if (ech[j] != 0) { - ech[j] = (FX_WCHAR) (929 - ech[j]); - } - sb += (FX_WCHAR)ech[j]; - } - FX_Free (ech); - return sb; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp deleted file mode 100644 index 61051060f6..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder.cpp +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417Compaction.h" -#include "include/BC_UtilCodingConvert.h" -#include "include/BC_PDF417HighLevelEncoder.h" -#include "../../../../third_party/bigint/BigIntegerLibrary.hh" -#define SUBMODE_ALPHA 0 -#define SUBMODE_LOWER 1 -#define SUBMODE_MIXED 2 -FX_INT32 CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0; -FX_INT32 CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1; -FX_INT32 CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2; -FX_INT32 CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3; -FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900; -FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901; -FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902; -FX_INT32 CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913; -FX_INT32 CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924; -FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, - 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0 - }; -FX_BYTE CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = {59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, - 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0 - }; -FX_INT32 CBC_PDF417HighLevelEncoder::MIXED[128] = {0}; -FX_INT32 CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0}; -void CBC_PDF417HighLevelEncoder::Initialize() -{ - Inverse(); -} -void CBC_PDF417HighLevelEncoder::Finalize() -{ -} -CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel(CFX_WideString wideMsg, Compaction compaction, FX_INT32 &e) -{ - CFX_ByteString bytes; - CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes); - CFX_WideString msg; - FX_INT32 len = bytes.GetLength(); - for (FX_INT32 i = 0; i < len; i++) { - FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff); - if (ch == '?' && bytes.GetAt(i) != '?') { - e = BCExceptionCharactersOutsideISO88591Encoding; - return (FX_LPWSTR)""; - } - msg += ch; - } - CFX_ByteArray byteArr; - for (FX_INT32 k = 0; k < bytes.GetLength(); k++) { - byteArr.Add(bytes.GetAt(k)); - } - CFX_WideString sb; - len = msg.GetLength(); - FX_INT32 p = 0; - FX_INT32 textSubMode = SUBMODE_ALPHA; - if (compaction == TEXT) { - encodeText(msg, p, len, sb, textSubMode); - } else if (compaction == BYTES) { - encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb); - } else if (compaction == NUMERIC) { - sb += (FX_WCHAR) LATCH_TO_NUMERIC; - encodeNumeric(msg, p, len, sb); - } else { - FX_INT32 encodingMode = LATCH_TO_TEXT; - while (p < len) { - FX_INT32 n = determineConsecutiveDigitCount(msg, p); - if (n >= 13) { - sb += (FX_WCHAR) LATCH_TO_NUMERIC; - encodingMode = NUMERIC_COMPACTION; - textSubMode = SUBMODE_ALPHA; - encodeNumeric(msg, p, n, sb); - p += n; - } else { - FX_INT32 t = determineConsecutiveTextCount(msg, p); - if (t >= 5 || n == len) { - if (encodingMode != TEXT_COMPACTION) { - sb += (FX_WCHAR) LATCH_TO_TEXT; - encodingMode = TEXT_COMPACTION; - textSubMode = SUBMODE_ALPHA; - } - textSubMode = encodeText(msg, p, t, sb, textSubMode); - p += t; - } else { - FX_INT32 b = determineConsecutiveBinaryCount(msg, &byteArr, p, e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); - if (b == 0) { - b = 1; - } - if (b == 1 && encodingMode == TEXT_COMPACTION) { - encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb); - } else { - encodeBinary(&byteArr, p, b, encodingMode, sb); - encodingMode = BYTE_COMPACTION; - textSubMode = SUBMODE_ALPHA; - } - p += b; - } - } - } - } - return sb; -} -void CBC_PDF417HighLevelEncoder::Inverse() -{ - FX_BYTE i = 0; - FX_INT32 l = 0; - for (l = 0; l < sizeof(MIXED) / sizeof(MIXED[0]); l++) { - MIXED[l] = -1; - } - for (i = 0; i < sizeof(TEXT_MIXED_RAW) / sizeof(TEXT_MIXED_RAW[0]); i++) { - FX_BYTE b = TEXT_MIXED_RAW[i]; - if (b > 0) { - MIXED[b] = i; - } - } - for (l = 0; l < sizeof(PUNCTUATION) / sizeof(PUNCTUATION[0]); l++) { - PUNCTUATION[l] = -1; - } - for (i = 0; i < sizeof(TEXT_PUNCTUATION_RAW) / sizeof(TEXT_PUNCTUATION_RAW[0]); i++) { - FX_BYTE b = TEXT_PUNCTUATION_RAW[i]; - if (b > 0) { - PUNCTUATION[b] = i; - } - } -} -FX_INT32 CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode) -{ - CFX_WideString tmp; - FX_INT32 submode = initialSubmode; - FX_INT32 idx = 0; - while (TRUE) { - FX_WCHAR ch = msg.GetAt(startpos + idx); - switch (submode) { - case SUBMODE_ALPHA: - if (isAlphaUpper(ch)) { - if (ch == ' ') { - tmp += (FX_WCHAR) 26; - } else { - tmp += (FX_WCHAR) (ch - 65); - } - } else { - if (isAlphaLower(ch)) { - submode = SUBMODE_LOWER; - tmp += (FX_WCHAR) 27; - continue; - } else if (isMixed(ch)) { - submode = SUBMODE_MIXED; - tmp += (FX_WCHAR) 28; - continue; - } else { - tmp += (FX_WCHAR) 29; - tmp += PUNCTUATION[ch]; - break; - } - } - break; - case SUBMODE_LOWER: - if (isAlphaLower(ch)) { - if (ch == ' ') { - tmp += (FX_WCHAR) 26; - } else { - tmp += (FX_WCHAR) (ch - 97); - } - } else { - if (isAlphaUpper(ch)) { - tmp += (FX_WCHAR) 27; - tmp += (FX_WCHAR) (ch - 65); - break; - } else if (isMixed(ch)) { - submode = SUBMODE_MIXED; - tmp += (FX_WCHAR) 28; - continue; - } else { - tmp += (FX_WCHAR) 29; - tmp += PUNCTUATION[ch]; - break; - } - } - break; - case SUBMODE_MIXED: - if (isMixed(ch)) { - FX_WCHAR a = MIXED[ch]; - FX_INT32 b = (FX_INT32)a; - tmp += MIXED[ch]; - } else { - if (isAlphaUpper(ch)) { - submode = SUBMODE_ALPHA; - tmp += (FX_WCHAR) 28; - continue; - } else if (isAlphaLower(ch)) { - submode = SUBMODE_LOWER; - tmp += (FX_WCHAR) 27; - continue; - } else { - if (startpos + idx + 1 < count) { - FX_WCHAR next = msg.GetAt(startpos + idx + 1); - if (isPunctuation(next)) { - submode = SUBMODE_PUNCTUATION; - tmp += (FX_WCHAR) 25; - continue; - } - } - tmp += (FX_WCHAR) 29; - tmp += PUNCTUATION[ch]; - } - } - break; - default: - if (isPunctuation(ch)) { - tmp += PUNCTUATION[ch]; - } else { - submode = SUBMODE_ALPHA; - tmp += (FX_WCHAR) 29; - continue; - } - } - idx++; - if (idx >= count) { - break; - } - } - FX_WCHAR h = 0; - FX_INT32 len = tmp.GetLength(); - for (FX_INT32 i = 0; i < len; i++) { - FX_BOOL odd = (i % 2) != 0; - if (odd) { - h = (FX_WCHAR) ((h * 30) + tmp.GetAt(i)); - sb += h; - } else { - h = tmp.GetAt(i); - } - } - if ((len % 2) != 0) { - sb += (FX_WCHAR) ((h * 30) + 29); - } - return submode; -} -void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb) -{ - if (count == 1 && startmode == TEXT_COMPACTION) { - sb += (FX_WCHAR) SHIFT_TO_BYTE; - } - FX_INT32 idx = startpos; - FX_INT32 i = 0; - if (count >= 6) { - sb += (FX_WCHAR) LATCH_TO_BYTE; - FX_WCHAR chars[5]; - while ((startpos + count - idx) >= 6) { - FX_INT64 t = 0; - for (i = 0; i < 6; i++) { - t <<= 8; - t += bytes->GetAt(idx + i) & 0xff; - } - for (i = 0; i < 5; i++) { - chars[i] = (FX_WCHAR) (t % 900); - t /= 900; - } - for (i = 4; i >= 0; i--) { - sb += (chars[i]); - } - idx += 6; - } - } - if (idx < startpos + count) { - sb += (FX_WCHAR) LATCH_TO_BYTE_PADDED; - } - for (i = idx; i < startpos + count; i++) { - FX_INT32 ch = bytes->GetAt(i) & 0xff; - sb += (FX_WCHAR) ch; - } -} -void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb) -{ - FX_INT32 idx = 0; - BigInteger num900 = 900; - while (idx < count - 1) { - CFX_WideString tmp; - FX_INT32 len = 44 < count - idx ? 44 : count - idx; - CFX_ByteString part = ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode(); - BigInteger bigint = stringToBigInteger(FX_LPCSTR(part)); - do { - FX_INT32 c = (bigint % num900).toInt(); - tmp += (FX_WCHAR)(c); - bigint = bigint / num900; - } while (!bigint.isZero()); - for (FX_INT32 i = tmp.GetLength() - 1; i >= 0; i--) { - sb += tmp.GetAt(i); - } - idx += len; - } -} -FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) -{ - return ch >= '0' && ch <= '9'; -} -FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) -{ - return ch == ' ' || (ch >= 'A' && ch <= 'Z'); -} -FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) -{ - return ch == ' ' || (ch >= 'a' && ch <= 'z'); -} -FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) -{ - return MIXED[ch] != -1; -} -FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) -{ - return PUNCTUATION[ch] != -1; -} -FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) -{ - return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); -} -FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos) -{ - FX_INT32 count = 0; - FX_INT32 len = msg.GetLength(); - FX_INT32 idx = startpos; - if (idx < len) { - FX_WCHAR ch = msg.GetAt(idx); - while (isDigit(ch) && idx < len) { - count++; - idx++; - if (idx < len) { - ch = msg.GetAt(idx); - } - } - } - return count; -} -FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos) -{ - FX_INT32 len = msg.GetLength(); - FX_INT32 idx = startpos; - while (idx < len) { - FX_WCHAR ch = msg.GetAt(idx); - FX_INT32 numericCount = 0; - while (numericCount < 13 && isDigit(ch) && idx < len) { - numericCount++; - idx++; - if (idx < len) { - ch = msg.GetAt(idx); - } - } - if (numericCount >= 13) { - return idx - startpos - numericCount; - } - if (numericCount > 0) { - continue; - } - ch = msg.GetAt(idx); - if (!isText(ch)) { - break; - } - idx++; - } - return idx - startpos; -} -FX_INT32 CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e) -{ - FX_INT32 len = msg.GetLength(); - FX_INT32 idx = startpos; - while (idx < len) { - FX_WCHAR ch = msg.GetAt(idx); - FX_INT32 numericCount = 0; - while (numericCount < 13 && isDigit(ch)) { - numericCount++; - FX_INT32 i = idx + numericCount; - if (i >= len) { - break; - } - ch = msg.GetAt(i); - } - if (numericCount >= 13) { - return idx - startpos; - } - FX_INT32 textCount = 0; - while (textCount < 5 && isText(ch)) { - textCount++; - FX_INT32 i = idx + textCount; - if (i >= len) { - break; - } - ch = msg.GetAt(i); - } - if (textCount >= 5) { - return idx - startpos; - } - ch = msg.GetAt(idx); - if (bytes->GetAt(idx) == 63 && ch != '?') { - e = BCExceptionNonEncodableCharacterDetected; - return -1; - } - idx++; - } - return idx - startpos; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder_unittest.cpp b/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder_unittest.cpp deleted file mode 100644 index df45b16a78..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417HighLevelEncoder_unittest.cpp +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/include/fxcrt/fx_basic.h" -#include "include/BC_PDF417HighLevelEncoder.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/fx_string_testhelpers.h" - -TEST(PDF417HighLevelEncoder, EncodeHighLevel) { - // TODO(tsepez): implement test cases. -} - -TEST(PDF417HighLevelEncoder, EncodeText) { - // TODO(tsepez): implement test cases. -} - -TEST(PDF417HighLevelEncoder, EncodeBinary) { - struct EncodeBinaryCase { - const char* input; - int offset; - int count; - int startmode; - const wchar_t* expected; - int expected_length; - } encode_binary_cases[] = { - // Empty string encodes as empty string. - { "", 0, 0, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"", 0 }, - - // Fewer than 6 characters encodes as prefix without compaction. - { "xxxxx", 0, 5, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, L"\x0385xxxxx", 6 }, - - // 6 charcters triggerst text encoding compaction. - { "xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::TEXT_COMPACTION, - L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6 }, - - // Same result if initially in numeric compaction mode. - { "xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION, - L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6 }, - }; - - CBC_PDF417HighLevelEncoder::Initialize(); - for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) { - EncodeBinaryCase* ptr = &encode_binary_cases[i]; - CFX_ByteArray input_array; - size_t input_length = strlen(ptr->input); - input_array.SetSize(input_length); - for (size_t j = 0; j < input_length; ++j) { - input_array.SetAt(j, ptr->input[j]); - } - CFX_WideString expected(ptr->expected, ptr->expected_length); - CFX_WideString result; - CBC_PDF417HighLevelEncoder::encodeBinary( - &input_array, ptr->offset, ptr->count, ptr->startmode, result); - EXPECT_EQ(expected, result) << " for case number " << i; - } - CBC_PDF417HighLevelEncoder::Finalize(); -} - -TEST(PDF417HighLevelEncoder, EncodeNumeric) { - struct EncodeNumericCase { - const wchar_t* input; - int offset; - int count; - const wchar_t* expected; - int expected_length; - } encode_numeric_cases[] = { - // Empty string encodes as empty string. - { L"", 0, 0, L"", 0 }, - - // Blank string encodes as empty string. - { L" ", 0, 1, L"", 0 }, - - // Single 0 should encode as 10 base-900 == 10. - { L"0", 0, 1, L"", 0 }, // wrong - should be \u000a? - - // 800 should encode as 1800 base-900 == 2,0. - { L"800", 0, 3, L"\x0002\x0000", 2 }, - - // Test longer strings and sub-strings. - { L"123456", 0, 6, L"\x0001\x015c\x0100", 3 }, - { L"123456", 0, 5, L"\x007c\x02e9", 2 }, - { L"123456", 1, 5, L"\x0089\x009c", 2 }, - { L"123456", 2, 2, L"\x0086", 1 }, - - // Up to 44 characters encodes as 15 base-900 words. - { L"00000000000000000000000000000000000000000000", 0, 44, - L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064", 15 }, - - // 45 characters should encode as same 15 words followed by one additional word. - { L"000000000000000000000000000000000000000000000", 0, 45, - L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064\x000a", 16 }, - - // 44 characters followed by 800 should encode as 15 words followed by 1800 base-900 == 2,0. - { L"00000000000000000000000000000000000000000000800", 0, 47, - L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6\x0090\x020b\x019b\x0064\x0002\x0000", 17 }, - - // Even longer input. - { L"10000000000000000000000000000000000000000000000000", 0, 50, - L"\x01e0\x02f0\x036d\x02ad\x029c\x01ea\x0011\x000b\x02d6\x023c\x0108\x02bb\x0023\x02d2\x00c8\x0001\x00d3\x0064", 18 }, - }; - - CBC_PDF417HighLevelEncoder::Initialize(); - for (size_t i = 0; i < FX_ArraySize(encode_numeric_cases); ++i) { - EncodeNumericCase* ptr = &encode_numeric_cases[i]; - CFX_WideString input(ptr->input); - CFX_WideString expected(ptr->expected, ptr->expected_length); - CFX_WideString result; - CBC_PDF417HighLevelEncoder::encodeNumeric( - input, ptr->offset, ptr->count, result); - EXPECT_EQ(expected, result) << " for case number " << i; - } - CBC_PDF417HighLevelEncoder::Finalize(); -} - -TEST(PDF417HighLevelEncoder, ConsecutiveDigitCount) { - struct ConsecutiveDigitCase { - const wchar_t* input; - int offset; - int expected_count; - } consecutive_digit_cases[] = { - // Empty string contains 0 consecuitve digits. - { L"", 0, 0 }, - - // Single non-digit character contains 0 consecutive digits. - { L"X", 0, 0 }, - - // Leading non-digit followed by digits contains 0 consecutive. - { L"X123", 0, 0 }, - - // Single digit contains 1 consecutive digit. - { L"1", 0, 1 }, - - // Single digit followe by non-digit contains 1 consecutive digit. - { L"1Z", 0, 1 }, - - // Test longer strings. - { L"123FOO45678", 0, 3 }, - - // Test subtring starting in digits field. - { L"123FOO45678", 3, 0 }, - - // Test subtring starting in non-digits field. - { L"123FOO45678", 3, 0 }, - - // Test substring starting in digits field following non-digit field. - { L"123FOO45678", 6, 5 }, - }; - - CBC_PDF417HighLevelEncoder::Initialize(); - for (size_t i = 0; i < FX_ArraySize(consecutive_digit_cases); ++i) { - ConsecutiveDigitCase* ptr = &consecutive_digit_cases[i]; - CFX_WideString input(ptr->input); - int actual_count = CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount(input, ptr->offset); - EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i; - } - CBC_PDF417HighLevelEncoder::Finalize(); -} - -TEST(PDF417HighLevelEncoder, ConsecutiveTextCount) { - struct ConsecutiveTextCase { - const wchar_t* input; - int offset; - int expected_count; - } consecutive_text_cases[] = { - // Empty string contains 0 consecutive text characters. - { L"", 0, 0 }, - - // Single text character is 1 consecutive text characters. - { L"X", 0, 1 }, - - // Trailing numbers count as text characters. - { L"X123", 0, 4 }, - - // Leading numbers count as text characters. - { L"123X", 0, 4 }, - - // Embedded lo-value binary characters terminate text runs. - { L"ABC\x0001XXXX", 0, 3 }, - - // Embedded hi-value binary characters terminate text runs. - { L"ABC\x0100XXXX", 0, 3 }, - - // Text run still found after indexing past lo-value character. - { L"ABC\x0001XXXX", 4, 4 }, - - // Text run still found after indexing past hi-value character. - { L"ABC\x0100XXXX", 4, 4 }, - - // Leading hi-value character results in 0 consecutive characters. - { L"\x0100XXX", 0, 0 }, - - // Up to 12 numbers count as text. - { L"123456789012", 0, 12 }, - - // 13 or more numbers are compresssed using numeric compression, not text. - { L"1234567890123", 0, 0 }, - - // Leading Text character doesn't affect the 12 character case. - { L"X123456789012", 0, 13 }, - - // Leading Text character doesn't affect the 13 character case. - { L"X1234567890123", 0, 1 }, - - // Jumping between numbers and letters works properly. - { L"XXX121XXX12345678901234", 0, 9 }, - }; - - CBC_PDF417HighLevelEncoder::Initialize(); - for (size_t i = 0; i < FX_ArraySize(consecutive_text_cases); ++i) { - ConsecutiveTextCase* ptr = &consecutive_text_cases[i]; - CFX_WideString input(ptr->input); - int actual_count = CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount(input, ptr->offset); - EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i; - } - CBC_PDF417HighLevelEncoder::Finalize(); -} - -TEST(PDF417HighLevelEncoder, ConsecutiveBinaryCount) { - -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp b/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp deleted file mode 100644 index 7b75c0009b..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Reader.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_PDF417Detector.h" -#include "include/BC_PDF417DetectorResult.h" -#include "include/BC_DecoderResult.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417BarcodeValue.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -#include "include/BC_PDF417DetectionResult.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417CodewordDecoder.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECErrorCorrection.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_PDF417ScanningDecoder.h" -#include "include/BC_PDF417Reader.h" -#define Integer_MAX_VALUE 2147483647 -CBC_PDF417Reader::CBC_PDF417Reader() -{ -} -CBC_PDF417Reader::~CBC_PDF417Reader() -{ -} -CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) -{ - return Decode(image, 0, e); -} -CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString results; - CBC_PDF417DetectorResult* detectorResult = CBC_Detector::detect(image, hints, multiple, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - for (FX_INT32 i = 0; i < detectorResult->getPoints()->GetSize(); i++) { - CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i); - CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4), (CBC_ResultPoint*)points->GetAt(5), - (CBC_ResultPoint*)points->GetAt(6), (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points), getMaxCodewordWidth(*points), e); - if (ResultTemp == NULL) { - delete detectorResult; - e = BCExceptiontNotFoundInstance; - return ""; - } - results += ResultTemp->GetText(); - delete ResultTemp; - } - delete detectorResult; - return results; -} -CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - CFX_ByteString bs = Decode(image, FALSE, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bs; -} -FX_INT32 CBC_PDF417Reader::getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) -{ - if (p1 == NULL || p2 == NULL) { - return 0; - } - return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); -} -FX_INT32 CBC_PDF417Reader::getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2) -{ - if (p1 == NULL || p2 == NULL) { - return Integer_MAX_VALUE; - } - return (FX_INT32) FXSYS_fabs(p1->GetX() - p2->GetX()); -} -FX_INT32 CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) -{ - FX_INT32 a = getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; - FX_INT32 b = getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; - FX_INT32 c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; - FX_INT32 d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; - return c < d ? c : d; -} -FX_INT32 CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) -{ - FX_INT32 a = getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; - FX_INT32 b = getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) * CBC_PDF417Common::MODULES_IN_CODEWORD / CBC_PDF417Common::MODULES_IN_STOP_PATTERN; - FX_INT32 c = getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) < a ? getMinWidth((CBC_ResultPoint*)p.GetAt(0), (CBC_ResultPoint*)p.GetAt(4)) : a; - FX_INT32 d = getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) < b ? getMinWidth((CBC_ResultPoint*)p.GetAt(1), (CBC_ResultPoint*)p.GetAt(5)) : b; - return c < d ? c : d; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp b/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp deleted file mode 100644 index 9f4b98d7bd..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ResultMetadata.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_PDF417ResultMetadata.h" -CBC_PDF417ResultMetadata::CBC_PDF417ResultMetadata() -{ -} -CBC_PDF417ResultMetadata::~CBC_PDF417ResultMetadata() -{ -} -FX_INT32 CBC_PDF417ResultMetadata::getSegmentIndex() -{ - return m_segmentIndex; -} -void CBC_PDF417ResultMetadata::setSegmentIndex(FX_INT32 segmentIndex) -{ - m_segmentIndex = segmentIndex; -} -CFX_ByteString CBC_PDF417ResultMetadata::getFileId() -{ - return m_fileId; -} -void CBC_PDF417ResultMetadata::setFileId(CFX_ByteString fileId) -{ - m_fileId = fileId; -} -CFX_Int32Array& CBC_PDF417ResultMetadata::getOptionalData() -{ - return m_optionalData; -} -void CBC_PDF417ResultMetadata::setOptionalData(CFX_Int32Array &optionalData) -{ - m_optionalData.Copy(optionalData); -} -FX_BOOL CBC_PDF417ResultMetadata::isLastSegment() -{ - return m_lastSegment; -} -void CBC_PDF417ResultMetadata::setLastSegment(FX_BOOL lastSegment) -{ - m_lastSegment = lastSegment; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp b/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp deleted file mode 100644 index 4812883800..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417ScanningDecoder.cpp +++ /dev/null @@ -1,596 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_DecoderResult.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_PDF417Codeword.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417Common.h" -#include "include/BC_PDF417BarcodeValue.h" -#include "include/BC_PDF417BarcodeMetadata.h" -#include "include/BC_PDF417BoundingBox.h" -#include "include/BC_PDF417DetectionResultColumn.h" -#include "include/BC_PDF417DetectionResultRowIndicatorColumn.h" -#include "include/BC_PDF417DetectionResult.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417CodewordDecoder.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417ECModulusPoly.h" -#include "include/BC_PDF417ECModulusGF.h" -#include "include/BC_PDF417ECErrorCorrection.h" -#include "include/BC_PDF417DecodedBitStreamParser.h" -#include "include/BC_PDF417ScanningDecoder.h" -FX_INT32 CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2; -FX_INT32 CBC_PDF417ScanningDecoder::MAX_ERRORS = 3; -FX_INT32 CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512; -CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL; -CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() -{ -} -CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() -{ -} -void CBC_PDF417ScanningDecoder::Initialize() -{ - errorCorrection = FX_NEW CBC_PDF417ECErrorCorrection; -} -void CBC_PDF417ScanningDecoder::Finalize() -{ - delete errorCorrection; -} -CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, - CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e) -{ - CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL; - CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL; - CBC_DetectionResult* detectionResult = NULL; - for (FX_INT32 i = 0; i < 2; i++) { - if (imageTopLeft != NULL) { - leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopLeft, TRUE, minCodewordWidth, maxCodewordWidth); - } - if (imageTopRight != NULL) { - rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *imageTopRight, FALSE, minCodewordWidth, maxCodewordWidth); - } - detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn, e); - if (e != BCExceptionNO) { - e = BCExceptiontNotFoundInstance; - delete leftRowIndicatorColumn; - delete rightRowIndicatorColumn; - delete boundingBox; - return NULL; - } - if (i == 0 && (detectionResult->getBoundingBox()->getMinY() < boundingBox->getMinY() || detectionResult->getBoundingBox()->getMaxY() > boundingBox->getMaxY())) { - delete boundingBox; - boundingBox = detectionResult->getBoundingBox(); - } else { - detectionResult->setBoundingBox(boundingBox); - break; - } - } - FX_INT32 maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1; - detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn); - detectionResult->setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn); - FX_BOOL leftToRight = leftRowIndicatorColumn != NULL; - for (FX_INT32 barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { - FX_INT32 barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; - if (detectionResult->getDetectionResultColumn(barcodeColumn) != NULL) { - continue; - } - CBC_DetectionResultColumn* detectionResultColumn = NULL; - if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { - detectionResultColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn == 0); - } else { - detectionResultColumn = FX_NEW CBC_DetectionResultColumn(boundingBox); - } - detectionResult->setDetectionResultColumn(barcodeColumn, detectionResultColumn); - FX_INT32 startColumn = -1; - FX_INT32 previousStartColumn = startColumn; - for (FX_INT32 imageRow = boundingBox->getMinY(); imageRow <= boundingBox->getMaxY(); imageRow++) { - startColumn = getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); - if (startColumn < 0 || startColumn > boundingBox->getMaxX()) { - if (previousStartColumn == -1) { - continue; - } - startColumn = previousStartColumn; - } - CBC_Codeword* codeword = detectCodeword(image, boundingBox->getMinX(), boundingBox->getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); - if (codeword != NULL) { - detectionResultColumn->setCodeword(imageRow, codeword); - previousStartColumn = startColumn; - minCodewordWidth = minCodewordWidth < codeword->getWidth() ? minCodewordWidth : codeword->getWidth(); - maxCodewordWidth = maxCodewordWidth > codeword->getWidth() ? maxCodewordWidth : codeword->getWidth(); - } - } - } - CBC_CommonDecoderResult* decoderresult = createDecoderResult(detectionResult, e); - if (e != BCExceptionNO) { - delete detectionResult; - return NULL; - } - return decoderresult; -} -CFX_ByteString CBC_PDF417ScanningDecoder::toString(CFX_PtrArray* barcodeMatrix) -{ - CFX_ByteString result; - for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { - result += row; - FX_INT32 l = 0; - for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) { - CBC_BarcodeValue* barcodeValue = (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l); - if (barcodeValue->getValue()->GetSize() == 0) { - result += ""; - } else { - result += barcodeValue->getValue()->GetAt(0); - result += barcodeValue->getConfidence(barcodeValue->getValue()->GetAt(0)); - } - } - } - return result; -} -CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e) -{ - if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) { - e = BCExceptionIllegalArgument; - return NULL; - } - CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn); - if (barcodeMetadata == NULL) { - e = BCExceptionCannotMetadata; - return NULL; - } - CBC_BoundingBox* leftboundingBox = adjustBoundingBox(leftRowIndicatorColumn, e); - if (e != BCExceptionNO) { - delete barcodeMetadata; - return NULL; - } - CBC_BoundingBox* rightboundingBox = adjustBoundingBox(rightRowIndicatorColumn, e); - if (e != BCExceptionNO) { - delete barcodeMetadata; - return NULL; - } - CBC_BoundingBox* boundingBox = CBC_BoundingBox::merge(leftboundingBox, rightboundingBox, e); - if (e != BCExceptionNO) { - delete barcodeMetadata; - return NULL; - } - CBC_DetectionResult* detectionresult = FX_NEW CBC_DetectionResult(barcodeMetadata, boundingBox); - return detectionresult; -} -CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e) -{ - if (rowIndicatorColumn == NULL) { - return NULL; - } - CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 maxRowHeight = getMax(*rowHeights); - FX_INT32 missingStartRows = 0; - for (FX_INT32 i = 0; i < rowHeights->GetSize(); i++) { - FX_INT32 rowHeight = rowHeights->GetAt(i); - missingStartRows += maxRowHeight - rowHeight; - if (rowHeight > 0) { - break; - } - } - CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords(); - for (FX_INT32 row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL; row++) { - missingStartRows--; - } - FX_INT32 missingEndRows = 0; - for (FX_INT32 row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) { - missingEndRows += maxRowHeight - rowHeights->GetAt(row1); - if (rowHeights->GetAt(row1) > 0) { - break; - } - } - for (FX_INT32 row2 = codewords->GetSize() - 1; missingEndRows > 0 && codewords->GetAt(row2) == NULL; row2--) { - missingEndRows--; - } - CBC_BoundingBox* boundingBox = rowIndicatorColumn->getBoundingBox()->addMissingRows(missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return boundingBox; -} -FX_INT32 CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) -{ - FX_INT32 maxValue = -1; - for (FX_INT32 i = 0; i < values.GetSize(); i++) { - FX_INT32 value = values.GetAt(i); - maxValue = maxValue > value ? maxValue : value; - } - return maxValue; -} -CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, - CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) -{ - CBC_BarcodeMetadata* leftBarcodeMetadata = NULL; - CBC_BarcodeMetadata* rightBarcodeMetadata = NULL; - if (leftRowIndicatorColumn == NULL || (leftBarcodeMetadata = leftRowIndicatorColumn->getBarcodeMetadata()) == NULL) { - return rightRowIndicatorColumn == NULL ? NULL : rightRowIndicatorColumn->getBarcodeMetadata(); - } - if (rightRowIndicatorColumn == NULL || (rightBarcodeMetadata = rightRowIndicatorColumn->getBarcodeMetadata()) == NULL) { - return leftRowIndicatorColumn == NULL ? NULL : leftRowIndicatorColumn->getBarcodeMetadata(); - } - if (leftBarcodeMetadata->getColumnCount() != rightBarcodeMetadata->getColumnCount() && - leftBarcodeMetadata->getErrorCorrectionLevel() != rightBarcodeMetadata->getErrorCorrectionLevel() && - leftBarcodeMetadata->getRowCount() != rightBarcodeMetadata->getRowCount()) { - delete leftBarcodeMetadata; - delete rightBarcodeMetadata; - return NULL; - } - delete rightBarcodeMetadata; - return leftBarcodeMetadata; -} -CBC_DetectionResultRowIndicatorColumn* CBC_PDF417ScanningDecoder::getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, - FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) -{ - CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn(boundingBox, leftToRight); - for (FX_INT32 i = 0; i < 2; i++) { - FX_INT32 increment = i == 0 ? 1 : -1; - FX_INT32 startColumn = (FX_INT32) startPoint.GetX(); - for (FX_INT32 imageRow = (FX_INT32) startPoint.GetY(); imageRow <= boundingBox->getMaxY() && imageRow >= boundingBox->getMinY(); imageRow += increment) { - CBC_Codeword* codeword = detectCodeword(image, 0, image->GetWidth(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); - if (codeword != NULL) { - rowIndicatorColumn->setCodeword(imageRow, codeword); - if (leftToRight) { - startColumn = codeword->getStartX(); - } else { - startColumn = codeword->getEndX(); - } - } - } - } - return rowIndicatorColumn; -} -void CBC_PDF417ScanningDecoder::adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e) -{ - CFX_Int32Array* numberOfCodewords = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->getValue(); - FX_INT32 calculatedNumberOfCodewords = detectionResult->getBarcodeColumnCount() * detectionResult->getBarcodeRowCount() - getNumberOfECCodeWords(detectionResult->getBarcodeECLevel()); - if (numberOfCodewords->GetSize() == 0) { - if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) { - e = BCExceptiontNotFoundInstance; - delete numberOfCodewords; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); - } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) { - ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))->setValue(calculatedNumberOfCodewords); - } - delete numberOfCodewords; -} -CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e) -{ - CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult); - adjustCodewordCount(detectionResult, barcodeMatrix, e); - if (e != BCExceptionNO) { - for (FX_INT32 i = 0; i < barcodeMatrix->GetSize(); i++) { - CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i); - for (FX_INT32 j = 0; j < temp->GetSize(); j++) { - delete (CBC_BarcodeValue*)temp->GetAt(j); - } - temp->RemoveAll(); - delete temp; - } - barcodeMatrix->RemoveAll(); - delete barcodeMatrix; - return NULL; - } - CFX_Int32Array erasures; - CFX_Int32Array codewords; - codewords.SetSize(detectionResult->getBarcodeRowCount() * detectionResult->getBarcodeColumnCount()); - CFX_PtrArray ambiguousIndexValuesList; - CFX_Int32Array ambiguousIndexesList; - for (FX_INT32 row = 0; row < detectionResult->getBarcodeRowCount(); row++) { - for (FX_INT32 l = 0; l < detectionResult->getBarcodeColumnCount(); l++) { - CFX_Int32Array* values = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetAt(l + 1))->getValue(); - FX_INT32 codewordIndex = row * detectionResult->getBarcodeColumnCount() + l; - if (values->GetSize() == 0) { - erasures.Add(codewordIndex); - } else if (values->GetSize() == 1) { - codewords[codewordIndex] = values->GetAt(0); - } else { - ambiguousIndexesList.Add(codewordIndex); - ambiguousIndexValuesList.Add(values); - } - } - } - CFX_PtrArray ambiguousIndexValues; - ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize()); - for (FX_INT32 i = 0; i < ambiguousIndexValues.GetSize(); i++) { - ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i)); - } - for (FX_INT32 l = 0; l < barcodeMatrix->GetSize(); l++) { - CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l); - for (FX_INT32 j = 0; j < temp->GetSize(); j++) { - delete (CBC_BarcodeValue*)temp->GetAt(j); - } - temp->RemoveAll(); - delete temp; - } - barcodeMatrix->RemoveAll(); - delete barcodeMatrix; - CBC_CommonDecoderResult* decoderResult = createDecoderResultFromAmbiguousValues(detectionResult->getBarcodeECLevel(), codewords, erasures, ambiguousIndexesList, ambiguousIndexValues, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return decoderResult; -} -CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, - CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e) -{ - CFX_Int32Array ambiguousIndexCount; - ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize()); - FX_INT32 tries = 100; - while (tries-- > 0) { - for (FX_INT32 l = 0; l < ambiguousIndexCount.GetSize(); l++) { - codewords[ambiguousIndexes[l]] = ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))->GetAt(ambiguousIndexCount[l]); - } - CBC_CommonDecoderResult* decoderResult = decodeCodewords(codewords, ecLevel, erasureArray, e); - if (e != BCExceptionNO) { - e = BCExceptionNO; - continue; - } else { - return decoderResult; - } - if (ambiguousIndexCount.GetSize() == 0) { - e = BCExceptionChecksumInstance; - return NULL; - } - for (FX_INT32 i = 0; i < ambiguousIndexCount.GetSize(); i++) { - if (ambiguousIndexCount[i] < ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) { - ambiguousIndexCount[i]++; - break; - } else { - ambiguousIndexCount[i] = 0; - if (i == ambiguousIndexCount.GetSize() - 1) { - e = BCExceptionChecksumInstance; - return NULL; - } - } - } - } - e = BCExceptionChecksumInstance; - return NULL; -} -CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(CBC_DetectionResult* detectionResult) -{ - CFX_PtrArray* barcodeMatrix = FX_NEW CFX_PtrArray; - barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount()); - CFX_PtrArray* temp = NULL; - FX_INT32 colume = 0; - for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { - temp = FX_NEW CFX_PtrArray; - temp->SetSize(detectionResult->getBarcodeColumnCount() + 2); - for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2; colume++) { - temp->SetAt(colume, FX_NEW CBC_BarcodeValue()); - } - barcodeMatrix->SetAt(row, temp); - } - colume = -1; - for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumns().GetSize(); i++) { - CBC_DetectionResultColumn* detectionResultColumn = (CBC_DetectionResultColumn*) detectionResult->getDetectionResultColumns().GetAt(i); - colume++; - if (detectionResultColumn == NULL) { - continue; - } - CFX_PtrArray* temp = detectionResultColumn->getCodewords(); - for (FX_INT32 l = 0; l < temp->GetSize(); l++) { - CBC_Codeword* codeword = (CBC_Codeword*) temp->GetAt(l); - if (codeword == NULL || codeword->getRowNumber() == -1) { - continue; - } - ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(codeword->getRowNumber()))->GetAt(colume))->setValue(codeword->getValue()); - } - } - return barcodeMatrix; -} -FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn) -{ - return barcodeColumn >= 0 && barcodeColumn <= detectionResult->getBarcodeColumnCount() + 1; -} -FX_INT32 CBC_PDF417ScanningDecoder::getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight) -{ - FX_INT32 offset = leftToRight ? 1 : -1; - CBC_Codeword* codeword = NULL; - if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodeword(imageRow); - } - if (codeword != NULL) { - return leftToRight ? codeword->getEndX() : codeword->getStartX(); - } - codeword = detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewordNearby(imageRow); - if (codeword != NULL) { - return leftToRight ? codeword->getStartX() : codeword->getEndX(); - } - if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult->getDetectionResultColumn(barcodeColumn - offset)->getCodewordNearby(imageRow); - } - if (codeword != NULL) { - return leftToRight ? codeword->getEndX() : codeword->getStartX(); - } - FX_INT32 skippedColumns = 0; - while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - barcodeColumn -= offset; - for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetSize(); i++) { - CBC_Codeword* previousRowCodeword = (CBC_Codeword*) detectionResult->getDetectionResultColumn(barcodeColumn)->getCodewords()->GetAt(i); - if (previousRowCodeword != NULL) { - return (leftToRight ? previousRowCodeword->getEndX() : previousRowCodeword->getStartX()) + - offset * skippedColumns * (previousRowCodeword->getEndX() - previousRowCodeword->getStartX()); - } - } - skippedColumns++; - } - return leftToRight ? detectionResult->getBoundingBox()->getMinX() : detectionResult->getBoundingBox()->getMaxX(); -} -CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, - FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) -{ - startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - CFX_Int32Array* moduleBitCount = getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - if (moduleBitCount == NULL) { - return NULL; - } - FX_INT32 endColumn; - FX_INT32 codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount); - if (leftToRight) { - endColumn = startColumn + codewordBitCount; - } else { - for (FX_INT32 i = 0; i < moduleBitCount->GetSize() >> 1; i++) { - FX_INT32 tmpCount = moduleBitCount->GetAt(i); - moduleBitCount->SetAt(i, moduleBitCount->GetAt(moduleBitCount->GetSize() - 1 - i)); - moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount); - } - endColumn = startColumn; - startColumn = endColumn - codewordBitCount; - } - FX_INT32 decodedValue = CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBitCount); - FX_INT32 codeword = CBC_PDF417Common::getCodeword(decodedValue); - delete moduleBitCount; - if (codeword == -1) { - return NULL; - } - return FX_NEW CBC_Codeword(startColumn, endColumn, getCodewordBucketNumber(decodedValue), codeword); -} -CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow) -{ - FX_INT32 imageColumn = startColumn; - CFX_Int32Array* moduleBitCount = FX_NEW CFX_Int32Array; - moduleBitCount->SetSize(8); - FX_INT32 moduleNumber = 0; - FX_INT32 increment = leftToRight ? 1 : -1; - FX_BOOL previousPixelValue = leftToRight; - while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageColumn >= minColumn)) && moduleNumber < moduleBitCount->GetSize()) { - if (image->Get(imageColumn, imageRow) == previousPixelValue) { - moduleBitCount->SetAt(moduleNumber, moduleBitCount->GetAt(moduleNumber) + 1); - imageColumn += increment; - } else { - moduleNumber++; - previousPixelValue = !previousPixelValue; - } - } - if (moduleNumber == moduleBitCount->GetSize() || (((leftToRight && imageColumn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber == moduleBitCount->GetSize() - 1)) { - return moduleBitCount; - } - delete moduleBitCount; - return NULL; -} -FX_INT32 CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(FX_INT32 barcodeECLevel) -{ - return 2 << barcodeECLevel; -} -FX_INT32 CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow) -{ - FX_INT32 correctedStartColumn = codewordStartColumn; - FX_INT32 increment = leftToRight ? -1 : 1; - for (FX_INT32 i = 0; i < 2; i++) { - FX_BOOL l = image->Get(correctedStartColumn, imageRow); - while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRight && correctedStartColumn < maxColumn)) && leftToRight == image->Get(correctedStartColumn, imageRow)) { - if (abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_SIZE) { - return codewordStartColumn; - } - correctedStartColumn += increment; - } - increment = -increment; - leftToRight = !leftToRight; - } - return correctedStartColumn; -} -FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) -{ - return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE; -} -CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e) -{ - if (codewords.GetSize() == 0) { - e = BCExceptionFormatInstance; - return NULL; - } - FX_INT32 numECCodewords = 1 << (ecLevel + 1); - FX_INT32 correctedErrorsCount = correctErrors(codewords, erasures, numECCodewords, e); - BC_EXCEPTION_CHECK_ReturnValue(e , NULL); - verifyCodewordCount(codewords, numECCodewords, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CFX_ByteString bytestring; - CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(codewords, bytestring.FormatInteger(ecLevel), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return decoderResult; -} -FX_INT32 CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e) -{ - if ((erasures.GetSize() != 0 && erasures.GetSize() > (numECCodewords / 2 + MAX_ERRORS)) || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { - e = BCExceptionChecksumInstance; - return -1; - } - FX_INT32 result = CBC_PDF417ECErrorCorrection::decode(codewords, numECCodewords, erasures, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - return result; -} -void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e) -{ - if (codewords.GetSize() < 4) { - e = BCExceptionFormatInstance; - return; - } - FX_INT32 numberOfCodewords = codewords.GetAt(0); - if (numberOfCodewords > codewords.GetSize()) { - e = BCExceptionFormatInstance; - return; - } - if (numberOfCodewords == 0) { - if (numECCodewords < codewords.GetSize()) { - codewords[0] = codewords.GetSize() - numECCodewords; - } else { - e = BCExceptionFormatInstance; - return; - } - } -} -CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(FX_INT32 codeword) -{ - CFX_Int32Array* result = FX_NEW CFX_Int32Array; - result->SetSize(8); - FX_INT32 previousValue = 0; - FX_INT32 i = result->GetSize() - 1; - while (TRUE) { - if ((codeword & 0x1) != previousValue) { - previousValue = codeword & 0x1; - i--; - if (i < 0) { - break; - } - } - result->SetAt(i, result->GetAt(i) + 1); - codeword >>= 1; - } - return result; -} -FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(FX_INT32 codeword) -{ - CFX_Int32Array* array = getBitCountForCodeword(codeword); - FX_INT32 result = getCodewordBucketNumber(*array); - delete array; - return result; -} -FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(CFX_Int32Array& moduleBitCount) -{ - return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) + moduleBitCount.GetAt(4) - moduleBitCount.GetAt(6) + 9) % 9; -} diff --git a/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp b/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp deleted file mode 100644 index d9d41d5200..0000000000 --- a/xfa/src/fxbarcode/src/BC_PDF417Writer.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_TwoDimWriter.h" -#include "include/BC_PDF417Compaction.h" -#include "include/BC_PDF417.h" -#include "include/BC_PDF417BarcodeMatrix.h" -#include "include/BC_CommonBitArray.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_PDF417Writer.h" -CBC_PDF417Writer::CBC_PDF417Writer() -{ - m_bFixedSize = FALSE; -} -CBC_PDF417Writer::~CBC_PDF417Writer() -{ - m_bTruncated = TRUE; -} -FX_BOOL CBC_PDF417Writer:: SetErrorCorrectionLevel(FX_INT32 level) -{ - if (level < 0 || level > 8) { - return FALSE; - } - m_iCorrectLevel = level; - return TRUE; -} -void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) -{ - m_bTruncated = truncated; -} -FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - if ( format != BCFORMAT_PDF_417) { - return NULL; - } - CFX_WideString encodeContents = contents.UTF8Decode(); - return Encode(encodeContents, outWidth, outHeight, e ); -} -FX_BYTE* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - return NULL; -} -FX_BYTE* CBC_PDF417Writer::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - CBC_PDF417 encoder; - FX_INT32 col = (m_Width / m_ModuleWidth - 69) / 17; - FX_INT32 row = m_Height / (m_ModuleWidth * 20); - if (row >= 3 && row <= 90 && col >= 1 && col <= 30) { - encoder.setDimensions(col, col, row, row); - } else if (col >= 1 && col <= 30) { - encoder.setDimensions(col, col, 90, 3); - } else if (row >= 3 && row <= 90) { - encoder.setDimensions(30, 1, row, row); - } - encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 lineThickness = 2; - FX_INT32 aspectRatio = 4; - CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix(); - CFX_ByteArray originalScale; - originalScale.Copy(barcodeMatrix->getScaledMatrix(lineThickness, aspectRatio * lineThickness)); - FX_INT32 width = outWidth; - FX_INT32 height = outHeight; - outWidth = barcodeMatrix->getWidth(); - outHeight = barcodeMatrix->getHeight(); - FX_BOOL rotated = FALSE; - if ((height > width) ^ (outWidth < outHeight)) { - rotateArray(originalScale, outHeight, outWidth); - rotated = TRUE; - FX_INT32 temp = outHeight; - outHeight = outWidth; - outWidth = temp; - } - FX_INT32 scaleX = width / outWidth; - FX_INT32 scaleY = height / outHeight; - FX_INT32 scale; - if (scaleX < scaleY) { - scale = scaleX; - } else { - scale = scaleY; - } - if (scale > 1) { - originalScale.RemoveAll(); - originalScale.Copy(barcodeMatrix->getScaledMatrix(scale * lineThickness, scale * aspectRatio * lineThickness)); - if (rotated) { - rotateArray(originalScale, outHeight, outWidth); - FX_INT32 temp = outHeight; - outHeight = outWidth; - outWidth = temp; - } - } - FX_BYTE* result = (FX_BYTE*)FX_Alloc(FX_BYTE, outHeight * outWidth); - FXSYS_memcpy32(result, originalScale.GetData(), outHeight * outWidth); - return result; -} -void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray, FX_INT32 height, FX_INT32 width) -{ - CFX_ByteArray temp; - temp.Copy(bitarray); - for (FX_INT32 ii = 0; ii < height; ii++) { - FX_INT32 inverseii = height - ii - 1; - for (FX_INT32 jj = 0; jj < width; jj++) { - bitarray[jj * height + inverseii] = temp[ii * width + jj]; - } - } -} diff --git a/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp b/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp deleted file mode 100644 index ace8ac2c41..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRAlignmentPattern.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRAlignmentPattern.h" -CBC_QRAlignmentPattern::CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize): - CBC_ResultPoint(posX, posY), m_moduleSize(estimateModuleSize) -{ -} -CBC_QRAlignmentPattern::~CBC_QRAlignmentPattern() -{ -} -FX_FLOAT CBC_QRAlignmentPattern::GetX() -{ - return m_x; -} -FX_FLOAT CBC_QRAlignmentPattern::GetY() -{ - return m_y; -} -FX_BOOL CBC_QRAlignmentPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) -{ - if ((FXSYS_fabs(i - GetY()) <= moduleSize) && (FXSYS_fabs(j - GetX()) <= moduleSize)) { - FX_FLOAT moduleSizeDiff = FXSYS_fabs(moduleSize - m_moduleSize); - return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_moduleSize <= 1.0f); - } - return FALSE; -} -CBC_QRAlignmentPattern *CBC_QRAlignmentPattern::Clone() -{ - return FX_NEW CBC_QRAlignmentPattern(m_x, m_y, m_moduleSize); -} diff --git a/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp b/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp deleted file mode 100644 index 59ae4aad04..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRAlignmentPatternFinder.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRAlignmentPattern.h" -#include "include/BC_QRAlignmentPatternFinder.h" -#include "include/BC_CommonBitMatrix.h" -CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, - FX_INT32 startX, - FX_INT32 startY, - FX_INT32 width, - FX_INT32 height, - FX_FLOAT moduleSize): m_image(image), - m_startX(startX), - m_startY(startY), - m_width(width), - m_height(height), - m_moduleSize(moduleSize) - -{ - m_crossCheckStateCount.SetSize(3); -} -CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() -{ - for (FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { - delete (CBC_QRAlignmentPattern*)m_possibleCenters[i]; - } - m_possibleCenters.RemoveAll(); -} -CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::Find(FX_INT32 &e) -{ - FX_INT32 startX = m_startX; - FX_INT32 height = m_height; - FX_INT32 maxJ = startX + m_width; - FX_INT32 middleI = m_startY + (height >> 1); - CFX_Int32Array stateCount; - stateCount.SetSize(3); - for (FX_INT32 iGen = 0; iGen < height; iGen++) { - FX_INT32 i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1)); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - FX_INT32 j = startX; - while (j < maxJ && !m_image->Get(j, i)) { - j++; - } - FX_INT32 currentState = 0; - while (j < maxJ) { - if (m_image->Get(j, i)) { - if (currentState == 1) { - stateCount[currentState]++; - } else { - if (currentState == 2) { - if (FoundPatternCross(stateCount)) { - CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, j); - if (confirmed != NULL) { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } else { - stateCount[++currentState]++; - } - } - } else { - if (currentState == 1) { - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (FoundPatternCross(stateCount)) { - CBC_QRAlignmentPattern *confirmed = HandlePossibleCenter(stateCount, i, maxJ); - if (confirmed != NULL) { - return confirmed; - } - } - } - if (m_possibleCenters.GetSize() != 0) { - return ((CBC_QRAlignmentPattern*) (m_possibleCenters[0]) )->Clone(); - } - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return NULL; -} -FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) -{ - return (FX_FLOAT) (end - stateCount[2]) - stateCount[1] / 2.0f; -} -FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) -{ - FX_FLOAT moduleSize = m_moduleSize; - FX_FLOAT maxVariance = moduleSize / 2.0f; - for (FX_INT32 i = 0; i < 3; i++) { - if (fabs(moduleSize - stateCount[i]) >= maxVariance) { - return false; - } - } - return TRUE; -} -FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) -{ - CBC_CommonBitMatrix *image = m_image; - FX_INT32 maxI = m_image->GetHeight(); - CFX_Int32Array stateCount; - stateCount.Copy(m_crossCheckStateCount); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - FX_INT32 i = startI; - while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - if (i < 0 || stateCount[1] > maxCount) { - return FXSYS_nan(); - } - while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return FXSYS_nan(); - } - i = startI + 1; - while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - if (i == maxI || stateCount[1] > maxCount) { - return FXSYS_nan(); - } - while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) { - return FXSYS_nan(); - } - FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return FXSYS_nan(); - } - return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); -} -CBC_QRAlignmentPattern *CBC_QRAlignmentPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) -{ - FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - FX_FLOAT centerJ = CenterFromEnd(stateCount, j); - FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, 2 * stateCount[1], stateCountTotal); - if (!FXSYS_isnan(centerI)) { - FX_FLOAT estimatedModuleSize = (FX_FLOAT) (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; - FX_INT32 max = m_possibleCenters.GetSize(); - for (FX_INT32 index = 0; index < max; index++) { - CBC_QRAlignmentPattern *center = (CBC_QRAlignmentPattern *)(m_possibleCenters[index]); - if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { - return FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize); - } - } - m_possibleCenters.Add(FX_NEW CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize)); - } - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp b/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp deleted file mode 100644 index 5e5d245b49..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRBitMatrixParser.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_QRCoderFormatInformation.h" -#include "include/BC_QRDataMask.h" -#include "include/BC_QRBitMatrixParser.h" -CBC_QRBitMatrixParser::CBC_QRBitMatrixParser() -{ -} -void CBC_QRBitMatrixParser::Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e) -{ - m_dimension = bitMatrix->GetDimension(e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - m_tempBitMatrix = bitMatrix; - if(m_dimension < 21 || (m_dimension & 0x03) != 1) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - m_bitMatrix = m_tempBitMatrix; - m_parsedFormatInfo = NULL; - m_version = NULL; -} -CBC_QRBitMatrixParser::~CBC_QRBitMatrixParser() -{ - if(m_parsedFormatInfo != NULL) { - delete m_parsedFormatInfo; - m_parsedFormatInfo = NULL; - } - m_version = NULL; -} -CBC_QRCoderFormatInformation* CBC_QRBitMatrixParser::ReadFormatInformation(FX_INT32 &e) -{ - if(m_parsedFormatInfo != NULL) { - return m_parsedFormatInfo; - } - FX_INT32 formatInfoBits = 0; - FX_INT32 j; - for( j = 0; j < 6; j++) { - formatInfoBits = CopyBit(8, j, formatInfoBits); - } - formatInfoBits = CopyBit(8, 7, formatInfoBits); - formatInfoBits = CopyBit(8, 8, formatInfoBits); - formatInfoBits = CopyBit(7, 8, formatInfoBits); - for(FX_INT32 i = 5; i >= 0; i--) { - formatInfoBits = CopyBit(i, 8, formatInfoBits); - } - m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); - if(m_parsedFormatInfo != NULL) { - return m_parsedFormatInfo; - } - FX_INT32 dimension = m_bitMatrix->GetDimension(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - formatInfoBits = 0; - FX_INT32 iMin = dimension - 8; - for(j = dimension - 1; j >= iMin; j--) { - formatInfoBits = CopyBit(j, 8, formatInfoBits); - } - for(FX_INT32 k = dimension - 7; k < dimension; k++) { - formatInfoBits = CopyBit(8, k , formatInfoBits); - } - m_parsedFormatInfo = CBC_QRCoderFormatInformation::DecodeFormatInformation(formatInfoBits); - if(m_parsedFormatInfo != NULL) { - return m_parsedFormatInfo; - } - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return NULL; -} -CBC_QRCoderVersion* CBC_QRBitMatrixParser::ReadVersion(FX_INT32 &e) -{ - if(m_version != NULL) { - return m_version; - } - FX_INT32 dimension = m_bitMatrix->GetDimension(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 provisionVersion = (dimension - 17) >> 2; - if(provisionVersion <= 6) { - CBC_QRCoderVersion* qrv = CBC_QRCoderVersion::GetVersionForNumber(provisionVersion, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qrv; - } - FX_INT32 versionBits = 0; - for (FX_INT32 i = 5; i >= 0; i--) { - FX_INT32 jMin = dimension - 11; - for (FX_INT32 j = dimension - 9; j >= jMin; j--) { - versionBits = CopyBit(i, j, versionBits); - } - } - m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { - return m_version; - } - versionBits = 0; - for (FX_INT32 j = 5; j >= 0; j--) { - FX_INT32 iMin = dimension - 11; - for (FX_INT32 i = dimension - 9; i >= iMin; i--) { - versionBits = CopyBit(i, j, versionBits); - } - } - m_version = CBC_QRCoderVersion::DecodeVersionInformation(versionBits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (m_version != NULL && m_version->GetDimensionForVersion() == dimension) { - return m_version; - } - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return NULL; -} -FX_INT32 CBC_QRBitMatrixParser::CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits) -{ - return m_bitMatrix->Get(j, i) ? (versionBits << 1) | 0x1 : versionBits << 1; -} -CFX_ByteArray* CBC_QRBitMatrixParser::ReadCodewords(FX_INT32 &e) -{ - CBC_QRCoderFormatInformation *formatInfo = ReadFormatInformation(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL) - CBC_QRCoderVersion *version = ReadVersion(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_QRDataMask *dataMask = CBC_QRDataMask::ForReference((FX_INT32)(formatInfo->GetDataMask()), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 dimension = m_bitMatrix->GetDimension(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - dataMask->UnmaskBitMatirx(m_bitMatrix, dimension); - CBC_CommonBitMatrix* cbm = version->BuildFunctionPattern(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr functionPattern(cbm); - FX_BOOL readingUp = TRUE; - CFX_ByteArray * temp = FX_NEW CFX_ByteArray; - temp->SetSize(version->GetTotalCodeWords()); - CBC_AutoPtr result(temp); - FX_INT32 resultOffset = 0; - FX_INT32 currentByte = 0; - FX_INT32 bitsRead = 0; - for(FX_INT32 j = dimension - 1; j > 0; j -= 2) { - if(j == 6) { - j--; - } - for(FX_INT32 count = 0; count < dimension; count++) { - FX_INT32 i = readingUp ? dimension - 1 - count : count; - for(FX_INT32 col = 0; col < 2; col++) { - if(!functionPattern->Get(j - col, i)) { - bitsRead++; - currentByte <<= 1; - if(m_bitMatrix->Get(j - col, i)) { - currentByte |= 1; - } - if(bitsRead == 8) { - (*result)[resultOffset++] = (FX_BYTE) currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp ^= TRUE; - } - if(resultOffset != version->GetTotalCodeWords()) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return result.release(); -} diff --git a/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp b/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp deleted file mode 100644 index 898dc2ddb2..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCodeReader.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Reader.h" -#include "include/BC_QRCodeReader.h" -#include "include/BC_LuminanceSource.h" -#include "include/BC_BufferedImageLuminanceSource.h" -#include "include/BC_Binarizer.h" -#include "include/BC_GlobalHistogramBinarizer.h" -#include "include/BC_BinaryBitmap.h" -#include "include/BC_QRCodeReader.h" -#include "include/BC_QRCoderMode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRCoderDecoder.h" -#include "include/BC_QRDetector.h" -#include "include/BC_QRDetectorResult.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRDataMask.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_QRCodeReader.h" -CBC_QRCodeReader::CBC_QRCodeReader(): m_decoder(NULL) -{ -} -void CBC_QRCodeReader::Init() -{ - m_decoder = FX_NEW CBC_QRCoderDecoder; - m_decoder->Init(); -} -CBC_QRCodeReader::~CBC_QRCodeReader() -{ - if(m_decoder != NULL) { - delete m_decoder; - } - m_decoder = NULL; -} -CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) -{ - CBC_CommonBitMatrix *matrix = image->GetMatrix(e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_QRDetector detector(matrix); - CBC_QRDetectorResult* qdr = detector.Detect(hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr detectorResult(qdr); - CBC_CommonDecoderResult* qdr2 = m_decoder->Decode(detectorResult->GetBits(), 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_AutoPtr decodeResult(qdr2); - return (decodeResult->GetText()); -} -CFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(filename); - source.Init(e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString bs = Decode(&bitmap, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bs; -} -CFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e) -{ - CBC_BufferedImageLuminanceSource source(pBitmap); - CBC_GlobalHistogramBinarizer binarizer(&source); - CBC_BinaryBitmap bitmap(&binarizer); - CFX_ByteString bs = Decode(&bitmap, hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bs; -} -CFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap *image, FX_INT32 &e) -{ - CFX_ByteString bs = Decode(image, 0, e); - BC_EXCEPTION_CHECK_ReturnValue(e, ""); - return bs; -} -void CBC_QRCodeReader::ReleaseAll() -{ - if(CBC_ReedSolomonGF256 ::QRCodeFild) { - delete CBC_ReedSolomonGF256 ::QRCodeFild; - CBC_ReedSolomonGF256 ::QRCodeFild = NULL; - } - if(CBC_ReedSolomonGF256 ::DataMatrixField) { - delete CBC_ReedSolomonGF256 ::DataMatrixField; - CBC_ReedSolomonGF256 ::DataMatrixField = NULL; - } - CBC_QRCoderMode::Destroy(); - CBC_QRCoderErrorCorrectionLevel::Destroy(); - CBC_QRDataMask::Destroy(); - CBC_QRCoderVersion::Destroy(); -} diff --git a/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp b/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp deleted file mode 100644 index ade03dd494..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCodeWriter.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_TwoDimWriter.h" -#include "include/BC_Reader.h" -#include "include/BC_QRCodeWriter.h" -#include "include/BC_QRCoderEncoder.h" -#include "include/BC_QRCoder.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_QRCodeReader.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -CBC_QRCodeWriter::CBC_QRCodeWriter() -{ - m_bFixedSize = TRUE; - m_iCorrectLevel = 1; - m_iVersion = 0; -} -CBC_QRCodeWriter::~CBC_QRCodeWriter() -{ -} -void CBC_QRCodeWriter::ReleaseAll() -{ - CBC_QRCodeReader::ReleaseAll(); -} -FX_BOOL CBC_QRCodeWriter::SetVersion(FX_INT32 version) -{ - if (version < 0 || version > 40) { - return FALSE; - } - m_iVersion = version; - return TRUE; -} -FX_BOOL CBC_QRCodeWriter::SetErrorCorrectionLevel(FX_INT32 level) -{ - if (level < 0 || level > 3) { - return FALSE; - } - m_iCorrectLevel = level; - return TRUE; -} -FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - CBC_QRCoderErrorCorrectionLevel *ec = NULL; - switch(ecLevel) { - case 0: - ec = CBC_QRCoderErrorCorrectionLevel::L; - break; - case 1: - ec = CBC_QRCoderErrorCorrectionLevel::M; - break; - case 2: - ec = CBC_QRCoderErrorCorrectionLevel::Q; - break; - case 3: - ec = CBC_QRCoderErrorCorrectionLevel::H; - break; - default: { - e = BCExceptionUnSupportEclevel; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - } - CBC_QRCoder qr; - if (m_iVersion > 0 && m_iVersion < 41) { - CFX_ByteString byteStr = contents.UTF8Encode(); - CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion); - } else { - CBC_QRCoderEncoder::Encode(contents, ec, &qr, e); - } - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - outWidth = qr.GetMatrixWidth(); - outHeight = qr.GetMatrixWidth(); - FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outWidth); - FXSYS_memcpy32(result, qr.GetMatrix()->GetArray(), outWidth * outHeight); - return result; -} -FX_BYTE *CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) -{ - return NULL; -} -FX_BYTE* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) -{ - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoder.cpp deleted file mode 100644 index 564a280421..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoder.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoderMode.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_QRCoder.h" -CBC_QRCoder::CBC_QRCoder() -{ - m_mode = NULL; - m_ecLevel = NULL; - m_version = -1; - m_matrixWidth = -1; - m_maskPattern = -1; - m_numTotalBytes = -1; - m_numDataBytes = -1; - m_numECBytes = -1; - m_numRSBlocks = -1; - m_matrix = NULL; -} -CBC_QRCoder::~CBC_QRCoder() -{ - if(m_matrix != NULL) { - delete m_matrix; - m_matrix = NULL; - } - m_mode = NULL; - m_ecLevel = NULL; - m_version = -1; - m_matrixWidth = -1; - m_maskPattern = -1; - m_numTotalBytes = -1; - m_numDataBytes = -1; - m_numECBytes = -1; - m_numRSBlocks = -1; -} -CBC_QRCoderMode* CBC_QRCoder::GetMode() -{ - return m_mode; -} -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoder::GetECLevel() -{ - return m_ecLevel; -} -FX_INT32 CBC_QRCoder::GetVersion() -{ - return m_version; -} -FX_INT32 CBC_QRCoder::GetMatrixWidth() -{ - return m_matrixWidth; -} -FX_INT32 CBC_QRCoder::GetMaskPattern() -{ - return m_maskPattern; -} -FX_INT32 CBC_QRCoder::GetNumTotalBytes() -{ - return m_numTotalBytes; -} -FX_INT32 CBC_QRCoder::GetNumDataBytes() -{ - return m_numDataBytes; -} -FX_INT32 CBC_QRCoder::GetNumECBytes() -{ - return m_numECBytes; -} -FX_INT32 CBC_QRCoder::GetNumRSBlocks() -{ - return m_numRSBlocks; -} -CBC_CommonByteMatrix* CBC_QRCoder::GetMatrix() -{ - return m_matrix; -} -FX_INT32 CBC_QRCoder::At(FX_INT32 x, FX_INT32 y, FX_INT32 &e) -{ - FX_INT32 value = m_matrix->Get(x, y); - if(!(value == 0 || value == 1)) { - e = BCExceptionValueMustBeEither0or1; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - return value; -} -FX_BOOL CBC_QRCoder::IsValid() -{ - return - m_mode != NULL && - m_ecLevel != NULL && - m_version != -1 && - m_matrixWidth != -1 && - m_maskPattern != -1 && - m_numTotalBytes != -1 && - m_numDataBytes != -1 && - m_numECBytes != -1 && - m_numRSBlocks != -1 && - IsValidMaskPattern(m_maskPattern) && - m_numTotalBytes == m_numDataBytes + m_numECBytes && - m_matrix != NULL && - m_matrixWidth == m_matrix->GetWidth() && - m_matrix->GetWidth() == m_matrix->GetHeight(); -} -void CBC_QRCoder::SetMode(CBC_QRCoderMode* value) -{ - m_mode = value; -} -void CBC_QRCoder::SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel) -{ - m_ecLevel = ecLevel; -} -void CBC_QRCoder::SetVersion(FX_INT32 version) -{ - m_version = version; -} -void CBC_QRCoder::SetMatrixWidth(FX_INT32 width) -{ - m_matrixWidth = width; -} -void CBC_QRCoder::SetMaskPattern(FX_INT32 pattern) -{ - m_maskPattern = pattern; -} -void CBC_QRCoder::SetNumDataBytes(FX_INT32 bytes) -{ - m_numDataBytes = bytes; -} -void CBC_QRCoder::SetNumTotalBytes(FX_INT32 value) -{ - m_numTotalBytes = value; -} -void CBC_QRCoder::SetNumRSBlocks(FX_INT32 block) -{ - m_numRSBlocks = block; -} -void CBC_QRCoder::SetNumECBytes(FX_INT32 value) -{ - m_numECBytes = value; -} -FX_BOOL CBC_QRCoder::IsValidMaskPattern(FX_INT32 maskPattern) -{ - return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS; -} -void CBC_QRCoder::SetMatrix(CBC_CommonByteMatrix* value) -{ - m_matrix = value; -} -const FX_INT32 CBC_QRCoder::NUM_MASK_PATTERNS = 8; diff --git a/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp b/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp deleted file mode 100644 index 728252e9e2..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderBitVector.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderBitVector.h" -CBC_QRCoderBitVector::CBC_QRCoderBitVector() -{ - m_sizeInBits = 0; - m_size = 32; -} -void CBC_QRCoderBitVector::Init() -{ - m_array = FX_Alloc(FX_BYTE, m_size); -} -CBC_QRCoderBitVector::~CBC_QRCoderBitVector() -{ - if(m_array != NULL) { - FX_Free(m_array); - } - m_size = 0; - m_sizeInBits = 0; -} -void CBC_QRCoderBitVector::Clear() -{ - if(m_array != NULL) { - FX_Free(m_array); - m_array = NULL; - } - m_sizeInBits = 0; - m_size = 32; - m_array = FX_Alloc(FX_BYTE, m_size); -} -FX_INT32 CBC_QRCoderBitVector::At(FX_INT32 index, FX_INT32 &e) -{ - if(index < 0 || index >= m_sizeInBits) { - e = BCExceptionBadIndexException; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - FX_INT32 value = m_array[index >> 3] & 0xff; - return (value >> (7 - (index & 0x7))) & 1; -} -FX_INT32 CBC_QRCoderBitVector::sizeInBytes() -{ - return (m_sizeInBits + 7) >> 3; -} -FX_INT32 CBC_QRCoderBitVector::Size() -{ - return m_sizeInBits; -} -void CBC_QRCoderBitVector::AppendBit(FX_INT32 bit, FX_INT32 &e) -{ - if(!(bit == 0 || bit == 1)) { - e = BCExceptionBadValueException; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 numBitsInLastByte = m_sizeInBits & 0x7; - if(numBitsInLastByte == 0) { - AppendByte(0); - m_sizeInBits -= 8; - } - m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte)); - ++m_sizeInBits; -} -void CBC_QRCoderBitVector::AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e) -{ - if (numBits < 0 || numBits > 32) { - e = BCExceptionBadNumBitsException; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 numBitsLeft = numBits; - while (numBitsLeft > 0) { - if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) { - FX_INT32 newByte = (value >> (numBitsLeft - 8)) & 0xff; - AppendByte(newByte); - numBitsLeft -= 8; - } else { - FX_INT32 bit = (value >> (numBitsLeft - 1)) & 1; - AppendBit(bit, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - --numBitsLeft; - } - } -} -void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e) -{ - FX_INT32 size = bits->Size(); - for(FX_INT32 i = 0; i < size; i++) { - FX_INT32 num = bits->At(i, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendBit(num, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - } -} -void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector *other, FX_INT32 &e) -{ - if(m_sizeInBits != other->Size()) { - e = BCExceptioncanNotOperatexorOperator; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 sizeInBytes = (m_sizeInBits + 7) >> 3; - for(FX_INT32 i = 0; i < sizeInBytes; ++i) { - m_array[i] ^= (other->GetArray())[i]; - } -} -FX_BYTE* CBC_QRCoderBitVector::GetArray() -{ - return m_array; -} -void CBC_QRCoderBitVector::AppendByte(FX_INT32 value) -{ - if((m_sizeInBits >> 3) == m_size) { - FX_BYTE* newArray = FX_Alloc(FX_BYTE, m_size << 1); - FXSYS_memcpy32(newArray, m_array, m_size); - if(m_array != NULL) { - FX_Free(m_array); - } - m_array = newArray; - m_size = m_size << 1; - } - m_array[m_sizeInBits >> 3] = (FX_BYTE) value; - m_sizeInBits += 8; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp b/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp deleted file mode 100644 index 4b0b7c92b1..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderBlockPair.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonByteArray.h" -#include "include/BC_QRCoderBlockPair.h" -CBC_QRCoderBlockPair::CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection) -{ - m_dataBytes = data; - m_errorCorrectionBytes = errorCorrection; -} -CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() -{ - if(m_dataBytes != NULL) { - delete m_dataBytes; - m_dataBytes = NULL; - } - if(m_errorCorrectionBytes != NULL) { - delete m_errorCorrectionBytes; - m_errorCorrectionBytes = NULL; - } -} -CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() -{ - return m_dataBytes; -} -CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() -{ - return m_errorCorrectionBytes; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp deleted file mode 100644 index 3033074eb8..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderDecoder.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ReedSolomonDecoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_QRBitMatrixParser.h" -#include "include/BC_QRDataBlock.h" -#include "include/BC_QRDecodedBitStreamParser.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_QRCoderFormatInformation.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_QRCoderDecoder.h" -CBC_QRCoderDecoder::CBC_QRCoderDecoder() -{ - m_rsDecoder = NULL; -} - -void CBC_QRCoderDecoder::Init() -{ - m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::QRCodeFild); -} -CBC_QRCoderDecoder::~CBC_QRCoderDecoder() -{ - if(m_rsDecoder != NULL) { - delete m_rsDecoder; - } - m_rsDecoder = NULL; -} -CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e) -{ - CBC_CommonBitMatrix bits; - bits.Init(width); - for(FX_INT32 i = 0; i < width; i++) { - for(FX_INT32 j = 0; j < height; j++) { - if(image[i * width + j]) { - bits.Set(j, i); - } - } - } - CBC_CommonDecoderResult* cdr = Decode(&bits, height, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return cdr; -} -CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e) -{ - CBC_QRBitMatrixParser parser; - parser.Init(bits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_QRCoderVersion *version = parser.ReadVersion(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel(); - CFX_ByteArray* ba = parser.ReadCodewords(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr codewords(ba); - CFX_PtrArray *dataBlocks = CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 totalBytes = 0; - for (FX_INT32 i = 0; i < dataBlocks->GetSize(); i++) { - totalBytes += ((CBC_QRDataBlock*) ((*dataBlocks)[i]))->GetNumDataCodewords(); - } - CFX_ByteArray resultBytes; - FX_INT32 resultOffset = 0; - for (FX_INT32 j = 0; j < dataBlocks->GetSize(); j++) { - CBC_QRDataBlock *dataBlock = (CBC_QRDataBlock *)((*dataBlocks)[j]); - CFX_ByteArray* codewordBytes = dataBlock->GetCodewords(); - FX_INT32 numDataCodewords = dataBlock->GetNumDataCodewords(); - CorrectErrors(codewordBytes, numDataCodewords, e); - if (e != BCExceptionNO) { - for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { - delete (CBC_QRDataBlock*)(*dataBlocks)[k]; - } - dataBlocks->RemoveAll(); - delete dataBlocks; - dataBlocks = NULL; - return NULL; - } - for(FX_INT32 i = 0; i < numDataCodewords; i++) { - resultBytes.Add((*codewordBytes)[i]); - } - } - for(FX_INT32 k = 0; k < dataBlocks->GetSize(); k++) { - delete (CBC_QRDataBlock*)(*dataBlocks)[k] ; - } - dataBlocks->RemoveAll(); - delete dataBlocks; - dataBlocks = NULL; - CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode(&resultBytes, version, ecLevel, byteModeDecode, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return cdr; -} -void CBC_QRCoderDecoder::CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e) -{ - FX_INT32 numCodewords = codewordBytes->GetSize(); - CFX_Int32Array codewordsInts; - codewordsInts.SetSize(numCodewords); - for(FX_INT32 i = 0; i < numCodewords; i++) { - codewordsInts[i] = (FX_INT32)((*codewordBytes)[i] & 0xff); - } - FX_INT32 numECCodewords = codewordBytes->GetSize() - numDataCodewords; - m_rsDecoder->Decode(&codewordsInts, numECCodewords, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - for(FX_INT32 k = 0; k < numDataCodewords; k++) { - (*codewordBytes)[k] = (FX_BYTE) codewordsInts[k]; - } -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp b/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp deleted file mode 100644 index a6eb48ed99..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderECB.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderECB.h" -CBC_QRCoderECB::CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords) -{ - m_dataCodeWords = dataCodeWords; - m_count = count; -} -CBC_QRCoderECB::~CBC_QRCoderECB() -{ -} -FX_INT32 CBC_QRCoderECB::GetCount() -{ - return m_count; -} -FX_INT32 CBC_QRCoderECB::GetDataCodeWords() -{ - return m_dataCodeWords; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp b/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp deleted file mode 100644 index 8c98530371..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderECBlocks.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderECB.h" -#include "include/BC_QRCoderECBlocks.h" -CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks) -{ - m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; - m_ecBlocks.Add(ecBlocks); -} -CBC_QRCoderECBlocks::CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, - CBC_QRCoderECB* ecBlocks1, - CBC_QRCoderECB* ecBlocks2) -{ - m_ecCodeWordsPerBlock = ecCodeWordsPerBlock; - m_ecBlocks.Add(ecBlocks1); - m_ecBlocks.Add(ecBlocks2); -} -CBC_QRCoderECBlocks::~CBC_QRCoderECBlocks() -{ - for (FX_INT32 i = 0 ; i < m_ecBlocks.GetSize(); i++) { - delete ( (CBC_QRCoderECB*)(m_ecBlocks[i]) ) ; - } - m_ecBlocks.RemoveAll(); -} -FX_INT32 CBC_QRCoderECBlocks::GetECCodeWordsPerBlock() -{ - return m_ecCodeWordsPerBlock; -} -FX_INT32 CBC_QRCoderECBlocks::GetNumBlocks() -{ - FX_INT32 total = 0; - for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { - total += ( (CBC_QRCoderECB*)(m_ecBlocks[i]) )->GetCount(); - } - return total; -} -FX_INT32 CBC_QRCoderECBlocks::GetTotalECCodeWords() -{ - return m_ecCodeWordsPerBlock * GetNumBlocks(); -} -CFX_PtrArray* CBC_QRCoderECBlocks::GetECBlocks() -{ - return &m_ecBlocks; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp b/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp deleted file mode 100644 index 2529f4f59d..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderEncoder.cpp +++ /dev/null @@ -1,876 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoder.h" -#include "include/BC_QRCoderEncoder.h" -#include "include/BC_CommonByteArray.h" -#include "include/BC_QRCoderMode.h" -#include "include/BC_QRCoderEncoder.h" -#include "include/BC_QRCoderECBlocks.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_QRCoderBlockPair.h" -#include "include/BC_QRCoderMaskUtil.h" -#include "include/BC_QRCoderMatrixUtil.h" -#include "include/BC_ReedSolomon.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_UtilCodingConvert.h" -#include "include/BC_QRCoderBitVector.h" -const FX_INT32 CBC_QRCoderEncoder::m_alphaNumbericTable[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, - -1, 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, -1, -1, -1, -1, -1 -}; -CBC_QRCoderEncoder::CBC_QRCoderEncoder() -{ -} -CBC_QRCoderEncoder::~CBC_QRCoderEncoder() -{ -} -class Make_Pair : public CFX_Object -{ -public: - CBC_QRCoderMode* m_mode; - CFX_ByteString m_string; -private: - Make_Pair(const Make_Pair &mode_string) {} - Make_Pair &operator = (Make_Pair &mode_string) - { - if (this == &mode_string) { - return *this; - } - m_mode = mode_string.m_mode; - m_string = mode_string.m_string; - return *this; - } -public: - Make_Pair(CBC_QRCoderMode *mode, const CFX_ByteString &str): m_mode(mode), m_string(str) {} - ~Make_Pair() {} -}; -void CBC_QRCoderEncoder::Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, - CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify) -{ - if(versionSpecify == 0) { - EncodeWithAutoVersion(content, ecLevel, qrCode, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - } else if(versionSpecify > 0 && versionSpecify <= 40) { - EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else { - e = BCExceptionVersionMust1_40; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) -{ -} -void CBC_QRCoderEncoder::AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, - CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e) -{ - for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { - tempMode = ((Make_Pair*)splitResult[i])->m_mode; - if(tempMode == CBC_QRCoderMode::sGBK) { - AppendModeInfo(tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(tempMode == CBC_QRCoderMode::sBYTE) { - CFX_ByteArray bytes; - CBC_UtilCodingConvert::LocaleToUtf8(((Make_Pair*)splitResult[i])->m_string, bytes); - AppendModeInfo(tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - Append8BitBytes(bytes, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(tempMode == CBC_QRCoderMode::sALPHANUMERIC) { - AppendModeInfo(tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(tempMode == CBC_QRCoderMode::sNUMERIC) { - AppendModeInfo(tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendLengthInfo(((Make_Pair*)splitResult[i])->m_string.GetLength(), qrCode->GetVersion(), tempMode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - AppendBytes(((Make_Pair*)splitResult[i])->m_string, tempMode, &headerAndDataBits, encoding, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else { - e = BCExceptionUnknown; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } -} -void CBC_QRCoderEncoder::SplitString(const CFX_ByteString &content, CFX_PtrArray &result) -{ - FX_INT32 index = 0, flag = 0; - while((((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || - ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) && (index < content.GetLength())) { - index += 2; - } - if(index != flag) { - result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag))); - } - flag = index; - if(index >= content.GetLength()) { - return; - } - while(GetAlphaNumericCode((FX_BYTE)content[index]) == -1 - && !(((FX_BYTE)content[index] >= 0xA1 && (FX_BYTE)content[index] <= 0xAA) || - ((FX_BYTE)content[index] >= 0xB0 && (FX_BYTE)content[index] <= 0xFA)) - && (index < content.GetLength())) { -#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ - if(IsDBCSLeadByte((FX_BYTE)content[index])) -#else - if((FX_BYTE)content[index] > 127) -#endif - { - index += 2; - } else { - index++; - } - } - if(index != flag) { - result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag))); - } - flag = index; - if(index >= content.GetLength()) { - return; - } - while(FXSYS_Isdigit((FX_BYTE)content[index]) && (index < content.GetLength())) { - index++; - } - if(index != flag) { - result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sNUMERIC, content.Mid(flag, index - flag))); - } - flag = index; - if(index >= content.GetLength()) { - return; - } - while(GetAlphaNumericCode((FX_BYTE)content[index]) != -1 && (index < content.GetLength())) { - index++; - } - if(index != flag) { - result.Add(FX_NEW Make_Pair(CBC_QRCoderMode::sALPHANUMERIC, content.Mid(flag, index - flag))); - } - flag = index; - if(index >= content.GetLength()) { - return; - } - SplitString(content.Mid(index, content.GetLength() - index), result); -} -FX_INT32 CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e) -{ - if(versionNum == 0) { - return 0; - } - if((modeFirst == CBC_QRCoderMode::sALPHANUMERIC) - && (modeSecond == CBC_QRCoderMode::sBYTE)) { - if(versionNum >= 1 && versionNum <= 9) { - return 11; - } else if(versionNum >= 10 && versionNum <= 26) { - return 15; - } else if(versionNum >= 27 && versionNum <= 40) { - return 16; - } else { - e = BCExceptionNoSuchVersion; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - } else if((modeSecond == CBC_QRCoderMode::sALPHANUMERIC) - && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { - if(versionNum >= 1 && versionNum <= 9) { - return 13; - } else if(versionNum >= 10 && versionNum <= 26) { - return 15; - } else if(versionNum >= 27 && versionNum <= 40) { - return 17; - } else { - e = BCExceptionNoSuchVersion; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - } else if((modeSecond == CBC_QRCoderMode::sBYTE) - && (modeFirst == CBC_QRCoderMode::sNUMERIC)) { - if(versionNum >= 1 && versionNum <= 9) { - return 6; - } else if(versionNum >= 10 && versionNum <= 26) { - return 8; - } else if(versionNum >= 27 && versionNum <= 40) { - return 9; - } else { - e = BCExceptionNoSuchVersion; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - } - return -1; -} -void CBC_QRCoderEncoder::MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e) -{ - Make_Pair *first = NULL; - Make_Pair *second = NULL; - size_t mergeNum = 0; - FX_INT32 i; - for(i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) { - first = (Make_Pair*)result[i]; - second = (Make_Pair*)result[i + 1]; - if(first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) { - FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if((second->m_mode == CBC_QRCoderMode::sBYTE) - && (first->m_string.GetLength() < tmp)) { - CFX_ByteString str = first->m_string + second->m_string; - second->m_string = str; - delete first; - result.RemoveAt(i); - i--; - mergeNum++; - } - } else if(first->m_mode == CBC_QRCoderMode::sBYTE) { - if(second->m_mode == CBC_QRCoderMode::sBYTE) { - first->m_string += second->m_string; - delete second; - result.RemoveAt(i + 1); - i--; - mergeNum++; - } - } else if(first->m_mode == CBC_QRCoderMode::sNUMERIC) { - FX_INT32 tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sBYTE, versionNum, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if((second->m_mode == CBC_QRCoderMode::sBYTE) - && (first->m_string.GetLength() < tmp)) { - CFX_ByteString str = first->m_string + second->m_string; - second->m_string = str; - delete first; - result.RemoveAt(i); - i--; - mergeNum++; - } - tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, CBC_QRCoderMode::sALPHANUMERIC, versionNum, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) - && (first->m_string.GetLength() < tmp)) { - CFX_ByteString str = first->m_string + second->m_string; - second->m_string = str; - delete first; - result.RemoveAt(i); - i--; - mergeNum++; - } - } - } - if(mergeNum == 0) { - return; - } - MergeString(result, versionNum, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, - CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) -{ - qrCode->SetECLevel(ecLevel); - qrCode->SetMode(mode); - CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNumber, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 numBytes = version->GetTotalCodeWords(); - CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); - FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); - FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); - FX_INT32 numDataBytes = numBytes - numEcBytes; - if(numDataBytes >= numInputBytes + 3) { - qrCode->SetVersion(versionNumber); - qrCode->SetNumTotalBytes(numBytes); - qrCode->SetNumDataBytes(numDataBytes); - qrCode->SetNumRSBlocks(numRSBlocks); - qrCode->SetNumECBytes(numEcBytes); - qrCode->SetMatrixWidth(version->GetDimensionForVersion()); - return; - } - e = BCExceptionCannotFindBlockInfo; - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, - CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e) -{ - CFX_ByteString encoding = "utf8"; - CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; - CFX_PtrArray splitResult; - CBC_QRCoderBitVector dataBits; - dataBits.Init(); - SplitString(content, splitResult); - MergeString(splitResult, versionSpecify, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - CBC_QRCoderMode *tempMode = NULL; - for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { - AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); - if(e != BCExceptionNO) { - for(FX_INT32 y = 0; y < splitResult.GetSize(); y++) { - delete (Make_Pair*)splitResult[y]; - } - splitResult.RemoveAll(); - return; - } - } - FX_INT32 numInputBytes = dataBits.sizeInBytes(); - CBC_QRCoderBitVector headerAndDataBits; - headerAndDataBits.Init(); - InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e); - if(e != BCExceptionNO) { - for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { - delete (Make_Pair*)splitResult[k]; - } - splitResult.RemoveAll(); - return ; - } - AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); - if(e != BCExceptionNO) { - for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { - delete (Make_Pair*)splitResult[k]; - } - splitResult.RemoveAll(); - return ; - } - numInputBytes = headerAndDataBits.sizeInBytes(); - TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); - if(e != BCExceptionNO) { - for(FX_INT32 k = 0; k < splitResult.GetSize(); k++) { - delete (Make_Pair*)splitResult[k]; - } - splitResult.RemoveAll(); - return ; - } - for(FX_INT32 j = 0; j < splitResult.GetSize(); j++) { - delete (Make_Pair*)splitResult[j]; - } - splitResult.RemoveAll(); - CBC_QRCoderBitVector finalBits ; - finalBits.Init(); - InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), - qrCode->GetNumRSBlocks(), &finalBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); - pDecoder->Init(); - CBC_AutoPtr matrix(pDecoder); - FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - qrCode->SetMaskPattern(maskPattern); - CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - qrCode->SetMatrix(matrix.release()); - if(!qrCode->IsValid()) { - e = BCExceptionInvalidQRCode; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) -{ - CFX_ByteString encoding = "utf8"; - CBC_QRCoderMode *mode = CBC_QRCoderMode::sBYTE; - CFX_PtrArray splitResult; - CBC_QRCoderBitVector dataBits; - dataBits.Init(); - SplitString(content, splitResult); - MergeString(splitResult, 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_QRCoderMode *tempMode = NULL; - for(FX_INT32 i = 0; i < splitResult.GetSize(); i++) { - AppendBytes(((Make_Pair*)splitResult[i])->m_string, ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e); - if(e != BCExceptionNO) { - for(FX_INT32 l = 0; l < splitResult.GetSize(); l++) { - delete (Make_Pair*)splitResult[l]; - } - splitResult.RemoveAll(); - return; - } - } - FX_INT32 numInputBytes = dataBits.sizeInBytes(); - InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - CBC_QRCoderBitVector headerAndDataBits; - headerAndDataBits.Init(); - tempMode = NULL; - FX_INT32 versionNum = qrCode->GetVersion(); -sign: - AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, encoding, e); - if (e != BCExceptionNO) { - goto catchException; - } - numInputBytes = headerAndDataBits.sizeInBytes(); - TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); - if (e != BCExceptionNO) { - goto catchException; - } -catchException: - if (e != BCExceptionNO) { - FX_INT32 e1 = BCExceptionNO; - InitQRCode(numInputBytes, ecLevel, mode, qrCode, e1); - if (e1 != BCExceptionNO) { - e = e1; - return; - } - versionNum++; - if (versionNum <= 40) { - headerAndDataBits.Clear(); - e = BCExceptionNO; - goto sign; - } else { - for (FX_INT32 j = 0; j < splitResult.GetSize(); j++) { - delete (Make_Pair*)splitResult[j]; - } - splitResult.RemoveAll(); - return; - } - } - for (FX_INT32 k = 0; k < splitResult.GetSize(); k++) { - delete (Make_Pair*)splitResult[k]; - } - splitResult.RemoveAll(); - CBC_QRCoderBitVector finalBits ; - finalBits.Init(); - InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), - qrCode->GetNumRSBlocks(), &finalBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); - pDecoder->Init(); - CBC_AutoPtr matrix(pDecoder); - FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - qrCode->SetMaskPattern(maskPattern); - CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - qrCode->SetMatrix(matrix.release()); - if(!qrCode->IsValid()) { - e = BCExceptionInvalidQRCode; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e) -{ - CFX_ByteString encoding = "utf8"; - CFX_ByteString utf8Data; - CBC_UtilCodingConvert::UnicodeToUTF8(content, utf8Data); - CBC_QRCoderMode* mode = ChooseMode(utf8Data, encoding); - CBC_QRCoderBitVector dataBits; - dataBits.Init(); - AppendBytes(utf8Data, mode, &dataBits, encoding, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 numInputBytes = dataBits.sizeInBytes(); - InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_QRCoderBitVector headerAndDataBits; - headerAndDataBits.Init(); - AppendModeInfo(mode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 numLetters = mode == CBC_QRCoderMode::sBYTE ? dataBits.sizeInBytes() : content.GetLength(); - AppendLengthInfo(numLetters, qrCode->GetVersion(), mode, &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - headerAndDataBits.AppendBitVector(&dataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_QRCoderBitVector finalBits ; - finalBits.Init(); - InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), qrCode->GetNumDataBytes(), - qrCode->GetNumRSBlocks(), &finalBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_CommonByteMatrix* pDecoder = FX_NEW CBC_CommonByteMatrix(qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()); - pDecoder->Init(); - CBC_AutoPtr matrix(pDecoder); - FX_INT32 maskPattern = ChooseMaskPattern(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - qrCode->SetMaskPattern(maskPattern); - CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), qrCode->GetMaskPattern(), matrix.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - qrCode->SetMatrix(matrix.release()); - if(!qrCode->IsValid()) { - e = BCExceptionInvalidQRCode; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - FX_INT32 capacity = numDataBytes << 3; - if(bits->Size() > capacity) { - e = BCExceptionDataTooMany; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for (FX_INT32 i = 0; i < 4 && bits->Size() < capacity; ++i) { - bits->AppendBit(0, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 numBitsInLastByte = bits->Size() % 8; - if (numBitsInLastByte > 0) { - FX_INT32 numPaddingBits = 8 - numBitsInLastByte; - for (FX_INT32 j = 0; j < numPaddingBits; ++j) { - bits->AppendBit(0, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - } - } - if (bits->Size() % 8 != 0) { - e = BCExceptionDigitLengthMustBe8; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 numPaddingBytes = numDataBytes - bits->sizeInBytes(); - for (FX_INT32 k = 0; k < numPaddingBytes; ++k) { - if (k % 2 == 0) { - bits->AppendBits(0xec, 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else { - bits->AppendBits(0x11, 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } - if (bits->Size() != capacity) { - e = BCExceptionBitsNotEqualCacity; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -FX_INT32 CBC_QRCoderEncoder::ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - FX_INT32 minPenalty = 65535; - FX_INT32 bestMaskPattern = -1; - for(FX_INT32 maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS; maskPattern++) { - CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, matrix, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - FX_INT32 penalty = CalculateMaskPenalty(matrix); - if(penalty < minPenalty) { - minPenalty = penalty; - bestMaskPattern = maskPattern; - } - } - return bestMaskPattern; -} -FX_INT32 CBC_QRCoderEncoder::CalculateMaskPenalty(CBC_CommonByteMatrix* matrix) -{ - FX_INT32 penalty = 0; - penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(matrix); - penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(matrix); - penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(matrix); - penalty += CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(matrix); - return penalty; -} -CBC_QRCoderMode *CBC_QRCoderEncoder::ChooseMode(const CFX_ByteString &content, CFX_ByteString encoding) -{ - if(encoding.Compare("SHIFT_JIS") == 0) { - return CBC_QRCoderMode::sKANJI; - } - FX_BOOL hasNumeric = FALSE; - FX_BOOL hasAlphaNumeric = FALSE; - for(FX_INT32 i = 0; i < content.GetLength(); i++) { - if(isdigit((FX_BYTE)content[i])) { - hasNumeric = TRUE; - } else if(GetAlphaNumericCode((FX_BYTE)content[i]) != -1) { - hasAlphaNumeric = TRUE; - } else { - return CBC_QRCoderMode::sBYTE; - } - } - if(hasAlphaNumeric) { - return CBC_QRCoderMode::sALPHANUMERIC; - } else if(hasNumeric) { - return CBC_QRCoderMode::sNUMERIC; - } - return CBC_QRCoderMode::sBYTE; -} -FX_INT32 CBC_QRCoderEncoder::GetAlphaNumericCode(FX_INT32 code) -{ - if(code < 96 && code >= 0) { - return m_alphaNumbericTable[code]; - } - return -1; -} -void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) -{ - if(mode == CBC_QRCoderMode::sNUMERIC) { - AppendNumericBytes(content, bits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { - AppendAlphaNumericBytes(content, bits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(mode == CBC_QRCoderMode::sBYTE) { - Append8BitBytes(content, bits, encoding, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(mode == CBC_QRCoderMode::sKANJI) { - AppendKanjiBytes(content, bits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else if(mode == CBC_QRCoderMode::sGBK) { - AppendGBKBytes(content, bits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } else { - e = BCExceptionUnsupportedMode; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - FX_INT32 length = content.GetLength(); - FX_INT32 i = 0; - while(i < length) { - FX_INT32 num1 = content[i] - '0'; - if(i + 2 < length) { - FX_INT32 num2 = content[i + 1] - '0'; - FX_INT32 num3 = content[i + 2] - '0'; - bits->AppendBits(num1 * 100 + num2 * 10 + num3, 10, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - i += 3; - } else if(i + 1 < length) { - FX_INT32 num2 = content[i + 1] - '0'; - bits->AppendBits(num1 * 10 + num2, 7, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - i += 2; - } else { - bits->AppendBits(num1, 4, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - i++; - } - } -} -void CBC_QRCoderEncoder::AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - FX_INT32 length = content.GetLength(); - FX_INT32 i = 0; - while(i < length) { - FX_INT32 code1 = GetAlphaNumericCode(content[i]); - if(code1 == -1) { - e = BCExceptionInvalidateCharacter; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(i + 1 < length) { - FX_INT32 code2 = GetAlphaNumericCode(content[i + 1]); - if(code2 == -1) { - e = BCExceptionInvalidateCharacter; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - bits->AppendBits(code1 * 45 + code2, 11, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - i += 2; - } else { - bits->AppendBits(code1, 6, e); - BC_EXCEPTION_CHECK_ReturnVoid(e) - i++; - } - } -} -void CBC_QRCoderEncoder::AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - FX_INT32 length = content.GetLength(); - FX_DWORD value = 0; - for(FX_INT32 i = 0; i < length; i += 2) { - value = (FX_DWORD)((FX_BYTE)content[i] << 8 | (FX_BYTE)content[i + 1]); - if(value <= 0xAAFE && value >= 0xA1A1) { - value -= 0xA1A1; - } else if(value <= 0xFAFE && value >= 0xB0A1) { - value -= 0xA6A1; - } else { - e = BCExceptionInvalidateCharacter; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - value = (FX_DWORD)((value >> 8 ) * 0x60) + (FX_DWORD)(value & 0xff); - bits->AppendBits(value, 13, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e) -{ - for(FX_INT32 i = 0; i < content.GetLength(); i++) { - bits->AppendBits(content[i], 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e) -{ - for(FX_INT32 i = 0; i < bytes.GetSize(); i++) { - bits->AppendBits(bytes[i], 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - CFX_ByteArray bytes; - FX_DWORD value = 0, h = 0; - for(FX_INT32 i = 0; i < bytes.GetSize(); i += 2) { - value = (FX_DWORD)((FX_BYTE)(content[i] << 8) | (FX_BYTE)content[i + 1]); - if(value <= 0x9ffc && value >= 0x8140) { - value -= 0x8140; - } else if(value <= 0xebbf && value >= 0xe040) { - value -= 0xc140; - } else { - e = BCExceptionInvalidateCharacter; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - value = (FX_DWORD)((value >> 8 ) * 0xc0) + (FX_DWORD)(value & 0xff); - bits->AppendBits(value, 13, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, - CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e) -{ - qrCode->SetECLevel(ecLevel); - qrCode->SetMode(mode); - for(FX_INT32 versionNum = 1; versionNum <= 40; versionNum++) { - CBC_QRCoderVersion* version = CBC_QRCoderVersion::GetVersionForNumber(versionNum, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 numBytes = version->GetTotalCodeWords(); - CBC_QRCoderECBlocks* ecBlocks = version->GetECBlocksForLevel(ecLevel); - FX_INT32 numEcBytes = ecBlocks->GetTotalECCodeWords(); - FX_INT32 numRSBlocks = ecBlocks->GetNumBlocks(); - FX_INT32 numDataBytes = numBytes - numEcBytes; - if(numDataBytes >= numInputBytes + 3) { - qrCode->SetVersion(versionNum); - qrCode->SetNumTotalBytes(numBytes); - qrCode->SetNumDataBytes(numDataBytes); - qrCode->SetNumRSBlocks(numRSBlocks); - qrCode->SetNumECBytes(numEcBytes); - qrCode->SetMatrixWidth(version->GetDimensionForVersion()); - return; - } - } - e = BCExceptionCannotFindBlockInfo; - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderEncoder::AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - bits->AppendBits(mode->GetBits(), 4, e); - if(mode == CBC_QRCoderMode::sGBK) { - bits->AppendBits(1, 4, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - CBC_QRCoderVersion* qcv = CBC_QRCoderVersion::GetVersionForNumber(version, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 numBits = mode->GetCharacterCountBits(qcv, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(numBits > ((1 << numBits) - 1)) { - return; - } - if(mode == CBC_QRCoderMode::sGBK) { - bits->AppendBits(numLetters / 2, numBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - bits->AppendBits(numLetters, numBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderEncoder::InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e) -{ - if(bits->sizeInBytes() != numDataBytes) { - e = BCExceptionBitsBytesNotMatch; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 dataBytesOffset = 0; - FX_INT32 maxNumDataBytes = 0; - FX_INT32 maxNumEcBytes = 0; - CFX_PtrArray blocks; - FX_INT32 i; - for(i = 0; i < numRSBlocks; i++) { - FX_INT32 numDataBytesInBlock; - FX_INT32 numEcBytesInBlosk; - GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, numRSBlocks, i, - numDataBytesInBlock, numEcBytesInBlosk); - CBC_CommonByteArray* dataBytes = FX_NEW CBC_CommonByteArray; - dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); - CBC_CommonByteArray* ecBytes = GenerateECBytes(dataBytes, numEcBytesInBlosk, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - blocks.Add(FX_NEW CBC_QRCoderBlockPair(dataBytes, ecBytes)); - maxNumDataBytes = FX_MAX(maxNumDataBytes, dataBytes->Size()); - maxNumEcBytes = FX_MAX(maxNumEcBytes, ecBytes->Size()); - dataBytesOffset += numDataBytesInBlock; - } - if(numDataBytes != dataBytesOffset) { - e = BCExceptionBytesNotMatchOffset; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 x = 0; x < maxNumDataBytes; x++) { - for(FX_INT32 j = 0; j < blocks.GetSize(); j++) { - CBC_CommonByteArray* dataBytes = ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes(); - if(x < dataBytes->Size()) { - result->AppendBits(dataBytes->At(x), 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } - } - for(FX_INT32 y = 0; y < maxNumEcBytes; y++) { - for(FX_INT32 l = 0; l < blocks.GetSize(); l++) { - CBC_CommonByteArray* ecBytes = ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes(); - if(y < ecBytes->Size()) { - result->AppendBits(ecBytes->At(y), 8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } - } - for(FX_INT32 k = 0; k < blocks.GetSize(); k++) { - delete (CBC_QRCoderBlockPair*)blocks[k]; - } - if(numTotalBytes != result->sizeInBytes()) { - e = BCExceptionSizeInBytesDiffer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderEncoder::GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, - FX_INT32 numRSBlocks, FX_INT32 blockID, - FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlock) -{ - if(blockID >= numRSBlocks) { - return; - } - FX_INT32 numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; - FX_INT32 numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; - FX_INT32 numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; - FX_INT32 numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; - FX_INT32 numDataBytesInGroup1 = numDataBytes / numRSBlocks; - FX_INT32 numDataBytesInGroup2 = numDataBytesInGroup1 + 1; - FX_INT32 numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; - FX_INT32 numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; - if (blockID < numRsBlocksInGroup1) { - numDataBytesInBlock = numDataBytesInGroup1; - numECBytesInBlock = numEcBytesInGroup1; - } else { - numDataBytesInBlock = numDataBytesInGroup2; - numECBytesInBlock = numEcBytesInGroup2; - } -} -CBC_CommonByteArray* CBC_QRCoderEncoder::GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e) -{ - FX_INT32 numDataBytes = dataBytes->Size(); - CFX_Int32Array toEncode; - toEncode.SetSize(numDataBytes + numEcBytesInBlock); - for(FX_INT32 i = 0; i < numDataBytes; i++) { - toEncode[i] = (dataBytes->At(i)); - } - CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild); - encode.Init(); - encode.Encode(&toEncode, numEcBytesInBlock, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_CommonByteArray* ecBytes = FX_NEW CBC_CommonByteArray(numEcBytesInBlock); - for(FX_INT32 j = 0; j < numEcBytesInBlock; j++) { - ecBytes->Set(j, toEncode[numDataBytes + j]); - } - return ecBytes; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp b/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp deleted file mode 100644 index 238b4e3149..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderErrorCorrectionLevel.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::L = NULL; -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::M = NULL; -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::Q = NULL; -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::H = NULL; -CBC_QRCoderErrorCorrectionLevel::CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name) -{ - m_name += name; - m_ordinal = ordinal; - m_bits = bits; -} -CBC_QRCoderErrorCorrectionLevel::~CBC_QRCoderErrorCorrectionLevel() -{ -} -void CBC_QRCoderErrorCorrectionLevel::Initialize() -{ - L = FX_NEW CBC_QRCoderErrorCorrectionLevel(0, 0x01, (FX_CHAR*)"L"); - M = FX_NEW CBC_QRCoderErrorCorrectionLevel(1, 0x00, (FX_CHAR*)"M"); - Q = FX_NEW CBC_QRCoderErrorCorrectionLevel(2, 0x03, (FX_CHAR*)"Q"); - H = FX_NEW CBC_QRCoderErrorCorrectionLevel(3, 0x02, (FX_CHAR*)"H"); -} -void CBC_QRCoderErrorCorrectionLevel::Finalize() -{ - delete L; - delete M; - delete Q; - delete H; -} -FX_INT32 CBC_QRCoderErrorCorrectionLevel::Ordinal() -{ - return m_ordinal; -} -FX_INT32 CBC_QRCoderErrorCorrectionLevel::GetBits() -{ - return m_bits; -} -CFX_ByteString CBC_QRCoderErrorCorrectionLevel::GetName() -{ - return m_name; -} -CBC_QRCoderErrorCorrectionLevel* CBC_QRCoderErrorCorrectionLevel::ForBits(FX_INT32 bits) -{ - switch(bits) { - case 0x00: - return M; - case 0x01: - return L; - case 0x02: - return H; - case 0x03: - return Q; - default: - return NULL; - } -} -void CBC_QRCoderErrorCorrectionLevel::Destroy() -{ - if(L) { - delete CBC_QRCoderErrorCorrectionLevel::L; - L = NULL; - } - if(M) { - delete CBC_QRCoderErrorCorrectionLevel::M; - M = NULL; - } - if(H) { - delete CBC_QRCoderErrorCorrectionLevel::H; - H = NULL; - } - if(Q) { - delete CBC_QRCoderErrorCorrectionLevel::Q; - Q = NULL; - } -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp b/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp deleted file mode 100644 index 2dbbcc5432..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderFormatInformation.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoderFormatInformation.h" -const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_MASK_QR = 0X5412; -const FX_INT32 CBC_QRCoderFormatInformation::FORMAT_INFO_DECODE_LOOKUP[32][2] = { - {0x5412, 0x00}, - {0x5125, 0x01}, - {0x5E7C, 0x02}, - {0x5B4B, 0x03}, - {0x45F9, 0x04}, - {0x40CE, 0x05}, - {0x4F97, 0x06}, - {0x4AA0, 0x07}, - {0x77C4, 0x08}, - {0x72F3, 0x09}, - {0x7DAA, 0x0A}, - {0x789D, 0x0B}, - {0x662F, 0x0C}, - {0x6318, 0x0D}, - {0x6C41, 0x0E}, - {0x6976, 0x0F}, - {0x1689, 0x10}, - {0x13BE, 0x11}, - {0x1CE7, 0x12}, - {0x19D0, 0x13}, - {0x0762, 0x14}, - {0x0255, 0x15}, - {0x0D0C, 0x16}, - {0x083B, 0x17}, - {0x355F, 0x18}, - {0x3068, 0x19}, - {0x3F31, 0x1A}, - {0x3A06, 0x1B}, - {0x24B4, 0x1C}, - {0x2183, 0x1D}, - {0x2EDA, 0x1E}, - {0x2BED, 0x1F}, -}; -const FX_INT32 CBC_QRCoderFormatInformation::BITS_SET_IN_HALF_BYTE[] = -{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; -CBC_QRCoderFormatInformation::CBC_QRCoderFormatInformation(FX_INT32 formatInfo) -{ - m_errorCorrectLevl = CBC_QRCoderErrorCorrectionLevel::ForBits((formatInfo >> 3) & 0x03); - m_dataMask = (FX_BYTE) (formatInfo & 0x07); -} -CBC_QRCoderFormatInformation::~CBC_QRCoderFormatInformation() -{ -} -FX_INT32 CBC_QRCoderFormatInformation::NumBitsDiffering(FX_INT32 a, FX_INT32 b) -{ - a ^= b; - return BITS_SET_IN_HALF_BYTE[a & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] + - BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F]; -} -FX_BYTE CBC_QRCoderFormatInformation::GetDataMask() -{ - return m_dataMask; -} -CBC_QRCoderErrorCorrectionLevel *CBC_QRCoderFormatInformation::GetErrorCorrectionLevel() -{ - return m_errorCorrectLevl; -} -CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DecodeFormatInformation(FX_INT32 maskedFormatInfo) -{ - CBC_QRCoderFormatInformation* formatInfo = DoDecodeFormatInformation(maskedFormatInfo); - if(formatInfo != NULL) { - return formatInfo; - } - return DoDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR); -} -CBC_QRCoderFormatInformation* CBC_QRCoderFormatInformation::DoDecodeFormatInformation(FX_INT32 maskedFormatInfo) -{ - FX_INT32 bestDifference = (FX_INT32)FXSYS_nan(); - FX_INT32 bestFormatInfo = 0; - for(FX_INT32 i = 0; i < 32; i++) { - FX_INT32 const* decodeInfo = &FORMAT_INFO_DECODE_LOOKUP[i][0]; - FX_INT32 targetInfo = decodeInfo[0]; - if(targetInfo == maskedFormatInfo) { - return FX_NEW CBC_QRCoderFormatInformation(decodeInfo[1]); - } - FX_INT32 bitsDifference = NumBitsDiffering(maskedFormatInfo, targetInfo); - if(bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - if(bestDifference <= 3) { - return FX_NEW CBC_QRCoderFormatInformation(bestFormatInfo); - } - return NULL; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp deleted file mode 100644 index 6f2f9b2dbb..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderMaskUtil.cpp +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoder.h" -#include "include/BC_QRCoderMaskUtil.h" -CBC_QRCoderMaskUtil::CBC_QRCoderMaskUtil() -{ -} -CBC_QRCoderMaskUtil::~CBC_QRCoderMaskUtil() -{ -} -FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix) -{ - return ApplyMaskPenaltyRule1Internal(matrix, TRUE) + - ApplyMaskPenaltyRule1Internal(matrix, FALSE); -} -FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix) -{ - FX_INT32 penalty = 0; - FX_BYTE* array = matrix->GetArray(); - FX_INT32 width = matrix->GetWidth(); - FX_INT32 height = matrix->GetHeight(); - for(FX_INT32 y = 0; y < height - 1; y++) { - for(FX_INT32 x = 0; x < width - 1; x++) { - FX_INT32 value = array[y * width + x]; - if(value == array[y * width + x + 1] && - value == array[(y + 1) * width + x] && - value == array[(y + 1) * width + x + 1]) { - penalty ++; - } - } - } - return 3 * penalty; -} -FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix) -{ - FX_INT32 penalty = 0; - FX_BYTE* array = matrix->GetArray(); - FX_INT32 width = matrix->GetWidth(); - FX_INT32 height = matrix->GetHeight(); - for (FX_INT32 y = 0; y < height; ++y) { - for (FX_INT32 x = 0; x < width; ++x) { - if (x == 0 && ((y >= 0 && y <= 6) || (y >= height - 7 && y <= height - 1))) { - continue; - } - if (x == width - 7 && (y >= 0 && y <= 6)) { - continue; - } - if (y == 0 && ((x >= 0 && x <= 6) || (x >= width - 7 && x <= width - 1))) { - continue; - } - if (y == height - 7 && (x >= 0 && x <= 6)) { - continue; - } - if (x + 6 < width && - array[y * width + x] == 1 && - array[y * width + x + 1] == 0 && - array[y * width + x + 2] == 1 && - array[y * width + x + 3] == 1 && - array[y * width + x + 4] == 1 && - array[y * width + x + 5] == 0 && - array[y * width + x + 6] == 1 && - ((x + 10 < width && - array[y * width + x + 7] == 0 && - array[y * width + x + 8] == 0 && - array[y * width + x + 9] == 0 && - array[y * width + x + 10] == 0) || - (x - 4 >= 0 && - array[y * width + x - 1] == 0 && - array[y * width + x - 2] == 0 && - array[y * width + x - 3] == 0 && - array[y * width + x - 4] == 0))) { - penalty += 40; - } - if (y + 6 < height && - array[y * width + x] == 1 && - array[(y + 1) * width + x] == 0 && - array[(y + 2) * width + x] == 1 && - array[(y + 3) * width + x] == 1 && - array[(y + 4) * width + x] == 1 && - array[(y + 5) * width + x] == 0 && - array[(y + 6) * width + x] == 1 && - ((y + 10 < height && - array[(y + 7) * width + x] == 0 && - array[(y + 8) * width + x] == 0 && - array[(y + 9) * width + x] == 0 && - array[(y + 10) * width + x] == 0) || - (y - 4 >= 0 && - array[(y - 1) * width + x] == 0 && - array[(y - 2) * width + x] == 0 && - array[(y - 3) * width + x] == 0 && - array[(y - 4) * width + x] == 0))) { - penalty += 40; - } - } - } - return penalty; -} -FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix) -{ - FX_INT32 numDarkCells = 0; - FX_BYTE* array = matrix->GetArray(); - FX_INT32 width = matrix->GetWidth(); - FX_INT32 height = matrix->GetHeight(); - for (FX_INT32 y = 0; y < height; ++y) { - for (FX_INT32 x = 0; x < width; ++x) { - if (array[y * width + x] == 1) { - numDarkCells += 1; - } - } - } - FX_INT32 numTotalCells = matrix->GetHeight() * matrix->GetWidth(); - double darkRatio = (double) numDarkCells / numTotalCells; - return abs( (FX_INT32) (darkRatio * 100 - 50) / 5 ) * 5 * 10; -} -FX_BOOL CBC_QRCoderMaskUtil::GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e) -{ - if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { - e = (BCExceptionInvalidateMaskPattern); - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - } - FX_INT32 intermediate = 0, temp = 0; - switch(maskPattern) { - case 0: - intermediate = (y + x) & 0x1; - break; - case 1: - intermediate = y & 0x1; - break; - case 2: - intermediate = x % 3; - break; - case 3: - intermediate = (y + x) % 3; - break; - case 4: - intermediate = ((y >> 1) + (x / 3)) & 0x1; - break; - case 5: - temp = y * x; - intermediate = (temp & 0x1) + (temp % 3); - break; - case 6: - temp = y * x; - intermediate = (((temp & 0x1) + (temp % 3)) & 0x1); - break; - case 7: - temp = y * x; - intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1); - break; - default: { - e = BCExceptionInvalidateMaskPattern; - BC_EXCEPTION_CHECK_ReturnValue(e, FALSE); - } - } - return intermediate == 0; -} -FX_INT32 CBC_QRCoderMaskUtil::ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal) -{ - FX_INT32 penalty = 0; - FX_INT32 numSameBitCells = 0; - FX_INT32 prevBit = -1; - FX_INT32 width = matrix->GetWidth(); - FX_INT32 height = matrix->GetHeight(); - FX_INT32 iLimit = isHorizontal ? height : width; - FX_INT32 jLimit = isHorizontal ? width : height; - FX_BYTE* array = matrix->GetArray(); - for (FX_INT32 i = 0; i < iLimit; ++i) { - for (FX_INT32 j = 0; j < jLimit; ++j) { - FX_INT32 bit = isHorizontal ? array[i * width + j] : array[j * width + i]; - if (bit == prevBit) { - numSameBitCells += 1; - if (numSameBitCells == 5) { - penalty += 3; - } else if (numSameBitCells > 5) { - penalty += 1; - } - } else { - numSameBitCells = 1; - prevBit = bit; - } - } - numSameBitCells = 0; - } - return penalty; -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp deleted file mode 100644 index b76af65847..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderMatrixUtil.cpp +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonByteMatrix.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoder.h" -#include "include/BC_QRCoderMaskUtil.h" -#include "include/BC_QRCoderMatrixUtil.h" -#include "include/BC_QRCoderBitVector.h" -const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_DETECTION_PATTERN[7][7] = { - 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1 -}; -const FX_INT32 CBC_QRCoderMatrixUtil::HORIZONTAL_SEPARATION_PATTERN[1][8] = { - 0, 0, 0, 0, 0, 0, 0, 0 -}; -const FX_INT32 CBC_QRCoderMatrixUtil::VERTICAL_SEPARATION_PATTERN[7][1] = { - 0, 0, 0, 0, 0, 0, 0 -}; -const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN[5][5] = { - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 1, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1 -}; -const FX_INT32 CBC_QRCoderMatrixUtil::POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7] = { - { -1, -1, -1, -1, -1, -1, -1}, - { 6, 18, -1, -1, -1, -1, -1}, - { 6, 22, -1, -1, -1, -1, -1}, - { 6, 26, -1, -1, -1, -1, -1}, - { 6, 30, -1, -1, -1, -1, -1}, - { 6, 34, -1, -1, -1, -1, -1}, - { 6, 22, 38, -1, -1, -1, -1}, - { 6, 24, 42, -1, -1, -1, -1}, - { 6, 26, 46, -1, -1, -1, -1}, - { 6, 28, 50, -1, -1, -1, -1}, - { 6, 30, 54, -1, -1, -1, -1}, - { 6, 32, 58, -1, -1, -1, -1}, - { 6, 34, 62, -1, -1, -1, -1}, - { 6, 26, 46, 66, -1, -1, -1}, - { 6, 26, 48, 70, -1, -1, -1}, - { 6, 26, 50, 74, -1, -1, -1}, - { 6, 30, 54, 78, -1, -1, -1}, - { 6, 30, 56, 82, -1, -1, -1}, - { 6, 30, 58, 86, -1, -1, -1}, - { 6, 34, 62, 90, -1, -1, -1}, - { 6, 28, 50, 72, 94, -1, -1}, - { 6, 26, 50, 74, 98, -1, -1}, - { 6, 30, 54, 78, 102, -1, -1}, - { 6, 28, 54, 80, 106, -1, -1}, - { 6, 32, 58, 84, 110, -1, -1}, - { 6, 30, 58, 86, 114, -1, -1}, - { 6, 34, 62, 90, 118, -1, -1}, - { 6, 26, 50, 74, 98, 122, -1}, - { 6, 30, 54, 78, 102, 126, -1}, - { 6, 26, 52, 78, 104, 130, -1}, - { 6, 30, 56, 82, 108, 134, -1}, - { 6, 34, 60, 86, 112, 138, -1}, - { 6, 30, 58, 86, 114, 142, -1}, - { 6, 34, 62, 90, 118, 146, -1}, - { 6, 30, 54, 78, 102, 126, 150}, - { 6, 24, 50, 76, 102, 128, 154}, - { 6, 28, 54, 80, 106, 132, 158}, - { 6, 32, 58, 84, 110, 136, 162}, - { 6, 26, 54, 82, 110, 138, 166}, - { 6, 30, 58, 86, 114, 142, 170}, -}; -const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_COORDINATES[15][2] = { - {8, 0}, - {8, 1}, - {8, 2}, - {8, 3}, - {8, 4}, - {8, 5}, - {8, 7}, - {8, 8}, - {7, 8}, - {5, 8}, - {4, 8}, - {3, 8}, - {2, 8}, - {1, 8}, - {0, 8}, -}; -const FX_INT32 CBC_QRCoderMatrixUtil::VERSION_INFO_POLY = 0x1f25; -const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_POLY = 0x0537; -const FX_INT32 CBC_QRCoderMatrixUtil::TYPE_INFO_MASK_PATTERN = 0x5412; -void CBC_QRCoderMatrixUtil::ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - matrix->clear((FX_BYTE) - 1); -} -void CBC_QRCoderMatrixUtil::BuildMatrix(CBC_QRCoderBitVector* dataBits, - CBC_QRCoderErrorCorrectionLevel* ecLevel, - FX_INT32 version, FX_INT32 maskPattern, - CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - ClearMatrix(matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedBasicPatterns(version, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedTypeInfo(ecLevel, maskPattern, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - MaybeEmbedVersionInfo(version, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedDataBits(dataBits, maskPattern, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderMatrixUtil::EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - EmbedPositionDetectionPatternsAndSeparators(matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedDarkDotAtLeftBottomCorner(matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - MaybeEmbedPositionAdjustmentPatterns(version, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedTimingPatterns(matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderMatrixUtil::EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, - FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - CBC_QRCoderBitVector typeInfoBits; - typeInfoBits.Init(); - MakeTypeInfoBits(ecLevel, maskPattern, &typeInfoBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - for(FX_INT32 i = 0; i < typeInfoBits.Size(); i++) { - FX_INT32 bit = typeInfoBits.At(typeInfoBits.Size() - 1 - i, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 x1 = TYPE_INFO_COORDINATES[i][0]; - FX_INT32 y1 = TYPE_INFO_COORDINATES[i][1]; - matrix->Set(x1, y1, bit); - if(i < 8) { - FX_INT32 x2 = matrix->GetWidth() - i - 1; - FX_INT32 y2 = 8; - matrix->Set(x2, y2, bit); - } else { - FX_INT32 x2 = 8; - FX_INT32 y2 = matrix->GetHeight() - 7 + (i - 8); - matrix->Set(x2, y2, bit); - } - } -} -void CBC_QRCoderMatrixUtil::MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(version < 7) { - return; - } - CBC_QRCoderBitVector versionInfoBits; - versionInfoBits.Init(); - MakeVersionInfoBits(version, &versionInfoBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 bitIndex = 6 * 3 - 1; - for(FX_INT32 i = 0; i < 6; i++) { - for(FX_INT32 j = 0; j < 3; j++) { - FX_INT32 bit = versionInfoBits.At(bitIndex, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - bitIndex--; - matrix->Set(i, matrix->GetHeight() - 11 + j, bit); - matrix->Set(matrix->GetHeight() - 11 + j, i, bit); - } - } -} -void CBC_QRCoderMatrixUtil::EmbedDataBits(CBC_QRCoderBitVector* dataBits, - FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL || dataBits == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 bitIndex = 0; - FX_INT32 direction = -1; - FX_INT32 x = matrix->GetWidth() - 1; - FX_INT32 y = matrix->GetHeight() - 1; - while(x > 0) { - if (x == 6) { - x -= 1; - } - while(y >= 0 && y < matrix->GetHeight()) { - if (y == 6) { - y += direction; - continue; - } - for(FX_INT32 i = 0; i < 2; i++) { - FX_INT32 xx = x - i; - if(!IsEmpty(matrix->Get(xx, y))) { - continue; - } - FX_INT32 bit; - if(bitIndex < dataBits->Size()) { - bit = dataBits->At(bitIndex, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - bitIndex++; - } else { - bit = 0; - } - if( maskPattern != -1) { - FX_BOOL bol = CBC_QRCoderMaskUtil::GetDataMaskBit(maskPattern, xx, y, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(bol) { - bit ^= 0x01; - } - } - matrix->Set(xx, y, bit); - } - y += direction; - } - direction = -direction; - y += direction; - x -= 2; - } - if(bitIndex != dataBits->Size()) { - return; - } -} -FX_INT32 CBC_QRCoderMatrixUtil::CalculateBCHCode(FX_INT32 value, FX_INT32 poly) -{ - FX_INT32 msbSetInPoly = FindMSBSet(poly); - value <<= msbSetInPoly - 1; - while(FindMSBSet(value) >= msbSetInPoly) { - value ^= poly << (FindMSBSet(value) - msbSetInPoly); - } - return value; -} -void CBC_QRCoderMatrixUtil::MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, - FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - if(bits == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(!CBC_QRCoder::IsValidMaskPattern(maskPattern)) { - e = BCExceptionBadMask; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 typeInfo = (ecLevel->GetBits() << 3) | maskPattern; - BC_EXCEPTION_CHECK_ReturnVoid(e); - bits->AppendBits(typeInfo, 5, e); - FX_INT32 bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY); - BC_EXCEPTION_CHECK_ReturnVoid(e); - bits->AppendBits(bchCode, 10, e); - CBC_QRCoderBitVector maskBits; - maskBits.Init(); - maskBits.AppendBits(TYPE_INFO_MASK_PATTERN, 15, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - bits->XOR(&maskBits, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(bits->Size() != 15) { - e = BCExceptionBitSizeNot15; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -void CBC_QRCoderMatrixUtil::MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e) -{ - if(bits == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - bits->AppendBits(version, 6, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 bchCode = CalculateBCHCode(version, VERSION_INFO_POLY); - bits->AppendBits(bchCode, 12, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(bits->Size() != 18) { - e = BCExceptionBitSizeNot18; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -FX_BOOL CBC_QRCoderMatrixUtil::IsEmpty(FX_INT32 value) -{ - return (FX_BYTE)value == 0xff; -} -FX_BOOL CBC_QRCoderMatrixUtil::IsValidValue(FX_INT32 value) -{ - return ((FX_BYTE)value == 0xff || (FX_BYTE)value == 0x00 || (FX_BYTE)value == 0x01); -} -void CBC_QRCoderMatrixUtil::EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 i = 8; i < matrix->GetWidth() - 8; i++) { - FX_INT32 bit = (i + 1) % 2; - if(!IsValidValue(matrix->Get(i, 6))) { - e = BCExceptionInvalidateImageData; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(IsEmpty(matrix->Get(i , 6))) { - matrix->Set(i, 6, bit); - } - if(!IsValidValue(matrix->Get(6, i))) { - e = BCExceptionInvalidateImageData; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(IsEmpty(matrix->Get(6, i))) { - matrix->Set(6, i, bit); - } - } -} -void CBC_QRCoderMatrixUtil::EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(matrix->Get(8, matrix->GetHeight() - 8) == 0) { - e = BCExceptionHeight_8BeZero; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - matrix->Set(8, matrix->GetHeight() - 8, 1); -} -void CBC_QRCoderMatrixUtil::EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, - CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 x = 0; x < 8; x++) { - if(!IsEmpty(matrix->Get(xStart + x, yStart))) { - e = BCExceptionInvalidateData; - BC_EXCEPTION_CHECK_ReturnVoid(e) - } - matrix->Set(xStart + x, yStart, HORIZONTAL_SEPARATION_PATTERN[0][x]); - } -} -void CBC_QRCoderMatrixUtil::EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, - CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 y = 0; y < 7; y++) { - if(!IsEmpty(matrix->Get(xStart, yStart + y))) { - e = BCExceptionInvalidateData; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - matrix->Set(xStart, yStart + y, VERTICAL_SEPARATION_PATTERN[y][0]); - } -} -void CBC_QRCoderMatrixUtil::EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, - CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 y = 0; y < 5; y++) { - for(FX_INT32 x = 0; x < 5; x++) { - if(!IsEmpty(matrix->Get(xStart + x, y + yStart))) { - e = BCExceptionInvalidateData; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - matrix->Set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]); - } - } -} -void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPattern (FX_INT32 xStart, FX_INT32 yStart, - CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - for(FX_INT32 y = 0; y < 7; y++) { - for(FX_INT32 x = 0; x < 7; x++) { - if(!IsEmpty(matrix->Get(xStart + x, yStart + y))) { - e = BCExceptionInvalidateData; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - matrix->Set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]); - } - } -} -void CBC_QRCoderMatrixUtil::EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 pdpWidth = 7; - EmbedPositionDetectionPattern(0, 0, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedPositionDetectionPattern(matrix->GetWidth() - pdpWidth, 0, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedPositionDetectionPattern(0, matrix->GetWidth() - pdpWidth, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 hspWidth = 8; - EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedHorizontalSeparationPattern(matrix->GetWidth() - hspWidth, hspWidth - 1, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedHorizontalSeparationPattern(0, matrix->GetWidth() - hspWidth, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 vspSize = 7; - EmbedVerticalSeparationPattern(vspSize, 0, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedVerticalSeparationPattern(matrix->GetHeight() - vspSize - 1, 0, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - EmbedVerticalSeparationPattern(vspSize, matrix->GetHeight() - vspSize, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); -} -void CBC_QRCoderMatrixUtil::MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e) -{ - if(matrix == NULL) { - e = BCExceptionNullPointer; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if(version < 2) { - return; - } - FX_INT32 index = version - 1; - FX_INT32 const* coordinates = &(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][0]); - FX_INT32 numCoordinate = 7; - for(FX_INT32 i = 0; i < numCoordinate; i++) { - for(FX_INT32 j = 0; j < numCoordinate; j++) { - FX_INT32 y = coordinates[i]; - FX_INT32 x = coordinates[j]; - if(x == -1 || y == -1) { - continue; - } - if(IsEmpty(matrix->Get(x, y))) { - EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } - } -} -FX_INT32 CBC_QRCoderMatrixUtil::FindMSBSet(FX_INT32 value) -{ - FX_INT32 numDigits = 0; - while(value != 0) { - value >>= 1; - ++numDigits; - } - return numDigits; -} -CBC_QRCoderMatrixUtil::CBC_QRCoderMatrixUtil() -{ -} -CBC_QRCoderMatrixUtil::~CBC_QRCoderMatrixUtil() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp b/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp deleted file mode 100644 index f0f1621e28..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderMode.cpp +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_QRCoderMode.h" -CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL; -CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL; -CBC_QRCoderMode::CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, - FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, - FX_INT32 bits, CFX_ByteString name) -{ - m_characterCountBitsForVersions = characterCountBitsForVersions; - if (m_characterCountBitsForVersions != NULL) { - m_characterCountBitsForVersions[0] = x1; - m_characterCountBitsForVersions[1] = x2; - m_characterCountBitsForVersions[2] = x3; - } - m_name += name; - m_bits = bits; -} -CBC_QRCoderMode::~CBC_QRCoderMode() -{ - if(m_characterCountBitsForVersions != NULL) { - FX_Free(m_characterCountBitsForVersions); - } -} -void CBC_QRCoderMode::Initialize() -{ - sBYTE = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 16, 16, 0x4, "BYTE"); - sALPHANUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 9, 11, 13, 0x2, "ALPHANUMERIC"); - sECI = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI"); - sKANJI = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x8, "KANJI"); - sNUMERIC = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 10, 12, 14, 0x1, "NUMERIC"); - sGBK = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 8, 10, 12, 0x0D, "GBK"); - sTERMINATOR = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x00, "TERMINATOR"); - sFNC1_FIRST_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION"); - sFNC1_SECOND_POSITION = FX_NEW CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION"); - sSTRUCTURED_APPEND = FX_NEW CBC_QRCoderMode(FX_Alloc(FX_INT32, 3), 0, 0, 0, 0x03, "STRUCTURED_APPEND"); -} -void CBC_QRCoderMode::Finalize() -{ - delete sBYTE; - delete sALPHANUMERIC; - delete sECI; - delete sKANJI; - delete sNUMERIC; - delete sGBK; - delete sTERMINATOR; - delete sFNC1_FIRST_POSITION; - delete sFNC1_SECOND_POSITION; - delete sSTRUCTURED_APPEND; -} -CBC_QRCoderMode* CBC_QRCoderMode::ForBits(FX_INT32 bits, FX_INT32 &e) -{ - switch (bits) { - case 0x0: - return sTERMINATOR; - case 0x1: - return sNUMERIC; - case 0x2: - return sALPHANUMERIC; - case 0x3: - return sSTRUCTURED_APPEND; - case 0x4: - return sBYTE; - case 0x5: - return sFNC1_FIRST_POSITION; - case 0x7: - return sECI; - case 0x8: - return sKANJI; - case 0x9: - return sFNC1_SECOND_POSITION; - case 0x0D: - return sGBK; - default: { - e = BCExceptionUnsupportedMode; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - } - return NULL; -} -FX_INT32 CBC_QRCoderMode::GetBits() -{ - return m_bits; -} -CFX_ByteString CBC_QRCoderMode::GetName() -{ - return m_name; -} -FX_INT32 CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e) -{ - if(m_characterCountBitsForVersions == NULL) { - e = BCExceptionCharacterNotThisMode; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - FX_INT32 number = version->GetVersionNumber(); - FX_INT32 offset; - if(number <= 9) { - offset = 0; - } else if(number <= 26) { - offset = 1; - } else { - offset = 2; - } - return m_characterCountBitsForVersions[offset]; -} -void CBC_QRCoderMode::Destroy() -{ - if(sBYTE) { - delete CBC_QRCoderMode::sBYTE; - sBYTE = NULL; - } - if(sNUMERIC) { - delete CBC_QRCoderMode::sNUMERIC; - sNUMERIC = NULL; - } - if(sALPHANUMERIC) { - delete CBC_QRCoderMode::sALPHANUMERIC; - sALPHANUMERIC = NULL; - } - if(sKANJI) { - delete CBC_QRCoderMode::sKANJI; - sKANJI = NULL; - } - if(sECI) { - delete CBC_QRCoderMode::sECI; - sECI = NULL; - } - if(sGBK) { - delete CBC_QRCoderMode::sGBK; - sGBK = NULL; - } - if(sTERMINATOR) { - delete CBC_QRCoderMode::sTERMINATOR; - sTERMINATOR = NULL; - } - if(sFNC1_FIRST_POSITION) { - delete CBC_QRCoderMode::sFNC1_FIRST_POSITION; - sFNC1_FIRST_POSITION = NULL; - } - if(sFNC1_SECOND_POSITION) { - delete CBC_QRCoderMode::sFNC1_SECOND_POSITION; - sFNC1_SECOND_POSITION = NULL; - } - if(sSTRUCTURED_APPEND) { - delete CBC_QRCoderMode::sSTRUCTURED_APPEND; - sSTRUCTURED_APPEND = NULL; - } -} diff --git a/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp b/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp deleted file mode 100644 index a566e8dcfc..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRCoderVersion.cpp +++ /dev/null @@ -1,777 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/utils.h" -#include "include/BC_QRCoderECB.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRCoderFormatInformation.h" -#include "include/BC_QRCoderErrorCorrectionLevel.h" -#include "include/BC_QRCoderBitVector.h" -#include "include/BC_QRCoderECBlocks.h" -#include "include/BC_QRCoderVersion.h" -const FX_INT32 CBC_QRCoderVersion::VERSION_DECODE_INFO[] = { - 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, - 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, - 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, - 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, - 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, - 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, - 0x2542E, 0x26A64, 0x27541, 0x28C69 -}; -CFX_PtrArray *CBC_QRCoderVersion::VERSION = NULL; -void CBC_QRCoderVersion::Initialize() -{ - VERSION = FX_NEW CFX_PtrArray(); -} -void CBC_QRCoderVersion::Finalize() -{ - for(FX_INT32 i = 0 ; i < VERSION->GetSize(); i++) { - CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i)); - delete v; - } - delete VERSION; -} -CBC_QRCoderVersion::CBC_QRCoderVersion(FX_INT32 versionNumber, - CBC_QRCoderECBlocks* ecBlocks1, - CBC_QRCoderECBlocks* ecBlocks2, - CBC_QRCoderECBlocks* ecBlocks3, - CBC_QRCoderECBlocks* ecBlocks4) -{ - m_versionNumber = versionNumber; - m_ecBlocks.Add(ecBlocks1); - m_ecBlocks.Add(ecBlocks2); - m_ecBlocks.Add(ecBlocks3); - m_ecBlocks.Add(ecBlocks4); - FX_INT32 total = 0; - FX_INT32 ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock(); - CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks(); - for(FX_INT32 i = 0; i < ecbArray->GetSize(); i++) { - CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]); - total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords); - } - m_totalCodeWords = total; - switch(versionNumber) { - case 1: - break; - case 2: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(18); - break; - case 3: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(22); - break; - case 4: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - break; - case 5: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - break; - case 6: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - break; - case 7: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(22); - m_alignmentPatternCenters.Add(38); - break; - case 8: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(24); - m_alignmentPatternCenters.Add(42); - break; - case 9: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(46); - break; - case 10: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(28); - m_alignmentPatternCenters.Add(50); - break; - case 11: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(54); - break; - case 12: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(32); - m_alignmentPatternCenters.Add(58); - break; - case 13: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - m_alignmentPatternCenters.Add(62); - break; - case 14: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(46); - m_alignmentPatternCenters.Add(66); - break; - case 15: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(48); - m_alignmentPatternCenters.Add(70); - break; - case 16: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(50); - m_alignmentPatternCenters.Add(74); - break; - case 17: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(78); - break; - case 18: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(56); - m_alignmentPatternCenters.Add(82); - break; - case 19: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(86); - break; - case 20: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - m_alignmentPatternCenters.Add(62); - m_alignmentPatternCenters.Add(90); - break; - case 21: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(28); - m_alignmentPatternCenters.Add(50); - m_alignmentPatternCenters.Add(72); - m_alignmentPatternCenters.Add(94); - break; - case 22: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(50); - m_alignmentPatternCenters.Add(74); - m_alignmentPatternCenters.Add(98); - break; - case 23: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(74); - m_alignmentPatternCenters.Add(102); - break; - case 24: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(28); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(80); - m_alignmentPatternCenters.Add(106); - break; - case 25: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(32); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(84); - m_alignmentPatternCenters.Add(110); - break; - case 26: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(86); - m_alignmentPatternCenters.Add(114); - break; - case 27: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - m_alignmentPatternCenters.Add(62); - m_alignmentPatternCenters.Add(90); - m_alignmentPatternCenters.Add(118); - break; - case 28: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(50); - m_alignmentPatternCenters.Add(74); - m_alignmentPatternCenters.Add(98); - m_alignmentPatternCenters.Add(122); - break; - case 29: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(78); - m_alignmentPatternCenters.Add(102); - m_alignmentPatternCenters.Add(126); - break; - case 30: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(52); - m_alignmentPatternCenters.Add(78); - m_alignmentPatternCenters.Add(104); - m_alignmentPatternCenters.Add(130); - break; - case 31: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(56); - m_alignmentPatternCenters.Add(82); - m_alignmentPatternCenters.Add(108); - m_alignmentPatternCenters.Add(134); - break; - case 32: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - m_alignmentPatternCenters.Add(60); - m_alignmentPatternCenters.Add(86); - m_alignmentPatternCenters.Add(112); - m_alignmentPatternCenters.Add(138); - break; - case 33: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(86); - m_alignmentPatternCenters.Add(114); - m_alignmentPatternCenters.Add(142); - break; - case 34: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(34); - m_alignmentPatternCenters.Add(62); - m_alignmentPatternCenters.Add(90); - m_alignmentPatternCenters.Add(118); - m_alignmentPatternCenters.Add(146); - break; - case 35: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(78); - m_alignmentPatternCenters.Add(102); - m_alignmentPatternCenters.Add(126); - m_alignmentPatternCenters.Add(150); - break; - case 36: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(24); - m_alignmentPatternCenters.Add(50); - m_alignmentPatternCenters.Add(76); - m_alignmentPatternCenters.Add(102); - m_alignmentPatternCenters.Add(128); - m_alignmentPatternCenters.Add(154); - break; - case 37: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(28); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(80); - m_alignmentPatternCenters.Add(106); - m_alignmentPatternCenters.Add(132); - m_alignmentPatternCenters.Add(158); - break; - case 38: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(32); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(84); - m_alignmentPatternCenters.Add(110); - m_alignmentPatternCenters.Add(136); - m_alignmentPatternCenters.Add(162); - break; - case 39: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(26); - m_alignmentPatternCenters.Add(54); - m_alignmentPatternCenters.Add(82); - m_alignmentPatternCenters.Add(110); - m_alignmentPatternCenters.Add(138); - m_alignmentPatternCenters.Add(166); - break; - case 40: - m_alignmentPatternCenters.Add(6); - m_alignmentPatternCenters.Add(30); - m_alignmentPatternCenters.Add(58); - m_alignmentPatternCenters.Add(86); - m_alignmentPatternCenters.Add(114); - m_alignmentPatternCenters.Add(142); - m_alignmentPatternCenters.Add(170); - break; - } -} -CBC_QRCoderVersion::~CBC_QRCoderVersion() -{ - if(m_ecBlocks.GetSize() != 0) { - FX_INT32 itBeg = 0; - FX_INT32 itEnd = m_ecBlocks.GetSize(); - while(itBeg != itEnd) { - delete ( (CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg]) ); - itBeg++; - } - } -} -FX_INT32 CBC_QRCoderVersion::GetVersionNumber() -{ - return m_versionNumber; -} -CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() -{ - return &m_alignmentPatternCenters; -} -FX_INT32 CBC_QRCoderVersion::GetTotalCodeWords() -{ - return m_totalCodeWords; -} -FX_INT32 CBC_QRCoderVersion::GetDimensionForVersion() -{ - return 17 + 4 * m_versionNumber; -} -CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel) -{ - return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()]; -} -CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e) -{ - if((dimension % 4) != 1) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qcv; -} -CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e) -{ - FX_INT32 bestDifference = FXSYS_IntMax; - FX_INT32 bestVersion = 0; - for (FX_INT32 i = 0; i < 34; i++) { - FX_INT32 targetVersion = VERSION_DECODE_INFO[i]; - if(targetVersion == versionBits) { - CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qcv; - } - FX_INT32 bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(versionBits, targetVersion); - if(bitsDifference < bestDifference) { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - if(bestDifference <= 3) { - CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qcv; - } - return NULL; -} -CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(FX_INT32 &e) -{ - FX_INT32 dimension = GetDimensionForVersion(); - CBC_CommonBitMatrix* bitMatrix = FX_NEW CBC_CommonBitMatrix(); - bitMatrix->Init(dimension); - bitMatrix->SetRegion(0, 0 , 9, 9, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - bitMatrix->SetRegion(0, dimension - 8, 9, 8, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 max = m_alignmentPatternCenters.GetSize(); - for (FX_INT32 x = 0; x < max; x++) { - FX_INT32 i = m_alignmentPatternCenters[x] - 2; - for (FX_INT32 y = 0; y < max; y++) { - if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { - continue; - } - bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - } - bitMatrix->SetRegion(6, 9, 1, dimension - 17, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - bitMatrix->SetRegion(9, 6, dimension - 17, 1, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if (m_versionNumber > 6) { - bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - bitMatrix->SetRegion(0, dimension - 11, 6, 3, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return bitMatrix; -} -CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e) -{ - if(VERSION->GetSize() == 0) { - VERSION->Add(FX_NEW CBC_QRCoderVersion(1, - FX_NEW CBC_QRCoderECBlocks(7, FX_NEW CBC_QRCoderECB(1, 19)), - FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 16)), - FX_NEW CBC_QRCoderECBlocks(13, FX_NEW CBC_QRCoderECB(1, 13)), - FX_NEW CBC_QRCoderECBlocks(17, FX_NEW CBC_QRCoderECB(1, 9)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(2, - FX_NEW CBC_QRCoderECBlocks(10, FX_NEW CBC_QRCoderECB(1, 34)), - FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(1, 28)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(1, 22)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(3, - FX_NEW CBC_QRCoderECBlocks(15, FX_NEW CBC_QRCoderECB(1, 55)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 44)), - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 17)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(4, - FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(1, 80)), - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 32)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(2, 24)), - FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 9)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(5, - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(1, 108)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 43)), - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 15), - FX_NEW CBC_QRCoderECB(2, 16)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 11), - FX_NEW CBC_QRCoderECB(2, 12)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(6, - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68)), - FX_NEW CBC_QRCoderECBlocks(16, FX_NEW CBC_QRCoderECB(4, 27)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 19)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 15)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(7, - FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(2, 78)), - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(4, 31)), - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 14), - FX_NEW CBC_QRCoderECB(4, 15)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 13), - FX_NEW CBC_QRCoderECB(1, 14)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(8, - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 97)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(2, 38), - FX_NEW CBC_QRCoderECB(2, 39)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(4, 18), - FX_NEW CBC_QRCoderECB(2, 19)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 14), - FX_NEW CBC_QRCoderECB(2, 15)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(9, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 116)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(3, 36), - FX_NEW CBC_QRCoderECB(2, 37)), - FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 16), - FX_NEW CBC_QRCoderECB(4, 17)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 12), - FX_NEW CBC_QRCoderECB(4, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(10, - FX_NEW CBC_QRCoderECBlocks(18, FX_NEW CBC_QRCoderECB(2, 68), - FX_NEW CBC_QRCoderECB(2, 69)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 43), - FX_NEW CBC_QRCoderECB(1, 44)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(6, 19), - FX_NEW CBC_QRCoderECB(2, 20)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 15), - FX_NEW CBC_QRCoderECB(2, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(11, - FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(4, 81)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 50), - FX_NEW CBC_QRCoderECB(4, 51)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 22), - FX_NEW CBC_QRCoderECB(4, 23)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(3, 12), - FX_NEW CBC_QRCoderECB(8, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(12, - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(2, 92), - FX_NEW CBC_QRCoderECB(2, 93)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(6, 36), - FX_NEW CBC_QRCoderECB(2, 37)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 20), - FX_NEW CBC_QRCoderECB(6, 21)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 14), - FX_NEW CBC_QRCoderECB(4, 15)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(13, - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(4, 107)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(8, 37), - FX_NEW CBC_QRCoderECB(1, 38)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(8, 20), - FX_NEW CBC_QRCoderECB(4, 21)), - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(12, 11), - FX_NEW CBC_QRCoderECB(4, 12)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(14, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 115), - FX_NEW CBC_QRCoderECB(1, 116)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(4, 40), - FX_NEW CBC_QRCoderECB(5, 41)), - FX_NEW CBC_QRCoderECBlocks(20, FX_NEW CBC_QRCoderECB(11, 16), - FX_NEW CBC_QRCoderECB(5, 17)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), - FX_NEW CBC_QRCoderECB(5, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(15, - FX_NEW CBC_QRCoderECBlocks(22, FX_NEW CBC_QRCoderECB(5, 87), - FX_NEW CBC_QRCoderECB(1, 88)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 41), - FX_NEW CBC_QRCoderECB(5, 42)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 24), - FX_NEW CBC_QRCoderECB(7, 25)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(11, 12), - FX_NEW CBC_QRCoderECB(7, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(16, - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(5, 98), - FX_NEW CBC_QRCoderECB(1, 99)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(7, 45), - FX_NEW CBC_QRCoderECB(3, 46)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(15, 19), - FX_NEW CBC_QRCoderECB(2, 20)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 15), - FX_NEW CBC_QRCoderECB(13, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(17, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 107), - FX_NEW CBC_QRCoderECB(5, 108)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), - FX_NEW CBC_QRCoderECB(1, 47)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(1, 22), - FX_NEW CBC_QRCoderECB(15, 23)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), - FX_NEW CBC_QRCoderECB(17, 15)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(18, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 120), - FX_NEW CBC_QRCoderECB(1, 121)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 43), - FX_NEW CBC_QRCoderECB(4, 44)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), - FX_NEW CBC_QRCoderECB(1, 23)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 14), - FX_NEW CBC_QRCoderECB(19, 15)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(19, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 113), - FX_NEW CBC_QRCoderECB(4, 114)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 44), - FX_NEW CBC_QRCoderECB(11, 45)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 21), - FX_NEW CBC_QRCoderECB(4, 22)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(9, 13), - FX_NEW CBC_QRCoderECB(16, 14)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(20, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 107), - FX_NEW CBC_QRCoderECB(5, 108)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(3, 41), - FX_NEW CBC_QRCoderECB(13, 42)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), - FX_NEW CBC_QRCoderECB(5, 25)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(15, 15), - FX_NEW CBC_QRCoderECB(10, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(21, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 116), - FX_NEW CBC_QRCoderECB(4, 117)), - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(17, 42)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 22), - FX_NEW CBC_QRCoderECB(6, 23)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 16), - FX_NEW CBC_QRCoderECB(6, 17)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(22, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 111), - FX_NEW CBC_QRCoderECB(7, 112)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(17, 46)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), - FX_NEW CBC_QRCoderECB(16, 25)), - FX_NEW CBC_QRCoderECBlocks(24, FX_NEW CBC_QRCoderECB(34, 13)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(23, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 121), - FX_NEW CBC_QRCoderECB(5, 122)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(4, 47), - FX_NEW CBC_QRCoderECB(14, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), - FX_NEW CBC_QRCoderECB(14, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(16, 15), - FX_NEW CBC_QRCoderECB(14, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(24, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 117), - FX_NEW CBC_QRCoderECB(4, 118)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 45), - FX_NEW CBC_QRCoderECB(14, 46)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 24), - FX_NEW CBC_QRCoderECB(16, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(30, 16), - FX_NEW CBC_QRCoderECB(2, 17)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(25, - FX_NEW CBC_QRCoderECBlocks(26, FX_NEW CBC_QRCoderECB(8, 106), - FX_NEW CBC_QRCoderECB(4, 107)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(8, 47), - FX_NEW CBC_QRCoderECB(13, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 24), - FX_NEW CBC_QRCoderECB(22, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), - FX_NEW CBC_QRCoderECB(13, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(26, - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 114), - FX_NEW CBC_QRCoderECB(2, 115)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 46), - FX_NEW CBC_QRCoderECB(4, 47)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(28, 22), - FX_NEW CBC_QRCoderECB(6, 23)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(33, 16), - FX_NEW CBC_QRCoderECB(4, 17)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(27, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 122), - FX_NEW CBC_QRCoderECB(4, 123)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(22, 45), - FX_NEW CBC_QRCoderECB(3, 46)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(8, 23), - FX_NEW CBC_QRCoderECB(26, 24)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 15), - FX_NEW CBC_QRCoderECB(28, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(28, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(3, 117), - FX_NEW CBC_QRCoderECB(10, 118)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(3, 45), - FX_NEW CBC_QRCoderECB(23, 46)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 24), - FX_NEW CBC_QRCoderECB(31, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), - FX_NEW CBC_QRCoderECB(31, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(29, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(7, 116), - FX_NEW CBC_QRCoderECB(7, 117)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(21, 45), - FX_NEW CBC_QRCoderECB(7, 46)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(1, 23), - FX_NEW CBC_QRCoderECB(37, 24)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), - FX_NEW CBC_QRCoderECB(26, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(30, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(5, 115), - FX_NEW CBC_QRCoderECB(10, 116)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(19, 47), - FX_NEW CBC_QRCoderECB(10, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(15, 24), - FX_NEW CBC_QRCoderECB(25, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), - FX_NEW CBC_QRCoderECB(25, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(31, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), - FX_NEW CBC_QRCoderECB(3, 116)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(2, 46), - FX_NEW CBC_QRCoderECB(29, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 24), - FX_NEW CBC_QRCoderECB(1, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(23, 15), - FX_NEW CBC_QRCoderECB(28, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(32, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(10, 46), - FX_NEW CBC_QRCoderECB(23, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 24), - FX_NEW CBC_QRCoderECB(35, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 15), - FX_NEW CBC_QRCoderECB(35, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(33, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 115), - FX_NEW CBC_QRCoderECB(1, 116)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), - FX_NEW CBC_QRCoderECB(21, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(29, 24), - FX_NEW CBC_QRCoderECB(19, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(11, 15), - FX_NEW CBC_QRCoderECB(46, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(34, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(13, 115), - FX_NEW CBC_QRCoderECB(6, 116)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(14, 46), - FX_NEW CBC_QRCoderECB(23, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(44, 24), - FX_NEW CBC_QRCoderECB(7, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(59, 16), - FX_NEW CBC_QRCoderECB(1, 17)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(35, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(12, 121), - FX_NEW CBC_QRCoderECB(7, 122)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(12, 47), - FX_NEW CBC_QRCoderECB(26, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(39, 24), - FX_NEW CBC_QRCoderECB(14, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(22, 15), - FX_NEW CBC_QRCoderECB(41, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(36, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(6, 121), - FX_NEW CBC_QRCoderECB(14, 122)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(6, 47), - FX_NEW CBC_QRCoderECB(34, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(46, 24), - FX_NEW CBC_QRCoderECB(10, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(2, 15), - FX_NEW CBC_QRCoderECB(64, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(37, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(17, 122), - FX_NEW CBC_QRCoderECB(4, 123)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(29, 46), - FX_NEW CBC_QRCoderECB(14, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(49, 24), - FX_NEW CBC_QRCoderECB(10, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(24, 15), - FX_NEW CBC_QRCoderECB(46, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(38, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(4, 122), - FX_NEW CBC_QRCoderECB(18, 123)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(13, 46), - FX_NEW CBC_QRCoderECB(32, 47)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(48, 24), - FX_NEW CBC_QRCoderECB(14, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(42, 15), - FX_NEW CBC_QRCoderECB(32, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(39, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 117), - FX_NEW CBC_QRCoderECB(4, 118)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(40, 47), - FX_NEW CBC_QRCoderECB(7, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(43, 24), - FX_NEW CBC_QRCoderECB(22, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(10, 15), - FX_NEW CBC_QRCoderECB(67, 16)))); - VERSION->Add(FX_NEW CBC_QRCoderVersion(40, - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(19, 118), - FX_NEW CBC_QRCoderECB(6, 119)), - FX_NEW CBC_QRCoderECBlocks(28, FX_NEW CBC_QRCoderECB(18, 47), - FX_NEW CBC_QRCoderECB(31, 48)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(34, 24), - FX_NEW CBC_QRCoderECB(34, 25)), - FX_NEW CBC_QRCoderECBlocks(30, FX_NEW CBC_QRCoderECB(20, 15), - FX_NEW CBC_QRCoderECB(61, 16)))); - } - if(versionNumber < 1 || versionNumber > 40) { - e = BCExceptionIllegalArgument; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1]; -} -void CBC_QRCoderVersion::Destroy() -{ - FX_INT32 i; - for(i = 0; i < VERSION->GetSize(); i++) { - delete ( (CBC_QRCoderVersion*)(*VERSION)[i] ); - } -} diff --git a/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp b/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp deleted file mode 100644 index 2e82c1881f..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRDataBlock.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderECBlocks.h" -#include "include/BC_QRCoderECB.h" -#include "include/BC_QRDataBlock.h" -#include "include/BC_QRCoderVersion.h" -CBC_QRDataBlock::CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords) - : m_numDataCodewords(numDataCodewords) - , m_codewords(codewords) -{ -} -CBC_QRDataBlock::~CBC_QRDataBlock() -{ - if(m_codewords != NULL) { - delete m_codewords; - m_codewords = NULL; - } -} -FX_INT32 CBC_QRDataBlock::GetNumDataCodewords() -{ - return m_numDataCodewords; -} -CFX_ByteArray *CBC_QRDataBlock::GetCodewords() -{ - return m_codewords; -} -CFX_PtrArray *CBC_QRDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e) -{ - if(rawCodewords->GetSize() != version->GetTotalCodeWords()) { - e = BCExceptionIllegalArgument; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_QRCoderECBlocks *ecBlocks = version->GetECBlocksForLevel(ecLevel); - FX_INT32 totalBlocks = 0; - CFX_PtrArray* ecBlockArray = ecBlocks->GetECBlocks(); - FX_INT32 i = 0; - for(i = 0; i < ecBlockArray->GetSize(); i++) { - totalBlocks += ((CBC_QRCoderECB*)(*ecBlockArray)[i])->GetCount(); - } - CFX_PtrArray *datablock = FX_NEW CFX_PtrArray(); - datablock->SetSize(totalBlocks); - CBC_AutoPtr result(datablock); - FX_INT32 numResultBlocks = 0; - for(FX_INT32 j = 0; j < ecBlockArray->GetSize(); j++) { - CBC_QRCoderECB *ecBlock = (CBC_QRCoderECB*)(*ecBlockArray)[j]; - for(FX_INT32 k = 0; k < ecBlock->GetCount(); k++) { - FX_INT32 numDataCodewords = ecBlock->GetDataCodeWords(); - FX_INT32 numBlockCodewords = ecBlocks->GetECCodeWordsPerBlock() + numDataCodewords; - CFX_ByteArray *bytearray = FX_NEW CFX_ByteArray(); - bytearray->SetSize(numBlockCodewords); - (*result)[numResultBlocks++] = FX_NEW CBC_QRDataBlock(numDataCodewords, bytearray); - } - } - FX_INT32 shorterBlocksTotalCodewords = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); - FX_INT32 longerBlocksStartAt = result->GetSize() - 1; - while(longerBlocksStartAt >= 0) { - FX_INT32 numCodewords = ((CBC_QRDataBlock*)(*result)[longerBlocksStartAt])->m_codewords->GetSize(); - if(numCodewords == shorterBlocksTotalCodewords) { - break; - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - FX_INT32 shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks->GetECCodeWordsPerBlock(); - FX_INT32 rawCodewordsOffset = 0; - FX_INT32 x = 0; - for(FX_INT32 k = 0; k < shorterBlocksNumDataCodewords; k++) { - for(x = 0; x < numResultBlocks; x++) { - (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[k] = (*rawCodewords)[rawCodewordsOffset++]; - } - } - for(x = longerBlocksStartAt; x < numResultBlocks; x++) { - (*(((CBC_QRDataBlock*)(*result)[x])->m_codewords))[shorterBlocksNumDataCodewords] = (*rawCodewords)[rawCodewordsOffset++]; - } - FX_INT32 max = ((CBC_QRDataBlock*)(*result)[0])->m_codewords->GetSize(); - for(i = shorterBlocksNumDataCodewords; i < max; i++) { - for(FX_INT32 y = 0; y < numResultBlocks; y++) { - FX_INT32 iOffset = y < longerBlocksStartAt ? i : i + 1; - (*(((CBC_QRDataBlock*)(*result)[y])->m_codewords))[iOffset] = (*rawCodewords)[rawCodewordsOffset++]; - } - } - return result.release(); -} diff --git a/xfa/src/fxbarcode/src/BC_QRDataMask.cpp b/xfa/src/fxbarcode/src/BC_QRDataMask.cpp deleted file mode 100644 index 1946ca9e09..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRDataMask.cpp +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRDataMask.h" -static FX_INT32 N_DATA_MASKS = 0; -CFX_PtrArray* CBC_QRDataMask::DATA_MASKS = NULL; -void CBC_QRDataMask::Initialize() -{ - DATA_MASKS = FX_NEW CFX_PtrArray(); - N_DATA_MASKS = BuildDataMasks(); -} -void CBC_QRDataMask::Finalize() -{ - Destroy(); - delete DATA_MASKS; -} -void CBC_QRDataMask::Destroy() -{ - FX_INT32 i; - for(i = 0; i < N_DATA_MASKS; i++) { - CBC_QRDataMask* p = (CBC_QRDataMask*)(*DATA_MASKS)[i]; - if (p) { - delete p; - } - } -} -void CBC_QRDataMask::UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension) -{ - for(FX_INT32 i = 0; i < dimension; i++) { - for(FX_INT32 j = 0; j < dimension; j++) { - if(IsMasked(i, j)) { - bits->Flip(j, i); - } - } - } -} -CBC_QRDataMask* CBC_QRDataMask::ForReference(FX_INT32 reference, FX_INT32 &e) -{ - if(reference < 0 || reference > 7) { - e = BCExceptionReferenceMustBeBetween0And7; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return (CBC_QRDataMask*)(*DATA_MASKS)[reference]; -} -class DataMask000 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return ((x + y) % 2) == 0; - } -}; -class DataMask001 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return (x % 2) == 0; - } -}; -class DataMask010 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return y % 3 == 0; - } -}; -class DataMask011 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return (x + y) % 3 == 0; - } -}; -class DataMask100 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return (((x >> 1) + (y / 3)) % 2) == 0; - } -}; -class DataMask101 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - size_t temp = x * y; - return (temp % 2) + (temp % 3) == 0; - } -}; -class DataMask110 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - size_t temp = x * y; - return (((temp % 2) + (temp % 3)) % 2) == 0; - } -}; -class DataMask111 : public CBC_QRDataMask -{ -public: - FX_BOOL IsMasked(FX_INT32 x, FX_INT32 y) - { - return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0; - } -}; -FX_INT32 CBC_QRDataMask::BuildDataMasks() -{ - DATA_MASKS->Add(FX_NEW DataMask000); - DATA_MASKS->Add(FX_NEW DataMask001); - DATA_MASKS->Add(FX_NEW DataMask010); - DATA_MASKS->Add(FX_NEW DataMask011); - DATA_MASKS->Add(FX_NEW DataMask100); - DATA_MASKS->Add(FX_NEW DataMask101); - DATA_MASKS->Add(FX_NEW DataMask110); - DATA_MASKS->Add(FX_NEW DataMask111); - return DATA_MASKS->GetSize(); -} -CBC_QRDataMask::CBC_QRDataMask() -{ -} -CBC_QRDataMask::~CBC_QRDataMask() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp b/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp deleted file mode 100644 index d51536d09e..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRDecodedBitStreamParser.cpp +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_QRCoderMode.h" -#include "include/BC_CommonBitSource.h" -#include "include/BC_CommonECI.h" -#include "include/BC_QRDecodedBitStreamParser.h" -#include "include/BC_CommonCharacterSetECI.h" -#include "include/BC_CommonDecoderResult.h" -#include "include/BC_UtilCodingConvert.h" -FX_LPCSTR CBC_QRDecodedBitStreamParser::UTF_8 = "utf8"; -const FX_CHAR CBC_QRDecodedBitStreamParser::ALPHANUMERIC_CHARS[45] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ' ', '$', '%', '*', '+', '-', '.', '/', ':' -}; -CBC_QRDecodedBitStreamParser::CBC_QRDecodedBitStreamParser() -{ -} -CBC_QRDecodedBitStreamParser::~CBC_QRDecodedBitStreamParser() -{ -} -CBC_CommonDecoderResult* CBC_QRDecodedBitStreamParser::Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, - CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e) -{ - CBC_CommonBitSource bits(bytes); - CFX_ByteString result; - CBC_CommonCharacterSetECI* currentCharacterSetECI = NULL; - FX_BOOL fc1Infact = FALSE; - CFX_Int32Array byteSegments; - CBC_QRCoderMode* mode = NULL; - do { - if(bits.Available() < 4) { - mode = CBC_QRCoderMode::sTERMINATOR; - } else { - FX_INT32 iTemp1 = bits.ReadBits(4, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - mode = CBC_QRCoderMode::ForBits(iTemp1, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if(mode == NULL) { - e = BCExceptionUnSupportMode; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - } - if(!(mode == CBC_QRCoderMode::sTERMINATOR)) { - if(mode == CBC_QRCoderMode::sFNC1_FIRST_POSITION || mode == CBC_QRCoderMode::sFNC1_SECOND_POSITION) { - fc1Infact = TRUE; - } else if(mode == CBC_QRCoderMode::sSTRUCTURED_APPEND) { - bits.ReadBits(16, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else if(mode == CBC_QRCoderMode::sECI) { - FX_INT32 value = ParseECIValue(&bits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - currentCharacterSetECI = CBC_CommonCharacterSetECI::GetCharacterSetECIByValue(value); - } else { - if(mode == CBC_QRCoderMode::sGBK) { - bits.ReadBits(4, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_INT32 numBits = mode->GetCharacterCountBits(version, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 count = bits.ReadBits(numBits, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - if(mode == CBC_QRCoderMode::sNUMERIC) { - DecodeNumericSegment(&bits, result, count, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else if(mode == CBC_QRCoderMode::sALPHANUMERIC) { - DecodeAlphanumericSegment(&bits, result, count, fc1Infact, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else if(mode == CBC_QRCoderMode::sBYTE) { - DecodeByteSegment(&bits, result, count, currentCharacterSetECI, &byteSegments, byteModeDecode, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else if(mode == CBC_QRCoderMode::sGBK) { - DecodeGBKSegment(&bits, result, count, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else if(mode == CBC_QRCoderMode::sKANJI) { - DecodeKanjiSegment(&bits, result, count, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } else { - e = BCExceptionUnSupportMode; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - } - } - } while (!(mode == CBC_QRCoderMode::sTERMINATOR)); - CBC_CommonDecoderResult *tempCd = FX_NEW CBC_CommonDecoderResult(); - tempCd->Init(*bytes, result, byteSegments, ecLevel, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return tempCd; -} -void CBC_QRDecodedBitStreamParser::DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) -{ - CFX_ByteString buffer; - FX_INT32 offset = 0; - while (count > 0) { - FX_INT32 twoBytes = bits->ReadBits(13, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); - if (assembledTwoBytes <= 0x0095d) { - assembledTwoBytes += 0x0a1a1; - } else { - assembledTwoBytes += 0x0a6a1; - } - buffer += (FX_BYTE) (assembledTwoBytes >> 8); - buffer += (FX_BYTE) assembledTwoBytes; - count--; - } - CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); -} -void CBC_QRDecodedBitStreamParser::DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) -{ - CFX_ByteString buffer; - while (count > 0) { - FX_INT32 twoBytes = bits->ReadBits(13, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - FX_INT32 assembledTwoBytes = ((twoBytes / 0x0c0) << 8) | (twoBytes % 0x0c0); - if (assembledTwoBytes <= 0x01f00) { - assembledTwoBytes += 0x08140; - } else { - assembledTwoBytes += 0x0c140; - } - buffer += (FX_BYTE) (assembledTwoBytes >> 8); - buffer += (FX_BYTE) assembledTwoBytes; - count--; - } - CBC_UtilCodingConvert::LocaleToUtf8(buffer, result); -} -void CBC_QRDecodedBitStreamParser::DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, - CBC_CommonCharacterSetECI *currentCharacterSetECI, - CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e) -{ - if(count < 0) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - if((count << 3) > bits->Available()) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_BYTE *readBytes = FX_Alloc(FX_BYTE, count); - FXSYS_memset32(readBytes, 0x00, count); - for(FX_INT32 i = 0; i < count; i++) { - readBytes[i] = (FX_BYTE) bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - CFX_ByteString bs(readBytes, count); - result += bs; - FX_Free(readBytes); -} -void CBC_QRDecodedBitStreamParser::DecodeAlphanumericSegment(CBC_CommonBitSource* bits, - CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e) -{ - FX_INT32 start = result.GetLength(); - while(count > 1) { - FX_INT32 nextTwoCharsBits = bits->ReadBits(11, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits / 45]); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[nextTwoCharsBits % 45]); - count -= 2; - } - if(count == 1) { - FX_INT32 itemp = bits->ReadBits(6, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[itemp]); - } - if(fac1InEffect) { - for(FX_INT32 i = start; i < result.GetLength(); i++) { - if(result[i] == '%') { - if((i < result.GetLength() - 1) && result[i + 1] == '%') { - result.Delete(i + 1, 1); - } else { - result.SetAt(i, (FX_CHAR)0x1d); - } - } - } - } -} -void CBC_QRDecodedBitStreamParser::DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e) -{ - while(count >= 3) { - FX_INT32 threeDigitsBits = bits->ReadBits(10, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(threeDigitsBits >= 1000) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits / 100]); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[threeDigitsBits % 10]); - count -= 3; - } - if(count == 2) { - FX_INT32 twoDigitBits = bits->ReadBits(7, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(twoDigitBits >= 100) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits / 10]); - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[twoDigitBits % 10]); - } else if(count == 1) { - FX_INT32 digitBits = bits->ReadBits(4, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(digitBits >= 10) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - BC_FX_ByteString_Append(result, 1, ALPHANUMERIC_CHARS[digitBits]); - } -} -const CFX_ByteString CBC_QRDecodedBitStreamParser::GuessEncoding(CFX_ByteArray *bytes) -{ - return *UTF_8; -} -FX_INT32 CBC_QRDecodedBitStreamParser::ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e) -{ - FX_INT32 firstByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - if((firstByte & 0x80) == 0) { - return firstByte & 0x7f; - } else if((firstByte & 0xc0) == 0x80) { - FX_INT32 secondByte = bits->ReadBits(8, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - return ((firstByte & 0x3f) << 8) | secondByte; - } else if((firstByte & 0xe0) == 0xc0) { - FX_INT32 secondThirdByte = bits->ReadBits(16, e); - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - return ((firstByte & 0x1f) << 16) | secondThirdByte; - } - e = BCExceptionBadECI; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - return 0; -} diff --git a/xfa/src/fxbarcode/src/BC_QRDetector.cpp b/xfa/src/fxbarcode/src/BC_QRDetector.cpp deleted file mode 100644 index 5b3910b413..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRDetector.cpp +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRFinderPattern.h" -#include "include/BC_QRCoderVersion.h" -#include "include/BC_FinderPatternInfo.h" -#include "include/BC_QRGridSampler.h" -#include "include/BC_QRAlignmentPatternFinder.h" -#include "include/BC_QRFinderPatternFinder.h" -#include "include/BC_QRDetectorResult.h" -#include "include/BC_QRDetector.h" -CBC_QRDetector::CBC_QRDetector(CBC_CommonBitMatrix *image): m_image(image) -{ -} -CBC_QRDetector::~CBC_QRDetector() -{ -} -CBC_QRDetectorResult *CBC_QRDetector::Detect(FX_INT32 hints, FX_INT32 &e) -{ - CBC_QRFinderPatternFinder finder(m_image); - CBC_QRFinderPatternInfo* qpi = finder.Find(hints, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr info(qpi); - CBC_QRDetectorResult* qdr = ProcessFinderPatternInfo(info.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qdr; -} -CBC_QRDetectorResult* CBC_QRDetector::ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e) -{ - CBC_AutoPtr topLeft(info->GetTopLeft()); - CBC_AutoPtr topRight(info->GetTopRight()); - CBC_AutoPtr bottomLeft(info->GetBottomLeft()); - FX_FLOAT moduleSize = CalculateModuleSize(topLeft.get(), topRight.get(), bottomLeft.get()); - if(moduleSize < 1.0f) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_INT32 dimension = ComputeDimension(topLeft.get(), topRight.get(), bottomLeft.get(), moduleSize, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_QRCoderVersion *provisionalVersion = CBC_QRCoderVersion::GetProvisionalVersionForDimension(dimension, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 modulesBetweenFPCenters = provisionalVersion->GetDimensionForVersion() - 7; - CBC_QRAlignmentPattern * alignmentPattern = NULL; - if(provisionalVersion->GetAlignmentPatternCenters()->GetSize() > 0) { - FX_FLOAT bottomRightX = topRight->GetX() - topLeft->GetX() + bottomLeft->GetX(); - FX_FLOAT bottomRightY = topRight->GetY() - topLeft->GetY() + bottomLeft->GetY(); - FX_FLOAT correctionToTopLeft = 1.0f - 3.0f / (FX_FLOAT) modulesBetweenFPCenters; - FX_FLOAT xtemp = (topLeft->GetX() + correctionToTopLeft * (bottomRightX - topLeft->GetX())); - FX_INT32 estAlignmentX = (FX_INT32)xtemp ; - FX_FLOAT ytemp = (topLeft->GetY() + correctionToTopLeft * (bottomRightY - topLeft->GetY())); - FX_INT32 estAlignmentY = (FX_INT32)ytemp; - for(FX_INT32 i = 4; i <= 16; i <<= 1) { - CBC_QRAlignmentPattern *temp = FindAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, (FX_FLOAT) i, e); - alignmentPattern = temp; - break; - } - } - CBC_CommonBitMatrix *bits = SampleGrid(m_image, topLeft.get(), topRight.get(), bottomLeft.get(), (CBC_ResultPoint*)(alignmentPattern), dimension, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CFX_PtrArray *points = FX_NEW CFX_PtrArray; - if(alignmentPattern == NULL) { - points->Add(bottomLeft.release()); - points->Add(topLeft.release()); - points->Add(topRight.release()); - } else { - points->Add(bottomLeft.release()); - points->Add(topLeft.release()); - points->Add(topRight.release()); - points->Add(alignmentPattern); - } - return FX_NEW CBC_QRDetectorResult(bits, points); -} -CBC_CommonBitMatrix *CBC_QRDetector::SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, - CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, - FX_INT32 dimension, FX_INT32 &e) -{ - FX_FLOAT dimMinusThree = (FX_FLOAT) dimension - 3.5f; - FX_FLOAT bottomRightX; - FX_FLOAT bottomRightY; - FX_FLOAT sourceBottomRightX; - FX_FLOAT sourceBottomRightY; - if (alignmentPattern != NULL) { - bottomRightX = alignmentPattern->GetX(); - bottomRightY = alignmentPattern->GetY(); - sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f; - } else { - bottomRightX = (topRight->GetX() - topLeft->GetX()) + bottomLeft->GetX(); - bottomRightY = (topRight->GetY() - topLeft->GetY()) + bottomLeft->GetY(); - sourceBottomRightX = sourceBottomRightY = dimMinusThree; - } - CBC_QRGridSampler &sampler = CBC_QRGridSampler::GetInstance(); - CBC_CommonBitMatrix* cbm = sampler.SampleGrid(image, - dimension, dimension, - 3.5f, - 3.5f, - dimMinusThree, - 3.5f, - sourceBottomRightX, - sourceBottomRightY, - 3.5f, - dimMinusThree, - topLeft->GetX(), - topLeft->GetY(), - topRight->GetX(), - topRight->GetY(), - bottomRightX, - bottomRightY, - bottomLeft->GetX(), - bottomLeft->GetY(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return cbm; -} -FX_INT32 CBC_QRDetector::ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, - CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e) -{ - FX_INT32 tltrCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, topRight) / moduleSize); - FX_INT32 tlblCentersDimension = Round(CBC_QRFinderPatternFinder::Distance(topLeft, bottomLeft) / moduleSize); - FX_INT32 dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; - switch(dimension & 0x03) { - case 0: - dimension++; - break; - case 2: - dimension--; - break; - case 3: { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - } - return dimension; -} -FX_FLOAT CBC_QRDetector::CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft) -{ - return (CalculateModuleSizeOneWay(topLeft, topRight) + CalculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f; -} -FX_FLOAT CBC_QRDetector::CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern) -{ - FX_FLOAT moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) pattern->GetX(), - (FX_INT32) pattern->GetY(), - (FX_INT32) otherPattern->GetX(), - (FX_INT32) otherPattern->GetY()); - FX_FLOAT moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays((FX_INT32) otherPattern->GetX(), - (FX_INT32) otherPattern->GetY(), - (FX_INT32) pattern->GetX(), - (FX_INT32) pattern->GetY()); - if (FXSYS_isnan(moduleSizeEst1)) { - return moduleSizeEst2; - } - if (FXSYS_isnan(moduleSizeEst2)) { - return moduleSizeEst1; - } - return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; -} -FX_INT32 CBC_QRDetector::Round(FX_FLOAT d) -{ - return (FX_INT32)(d + 0.5f); -} -FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) -{ - FX_FLOAT result = SizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - FX_INT32 otherToX = fromX - (toX - fromX); - if (otherToX < 0) { - otherToX = -1; - } else if (otherToX >= m_image->GetWidth()) { - otherToX = m_image->GetWidth(); - } - FX_INT32 otherToY = fromY - (toY - fromY); - if (otherToY < 0) { - otherToY = -1; - } else if (otherToY >= m_image->GetHeight()) { - otherToY = m_image->GetHeight(); - } - result += SizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - return result - 1.0f; -} -FX_FLOAT CBC_QRDetector::SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY) -{ - FX_BOOL steep = FXSYS_abs(toY - fromY) > FXSYS_abs(toX - fromX); - if (steep) { - FX_INT32 temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - FX_INT32 dx = FXSYS_abs(toX - fromX); - FX_INT32 dy = FXSYS_abs(toY - fromY); - FX_INT32 error = -dx >> 1; - FX_INT32 ystep = fromY < toY ? 1 : -1; - FX_INT32 xstep = fromX < toX ? 1 : -1; - FX_INT32 state = 0; - for (FX_INT32 x = fromX, y = fromY; x != toX; x += xstep) { - FX_INT32 realX = steep ? y : x; - FX_INT32 realY = steep ? x : y; - if (state == 1) { - if (m_image->Get(realX, realY)) { - state++; - } - } else { - if (!m_image->Get(realX, realY)) { - state++; - } - } - if (state == 3) { - FX_INT32 diffX = x - fromX; - FX_INT32 diffY = y - fromY; - return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); - } - error += dy; - if (error > 0) { - y += ystep; - error -= dx; - } - } - FX_INT32 diffX = toX - fromX; - FX_INT32 diffY = toY - fromY; - return (FX_FLOAT) sqrt((double) (diffX * diffX + diffY * diffY)); -} -CBC_QRAlignmentPattern *CBC_QRDetector::FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, - FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e) -{ - FX_INT32 allowance = (FX_INT32) (allowanceFactor * overallEstModuleSize); - FX_INT32 alignmentAreaLeftX = FX_MAX(0, estAlignmentX - allowance); - FX_INT32 alignmentAreaRightX = FX_MIN(m_image->GetWidth() - 1, estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_INT32 alignmentAreaTopY = FX_MAX(0, estAlignmentY - allowance); - FX_INT32 alignmentAreaBottomY = FX_MIN(m_image->GetHeight() - 1, estAlignmentY + allowance); - CBC_QRAlignmentPatternFinder alignmentFinder(m_image, - alignmentAreaLeftX, - alignmentAreaTopY, - alignmentAreaRightX - alignmentAreaLeftX, - alignmentAreaBottomY - alignmentAreaTopY, - overallEstModuleSize); - CBC_QRAlignmentPattern *qap = alignmentFinder.Find(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return qap; -} diff --git a/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp b/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp deleted file mode 100644 index 44f4714a92..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRDetectorResult.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRDetectorResult.h" -CBC_QRDetectorResult::CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points): - m_bits(bits), m_points(points) -{ -} -CBC_QRDetectorResult::~CBC_QRDetectorResult() -{ - for(FX_INT32 i = 0; i < m_points->GetSize(); i++) { - delete (CBC_ResultPoint*) (*m_points)[i]; - } - m_points->RemoveAll(); - delete m_points; - m_points = NULL; - if(m_bits != NULL) { - delete m_bits; - } - m_bits = NULL; -} -CBC_CommonBitMatrix* CBC_QRDetectorResult::GetBits() -{ - return m_bits; -} -CFX_PtrArray *CBC_QRDetectorResult::GetPoints() -{ - return m_points; -} diff --git a/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp b/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp deleted file mode 100644 index 8dd30f217a..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRFinderPattern.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRFinderPattern.h" -CBC_QRFinderPattern::CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize): - CBC_ResultPoint(x, posY), - m_estimatedModuleSize(estimatedModuleSize), m_count(1) -{ -} -CBC_QRFinderPattern::~CBC_QRFinderPattern() -{ - m_count = 0; - m_x = 0.0f; - m_y = 0.0f; - m_estimatedModuleSize = 0.0f; -} -CBC_QRFinderPattern *CBC_QRFinderPattern::Clone() -{ - CBC_QRFinderPattern *temp = FX_NEW CBC_QRFinderPattern(m_x, m_y, m_estimatedModuleSize); - temp->m_count = m_count; - return temp; -} -FX_FLOAT CBC_QRFinderPattern::GetEstimatedModuleSize() -{ - return m_estimatedModuleSize; -} -FX_INT32 CBC_QRFinderPattern::GetCount() -{ - return m_count; -} -void CBC_QRFinderPattern::IncrementCount() -{ - m_count++; -} -FX_BOOL CBC_QRFinderPattern::AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j) -{ - if((fabs(i - GetY()) <= moduleSize) && (fabs(j - GetX()) <= moduleSize)) { - FX_FLOAT moduleSizeDiff = fabs(moduleSize - m_estimatedModuleSize); - return (moduleSizeDiff <= 1.0f) || (moduleSizeDiff / m_estimatedModuleSize <= 1.0f); - } - return false; -} -FX_FLOAT CBC_QRFinderPattern::GetX() -{ - return m_x; -} -FX_FLOAT CBC_QRFinderPattern::GetY() -{ - return m_y; -} diff --git a/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp b/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp deleted file mode 100644 index 67d1a7b069..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRFinderPatternFinder.cpp +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -#include "include/BC_QRFinderPatternFinder.h" -#include "include/BC_FinderPatternInfo.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRFinderPattern.h" -const FX_INT32 CBC_QRFinderPatternFinder::CENTER_QUORUM = 2; -const FX_INT32 CBC_QRFinderPatternFinder::MIN_SKIP = 3; -const FX_INT32 CBC_QRFinderPatternFinder::MAX_MODULES = 57; -const FX_INT32 CBC_QRFinderPatternFinder::INTEGER_MATH_SHIFT = 8; -CBC_QRFinderPatternFinder::CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image) -{ - m_image = image; - m_crossCheckStateCount.SetSize(5); - m_hasSkipped = FALSE; -} -CBC_QRFinderPatternFinder::~CBC_QRFinderPatternFinder() -{ - for(FX_INT32 i = 0; i < m_possibleCenters.GetSize(); i++) { - delete (CBC_QRFinderPattern*)m_possibleCenters[i]; - } - m_possibleCenters.RemoveAll(); -} -class ClosestToAverageComparator -{ -private: - FX_FLOAT m_averageModuleSize; -public: - ClosestToAverageComparator(FX_FLOAT averageModuleSize) : m_averageModuleSize(averageModuleSize) - { - } - FX_INT32 operator()(FinderPattern *a, FinderPattern *b) - { - FX_FLOAT dA = (FX_FLOAT)fabs(a->GetEstimatedModuleSize() - m_averageModuleSize); - FX_FLOAT dB = (FX_FLOAT)fabs(b->GetEstimatedModuleSize() - m_averageModuleSize); - return dA < dB ? -1 : dA > dB ? 1 : 0; - } -}; -class CenterComparator -{ -public: - FX_INT32 operator()(FinderPattern *a, FinderPattern *b) - { - return b->GetCount() - a->GetCount(); - } -}; -CBC_CommonBitMatrix *CBC_QRFinderPatternFinder::GetImage() -{ - return m_image; -} -CFX_Int32Array &CBC_QRFinderPatternFinder::GetCrossCheckStateCount() -{ - m_crossCheckStateCount[0] = 0; - m_crossCheckStateCount[1] = 0; - m_crossCheckStateCount[2] = 0; - m_crossCheckStateCount[3] = 0; - m_crossCheckStateCount[4] = 0; - return m_crossCheckStateCount; -} -CFX_PtrArray *CBC_QRFinderPatternFinder::GetPossibleCenters() -{ - return &m_possibleCenters; -} -CBC_QRFinderPatternInfo* CBC_QRFinderPatternFinder::Find(FX_INT32 hint, FX_INT32 &e) -{ - FX_INT32 maxI = m_image->GetHeight(); - FX_INT32 maxJ = m_image->GetWidth(); - FX_INT32 iSkip = (3 * maxI) / (4 * MAX_MODULES); - if(iSkip < MIN_SKIP || 0) { - iSkip = MIN_SKIP; - } - FX_BOOL done = FALSE; - CFX_Int32Array stateCount; - stateCount.SetSize(5); - for(FX_INT32 i = iSkip - 1; i < maxI && !done; i += iSkip) { - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - FX_INT32 currentState = 0; - for(FX_INT32 j = 0; j < maxJ; j++) { - if(m_image->Get(j, i)) { - if((currentState & 1) == 1) { - currentState++; - } - stateCount[currentState]++; - } else { - if((currentState & 1) == 0) { - if(currentState == 4) { - if(FoundPatternCross(stateCount)) { - FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, j); - if(confirmed) { - iSkip = 2; - if(m_hasSkipped) { - done = HaveMultiplyConfirmedCenters(); - } else { - FX_INT32 rowSkip = FindRowSkip(); - if(rowSkip > stateCount[2]) { - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } else { - do { - j++; - } while (j < maxJ && !m_image->Get(j, i)); - j--; - } - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } else { - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } else { - stateCount[++currentState]++; - } - } else { - stateCount[currentState]++; - } - } - } - if(FoundPatternCross(stateCount)) { - FX_BOOL confirmed = HandlePossibleCenter(stateCount, i, maxJ); - if(confirmed) { - iSkip = stateCount[0]; - if(m_hasSkipped) { - done = HaveMultiplyConfirmedCenters(); - } - } - } - } - CFX_PtrArray* ptr = SelectBestpatterns(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr patternInfo(ptr); - OrderBestPatterns(patternInfo.get()); - return new CBC_QRFinderPatternInfo(patternInfo.get()); -} -void CBC_QRFinderPatternFinder::OrderBestPatterns(CFX_PtrArray *patterns) -{ - FX_FLOAT abDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[1]); - FX_FLOAT bcDistance = Distance((CBC_ResultPoint*)(*patterns)[1], (CBC_ResultPoint*)(*patterns)[2]); - FX_FLOAT acDistance = Distance((CBC_ResultPoint*)(*patterns)[0], (CBC_ResultPoint*)(*patterns)[2]); - CBC_QRFinderPattern *topLeft, *topRight, *bottomLeft; - if (bcDistance >= abDistance && bcDistance >= acDistance) { - topLeft = (CBC_QRFinderPattern *)(*patterns)[0]; - topRight = (CBC_QRFinderPattern *)(*patterns)[1]; - bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; - } else if (acDistance >= bcDistance && acDistance >= abDistance) { - topLeft = (CBC_QRFinderPattern *)(*patterns)[1]; - topRight = (CBC_QRFinderPattern *)(*patterns)[0]; - bottomLeft = (CBC_QRFinderPattern *)(*patterns)[2]; - } else { - topLeft = (CBC_QRFinderPattern *)(*patterns)[2]; - topRight = (CBC_QRFinderPattern *)(*patterns)[0]; - bottomLeft = (CBC_QRFinderPattern *)(*patterns)[1]; - } - if ((bottomLeft->GetY() - topLeft->GetY()) * (topRight->GetX() - topLeft->GetX()) < (bottomLeft->GetX() - - topLeft->GetX()) * (topRight->GetY() - topLeft->GetY())) { - CBC_QRFinderPattern* temp = topRight; - topRight = bottomLeft; - bottomLeft = temp; - } - (*patterns)[0] = bottomLeft; - (*patterns)[1] = topLeft; - (*patterns)[2] = topRight; -} -FX_FLOAT CBC_QRFinderPatternFinder::Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2) -{ - FX_FLOAT dx = point1->GetX() - point2->GetX(); - FX_FLOAT dy = point1->GetY() - point2->GetY(); - return (FX_FLOAT)FXSYS_sqrt(dx * dx + dy * dy); -} -FX_FLOAT CBC_QRFinderPatternFinder::CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end) -{ - return (FX_FLOAT)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; -} -FX_BOOL CBC_QRFinderPatternFinder::FoundPatternCross(const CFX_Int32Array &stateCount) -{ - FX_INT32 totalModuleSize = 0; - for (FX_INT32 i = 0; i < 5; i++) { - FX_INT32 count = stateCount[i]; - if (count == 0) { - return FALSE; - } - totalModuleSize += count; - } - if (totalModuleSize < 7) { - return FALSE; - } - FX_INT32 moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7; - FX_INT32 maxVariance = moduleSize / 2; - return FXSYS_abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance && - FXSYS_abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance && - FXSYS_abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance && - FXSYS_abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance && - FXSYS_abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; -} -FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, - FX_INT32 originalStateCountTotal) -{ - CBC_CommonBitMatrix *image = m_image; - FX_INT32 maxI = image->GetHeight(); - CFX_Int32Array &stateCount = GetCrossCheckStateCount(); - FX_INT32 i = startI; - while(i >= 0 && image->Get(centerJ, i)) { - stateCount[2]++; - i--; - } - if(i < 0) { - return FXSYS_nan(); - } - while(i >= 0 && !image->Get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - if(i < 0 || stateCount[1] > maxCount) { - return FXSYS_nan(); - } - while(i >= 0 && image->Get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if(stateCount[0] > maxCount) { - return FXSYS_nan(); - } - i = startI + 1; - while(i < maxI && image->Get(centerJ, i)) { - stateCount[2]++; - i++; - } - if(i == maxI) { - return FXSYS_nan(); - } - while (i < maxI && !image->Get(centerJ, i) && stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - if (i == maxI || stateCount[3] >= maxCount) { - return FXSYS_nan(); - } - while (i < maxI && image->Get(centerJ, i) && stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) { - return FXSYS_nan(); - } - FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return FXSYS_nan(); - } - return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : FXSYS_nan(); -} -FX_FLOAT CBC_QRFinderPatternFinder::CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 centerI, FX_INT32 maxCount, FX_INT32 originalStateCountTotal) -{ - CBC_CommonBitMatrix *image = m_image; - FX_INT32 maxJ = image->GetWidth(); - CFX_Int32Array &stateCount = GetCrossCheckStateCount(); - FX_INT32 j = startJ; - while (j >= 0 && image->Get(j, centerI)) { - stateCount[2]++; - j--; - } - if (j < 0) { - return FXSYS_nan(); - } - while (j >= 0 && !image->Get(j, centerI) && stateCount[1] <= maxCount) { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) { - return FXSYS_nan(); - } - while (j >= 0 && image->Get(j, centerI) && stateCount[0] <= maxCount) { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) { - return FXSYS_nan(); - } - j = startJ + 1; - while (j < maxJ && image->Get(j, centerI)) { - stateCount[2]++; - j++; - } - if (j == maxJ) { - return FXSYS_nan(); - } - while (j < maxJ && !image->Get(j, centerI) && stateCount[3] < maxCount) { - stateCount[3]++; - j++; - } - if (j == maxJ || stateCount[3] >= maxCount) { - return FXSYS_nan(); - } - while (j < maxJ && image->Get(j, centerI) && stateCount[4] < maxCount) { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) { - return FXSYS_nan(); - } - FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + - stateCount[2] + stateCount[3] + - stateCount[4]; - if (5 * FXSYS_abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return FXSYS_nan(); - } - return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j) : FXSYS_nan(); -} -FX_BOOL CBC_QRFinderPatternFinder::HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j) -{ - FX_INT32 stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - FX_FLOAT centerJ = CenterFromEnd(stateCount, j); - FX_FLOAT centerI = CrossCheckVertical(i, (FX_INT32) centerJ, stateCount[2], stateCountTotal); - if(!FXSYS_isnan(centerI)) { - centerJ = CrossCheckHorizontal((FX_INT32) centerJ, (FX_INT32) centerI, stateCount[2], stateCountTotal); - if(!FXSYS_isnan(centerJ)) { - FX_FLOAT estimatedModuleSize = (FX_FLOAT) stateCountTotal / 7.0f; - FX_BOOL found = FALSE; - FX_INT32 max = m_possibleCenters.GetSize(); - for(FX_INT32 index = 0; index < max; index++) { - CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)(m_possibleCenters[index]); - if(center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { - center->IncrementCount(); - found = TRUE; - break; - } - } - if(!found) { - m_possibleCenters.Add(FX_NEW CBC_QRFinderPattern(centerJ, centerI, estimatedModuleSize)); - } - return TRUE; - } - } - return FALSE; -} -FX_INT32 CBC_QRFinderPatternFinder::FindRowSkip() -{ - FX_INT32 max = m_possibleCenters.GetSize(); - if (max <= 1) { - return 0; - } - FinderPattern *firstConfirmedCenter = NULL; - for (FX_INT32 i = 0; i < max; i++) { - CBC_QRFinderPattern *center = (CBC_QRFinderPattern*)m_possibleCenters[i]; - if (center->GetCount() >= CENTER_QUORUM) { - if (firstConfirmedCenter == NULL) { - firstConfirmedCenter = center; - } else { - m_hasSkipped = TRUE; - return (FX_INT32) ((fabs(firstConfirmedCenter->GetX() - center->GetX()) - - fabs(firstConfirmedCenter->GetY() - center->GetY())) / 2); - } - } - } - return 0; -} -FX_BOOL CBC_QRFinderPatternFinder::HaveMultiplyConfirmedCenters() -{ - FX_INT32 confirmedCount = 0; - FX_FLOAT totalModuleSize = 0.0f; - FX_INT32 max = m_possibleCenters.GetSize(); - FX_INT32 i; - for (i = 0; i < max; i++) { - CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; - if (pattern->GetCount() >= CENTER_QUORUM) { - confirmedCount++; - totalModuleSize += pattern->GetEstimatedModuleSize(); - } - } - if (confirmedCount < 3) { - return FALSE; - } - FX_FLOAT average = totalModuleSize / (FX_FLOAT) max; - FX_FLOAT totalDeviation = 0.0f; - for (i = 0; i < max; i++) { - CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[i]; - totalDeviation += fabs(pattern->GetEstimatedModuleSize() - average); - } - return totalDeviation <= 0.05f * totalModuleSize; -} -inline FX_BOOL centerComparator(FX_LPVOID a, FX_LPVOID b) -{ - return ((CBC_QRFinderPattern*)b)->GetCount() < ((CBC_QRFinderPattern*)a)->GetCount(); -} -CFX_PtrArray *CBC_QRFinderPatternFinder::SelectBestpatterns(FX_INT32 &e) -{ - FX_INT32 startSize = m_possibleCenters.GetSize(); - if(m_possibleCenters.GetSize() < 3) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_FLOAT average = 0.0f; - if(startSize > 3) { - FX_FLOAT totalModuleSize = 0.0f; - for(FX_INT32 i = 0; i < startSize; i++) { - totalModuleSize += ((CBC_QRFinderPattern*)m_possibleCenters[i])->GetEstimatedModuleSize(); - } - average = totalModuleSize / (FX_FLOAT)startSize; - for(FX_INT32 j = 0; j < m_possibleCenters.GetSize() && m_possibleCenters.GetSize() > 3; j++) { - CBC_QRFinderPattern *pattern = (CBC_QRFinderPattern*)m_possibleCenters[j]; - if(fabs(pattern->GetEstimatedModuleSize() - average) > 0.2f * average) { - delete pattern; - m_possibleCenters.RemoveAt(j); - j--; - } - } - } - if(m_possibleCenters.GetSize() > 3) { - BC_FX_PtrArray_Sort(m_possibleCenters, centerComparator); - } - CFX_PtrArray *vec = FX_NEW CFX_PtrArray(); - vec->SetSize(3); - (*vec)[0] = ((CBC_QRFinderPattern*)m_possibleCenters[0])->Clone(); - (*vec)[1] = ((CBC_QRFinderPattern*)m_possibleCenters[1])->Clone(); - (*vec)[2] = ((CBC_QRFinderPattern*)m_possibleCenters[2])->Clone(); - return vec; -} diff --git a/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp b/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp deleted file mode 100644 index a5c492f4bc..0000000000 --- a/xfa/src/fxbarcode/src/BC_QRGridSampler.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_CommonPerspectiveTransform.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_QRGridSampler.h" -CBC_QRGridSampler CBC_QRGridSampler::m_gridSampler; -CBC_QRGridSampler::CBC_QRGridSampler() -{ -} -CBC_QRGridSampler::~CBC_QRGridSampler() -{ -} -CBC_QRGridSampler &CBC_QRGridSampler::GetInstance() -{ - return m_gridSampler; -} -void CBC_QRGridSampler::CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e) -{ - FX_INT32 width = image->GetWidth(); - FX_INT32 height = image->GetHeight(); - FX_BOOL nudged = TRUE; - FX_INT32 offset; - for (offset = 0; offset < points->GetSize() && nudged; offset += 2) { - FX_INT32 x = (FX_INT32) (*points)[offset]; - FX_INT32 y = (FX_INT32) (*points)[offset + 1]; - if (x < -1 || x > width || y < -1 || y > height) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - nudged = FALSE; - if (x == -1) { - (*points)[offset] = 0.0f; - nudged = TRUE; - } else if (x == width) { - (*points)[offset] = (FX_FLOAT)(width - 1); - nudged = TRUE; - } - if (y == -1) { - (*points)[offset + 1] = 0.0f; - nudged = TRUE; - } else if (y == height) { - (*points)[offset + 1] = (FX_FLOAT)(height - 1); - nudged = TRUE; - } - } - nudged = TRUE; - for (offset = (*points).GetSize() - 2; offset >= 0 && nudged; offset -= 2) { - FX_INT32 x = (FX_INT32) (*points)[offset]; - FX_INT32 y = (FX_INT32) (*points)[offset + 1]; - if (x < -1 || x > width || y < -1 || y > height) { - e = BCExceptionRead; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - nudged = FALSE; - if (x == -1) { - (*points)[offset] = 0.0f; - nudged = TRUE; - } else if (x == width) { - (*points)[offset] = (FX_FLOAT)(width - 1); - nudged = TRUE; - } - if (y == -1) { - (*points)[offset + 1] = 0.0f; - nudged = TRUE; - } else if (y == height) { - (*points)[offset + 1] = (FX_FLOAT)(height - 1); - nudged = TRUE; - } - } -} -CBC_CommonBitMatrix *CBC_QRGridSampler::SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, - FX_FLOAT p1ToX, FX_FLOAT p1ToY, - FX_FLOAT p2ToX, FX_FLOAT p2ToY, - FX_FLOAT p3ToX, FX_FLOAT p3ToY, - FX_FLOAT p4ToX, FX_FLOAT p4ToY, - FX_FLOAT p1FromX, FX_FLOAT p1FromY, - FX_FLOAT p2FromX, FX_FLOAT p2FromY, - FX_FLOAT p3FromX, FX_FLOAT p3FromY, - FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e) -{ - CBC_AutoPtr transform(CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral( - p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, - p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY)); - CBC_CommonBitMatrix *tempBitM = FX_NEW CBC_CommonBitMatrix(); - tempBitM->Init(dimensionX, dimensionY); - CBC_AutoPtr bits(tempBitM); - CFX_FloatArray points; - points.SetSize(dimensionX << 1); - for (FX_INT32 y = 0; y < dimensionY; y++) { - FX_INT32 max = points.GetSize(); - FX_FLOAT iValue = (FX_FLOAT) (y + 0.5f); - FX_INT32 x; - for (x = 0; x < max; x += 2) { - points[x] = (FX_FLOAT) ((x >> 1) + 0.5f); - points[x + 1] = iValue; - } - transform->TransformPoints(&points); - CheckAndNudgePoints(image, &points, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - for (x = 0; x < max; x += 2) { - if (image->Get((FX_INT32) points[x], (FX_INT32) points[x + 1])) { - bits->Set(x >> 1, y); - } - } - } - return bits.release(); -} diff --git a/xfa/src/fxbarcode/src/BC_Reader.cpp b/xfa/src/fxbarcode/src/BC_Reader.cpp deleted file mode 100644 index 51f7188b50..0000000000 --- a/xfa/src/fxbarcode/src/BC_Reader.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_Reader.h" -CBC_Reader::CBC_Reader() -{ -} -CBC_Reader::~CBC_Reader() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp deleted file mode 100644 index 588f978de5..0000000000 --- a/xfa/src/fxbarcode/src/BC_ReedSolomon.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_ReedSolomonGF256Poly.h" -#include "include/BC_ReedSolomon.h" -CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) -{ - m_field = field; -} -void CBC_ReedSolomonEncoder::Init() -{ - m_cachedGenerators.Add(FX_NEW CBC_ReedSolomonGF256Poly(m_field, 1)); -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(FX_INT32 degree, FX_INT32 &e) -{ - if(degree >= m_cachedGenerators.GetSize()) { - CBC_ReedSolomonGF256Poly* lastGenerator = (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[m_cachedGenerators.GetSize() - 1]); - for(FX_INT32 d = m_cachedGenerators.GetSize(); d <= degree; d++) { - CFX_Int32Array temp; - temp.Add(1); - temp.Add(m_field->Exp(d - 1)); - CBC_ReedSolomonGF256Poly temp_poly; - temp_poly.Init(m_field, &temp, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_ReedSolomonGF256Poly* nextGenerator = lastGenerator->Multiply(&temp_poly, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - m_cachedGenerators.Add(nextGenerator); - lastGenerator = nextGenerator; - } - } - return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]); -} -void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e) -{ - if(ecBytes == 0) { - e = BCExceptionNoCorrectionBytes; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - FX_INT32 dataBytes = toEncode->GetSize() - ecBytes; - if(dataBytes <= 0) { - e = BCExceptionNoDataBytesProvided; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CFX_Int32Array infoCoefficients; - infoCoefficients.SetSize(dataBytes); - for(FX_INT32 x = 0; x < dataBytes; x++) { - infoCoefficients[x] = toEncode->operator [](x); - } - CBC_ReedSolomonGF256Poly info; - info.Init(m_field, &infoCoefficients, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_ReedSolomonGF256Poly* rsg = info.MultiplyByMonomial(ecBytes, 1, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr infoTemp(rsg); - CFX_PtrArray *pa = infoTemp->Divide(generator, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr temp(pa); - CBC_ReedSolomonGF256Poly* remainder = (CBC_ReedSolomonGF256Poly*)(temp->operator [](1)); - CFX_Int32Array* coefficients = remainder->GetCoefficients(); - FX_INT32 numZeroCoefficients = ecBytes - coefficients->GetSize(); - for(FX_INT32 i = 0; i < numZeroCoefficients; i++) { - (*toEncode)[dataBytes + i] = 0; - } - for(FX_INT32 y = 0; y < coefficients->GetSize(); y++) { - (*toEncode)[dataBytes + numZeroCoefficients + y] = - coefficients->operator [](y); - } - for (FX_INT32 k = 0; k < temp->GetSize(); k++) { - delete (CBC_ReedSolomonGF256Poly*)(*temp)[k]; - } -} -CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() -{ - for (FX_INT32 i = 0; i < m_cachedGenerators.GetSize(); i++) { - delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i]; - } -} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp deleted file mode 100644 index da61616087..0000000000 --- a/xfa/src/fxbarcode/src/BC_ReedSolomonDecoder.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_ReedSolomonGF256Poly.h" -#include "include/BC_ReedSolomonDecoder.h" -CBC_ReedSolomonDecoder::CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256* field) -{ - m_field = field; -} -CBC_ReedSolomonDecoder::~CBC_ReedSolomonDecoder() -{ -} -void CBC_ReedSolomonDecoder::Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e) -{ - CBC_ReedSolomonGF256Poly poly; - poly.Init(m_field, received, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CFX_Int32Array syndromeCoefficients; - syndromeCoefficients.SetSize(twoS); - FX_BOOL dataMatrix = FALSE; - FX_BOOL noError = TRUE; - for (FX_INT32 i = 0; i < twoS; i++) { - FX_INT32 eval = poly.EvaluateAt(m_field->Exp(dataMatrix ? i + 1 : i)); - syndromeCoefficients[twoS - 1 - i] = eval; - if (eval != 0) { - noError = FALSE; - } - } - if(noError) { - return; - } - CBC_ReedSolomonGF256Poly syndrome; - syndrome.Init(m_field, &syndromeCoefficients, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_ReedSolomonGF256Poly* rsg = m_field->BuildMonomial(twoS, 1, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr temp(rsg); - CFX_PtrArray* pa = RunEuclideanAlgorithm(temp.get(), &syndrome, twoS, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr sigmaOmega(pa); - CBC_AutoPtr sigma((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[0]); - CBC_AutoPtr omega((CBC_ReedSolomonGF256Poly*)(*sigmaOmega)[1]); - CFX_Int32Array* ia1 = FindErrorLocations(sigma.get(), e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr errorLocations(ia1); - CFX_Int32Array* ia2 = FindErrorMagnitudes(omega.get(), errorLocations.get(), dataMatrix, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - CBC_AutoPtr errorMagnitudes(ia2); - for (FX_INT32 k = 0; k < errorLocations->GetSize(); k++) { - FX_INT32 position = received->GetSize() - 1 - m_field->Log((*errorLocations)[k], e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - if(position < 0) { - e = BCExceptionBadErrorLocation; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - (*received)[position] = CBC_ReedSolomonGF256::AddOrSubtract((*received)[position], (*errorMagnitudes)[k]); - } -} -CFX_PtrArray *CBC_ReedSolomonDecoder::RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e) -{ - if (a->GetDegree() < b->GetDegree()) { - CBC_ReedSolomonGF256Poly* temp = a; - a = b; - b = temp; - } - CBC_ReedSolomonGF256Poly* rsg1 = a->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr rLast(rsg1); - CBC_ReedSolomonGF256Poly* rsg2 = b->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr r(rsg2); - CBC_ReedSolomonGF256Poly* rsg3 = m_field->GetOne()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr sLast(rsg3); - CBC_ReedSolomonGF256Poly* rsg4 = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr s(rsg4); - CBC_ReedSolomonGF256Poly* rsg5 = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr tLast(rsg5); - CBC_ReedSolomonGF256Poly* rsg6 = m_field->GetOne()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr t(rsg6); - while (r->GetDegree() >= R / 2) { - CBC_AutoPtr rLastLast = rLast; - CBC_AutoPtr sLastLast = sLast; - CBC_AutoPtr tLastlast = tLast; - rLast = r; - sLast = s; - tLast = t; - if (rLast->IsZero()) { - e = BCExceptionR_I_1IsZero; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_ReedSolomonGF256Poly* rsg7 = rLastLast->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr rTemp(rsg7); - r = rTemp; - CBC_ReedSolomonGF256Poly* rsg8 = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr q(rsg8); - FX_INT32 denominatorLeadingTerm = rLast->GetCoefficients(rLast->GetDegree()); - FX_INT32 dltInverse = m_field->Inverse(denominatorLeadingTerm, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - while (r->GetDegree() >= rLast->GetDegree() && !(r->IsZero())) { - FX_INT32 degreeDiff = r->GetDegree() - rLast->GetDegree(); - FX_INT32 scale = m_field->Multiply(r->GetCoefficients(r->GetDegree()), dltInverse); - CBC_ReedSolomonGF256Poly* rsgp1 = m_field->BuildMonomial(degreeDiff, scale, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr build(rsgp1); - CBC_ReedSolomonGF256Poly* rsgp2 = q->AddOrSubtract(build.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp(rsgp2); - q = temp; - CBC_ReedSolomonGF256Poly* rsgp3 = rLast->MultiplyByMonomial(degreeDiff, scale, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr multiply(rsgp3); - CBC_ReedSolomonGF256Poly* rsgp4 = r->AddOrSubtract(multiply.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp3(rsgp4); - r = temp3; - } - CBC_ReedSolomonGF256Poly* rsg9 = q->Multiply(sLast.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp1(rsg9); - CBC_ReedSolomonGF256Poly* rsg10 = temp1->AddOrSubtract(sLastLast.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp2(rsg10); - s = temp2; - CBC_ReedSolomonGF256Poly* rsg11 = q->Multiply(tLast.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp5(rsg11); - CBC_ReedSolomonGF256Poly* rsg12 = temp5->AddOrSubtract(tLastlast.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp6(rsg12); - t = temp6; - } - FX_INT32 sigmaTildeAtZero = t->GetCoefficients(0); - if (sigmaTildeAtZero == 0) { - e = BCExceptionIsZero; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_INT32 inverse = m_field->Inverse(sigmaTildeAtZero, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_ReedSolomonGF256Poly* rsg13 = t->Multiply(inverse, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr sigma(rsg13); - CBC_ReedSolomonGF256Poly* rsg14 = r->Multiply(inverse, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr omega(rsg14); - CFX_PtrArray *temp = FX_NEW CFX_PtrArray; - temp->Add(sigma.release()); - temp->Add(omega.release()); - return temp; -} -CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e) -{ - FX_INT32 numErrors = errorLocator->GetDegree(); - if (numErrors == 1) { - CBC_AutoPtr temp(FX_NEW CFX_Int32Array); - temp->Add(errorLocator->GetCoefficients(1)); - return temp.release(); - } - CFX_Int32Array *tempT = FX_NEW CFX_Int32Array; - tempT->SetSize(numErrors); - CBC_AutoPtr result(tempT); - FX_INT32 ie = 0; - for (FX_INT32 i = 1; i < 256 && ie < numErrors; i++) { - if(errorLocator->EvaluateAt(i) == 0) { - (*result)[ie] = m_field->Inverse(i, ie); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - ie++; - } - } - if (ie != numErrors) { - e = BCExceptionDegreeNotMatchRoots; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return result.release(); -} -CFX_Int32Array *CBC_ReedSolomonDecoder::FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e) -{ - FX_INT32 s = errorLocations->GetSize(); - CFX_Int32Array * temp = FX_NEW CFX_Int32Array; - temp->SetSize(s); - CBC_AutoPtr result(temp); - for (FX_INT32 i = 0; i < s; i++) { - FX_INT32 xiInverse = m_field->Inverse(errorLocations->operator [](i), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_INT32 denominator = 1; - for(FX_INT32 j = 0; j < s; j++) { - if(i != j) { - denominator = m_field->Multiply(denominator, - CBC_ReedSolomonGF256::AddOrSubtract(1, m_field->Multiply(errorLocations->operator [](j), xiInverse))); - } - } - FX_INT32 temp = m_field->Inverse(denominator, temp); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - (*result)[i] = m_field->Multiply(errorEvaluator->EvaluateAt(xiInverse), - temp); - } - return result.release(); -} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp deleted file mode 100644 index 7fb8a9e7df..0000000000 --- a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ReedSolomonGF256Poly.h" -#include "include/BC_ReedSolomonGF256.h" -CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::QRCodeFild = NULL; -CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::DataMatrixField = NULL; -void CBC_ReedSolomonGF256::Initialize() -{ - QRCodeFild = FX_NEW CBC_ReedSolomonGF256(0x011D); - QRCodeFild->Init(); - DataMatrixField = FX_NEW CBC_ReedSolomonGF256(0x012D); - DataMatrixField->Init(); -} -void CBC_ReedSolomonGF256::Finalize() -{ - if (QRCodeFild) { - delete QRCodeFild; - } - QRCodeFild = NULL; - if (DataMatrixField) { - delete DataMatrixField; - } - DataMatrixField = NULL; -} -CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(FX_INT32 primitive) -{ - FX_INT32 x = 1; - for(FX_INT32 j = 0; j < 256; j++) { - m_expTable[j] = x; - x <<= 1; - if(x >= 0x100) { - x ^= primitive; - } - } - for(FX_INT32 i = 0; i < 255; i++) { - m_logTable[m_expTable[i]] = i; - } - m_logTable[0] = 0; -} -void CBC_ReedSolomonGF256::Init() -{ - m_zero = FX_NEW CBC_ReedSolomonGF256Poly(this, 0); - m_one = FX_NEW CBC_ReedSolomonGF256Poly(this, 1); -} -CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256() -{ - if(m_zero != NULL) { - delete m_zero; - m_zero = NULL; - } - if(m_one != NULL) { - delete m_one; - m_one = NULL; - } -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero() -{ - return m_zero; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne() -{ - return m_one; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) -{ - if(degree < 0) { - e = BCExceptionDegreeIsNegative; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - if(coefficient == 0) { - CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; - } - CFX_Int32Array coefficients; - coefficients.SetSize(degree + 1); - coefficients[0] = coefficient; - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(this, &coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -FX_INT32 CBC_ReedSolomonGF256::AddOrSubtract(FX_INT32 a, FX_INT32 b) -{ - return a ^ b; -} -FX_INT32 CBC_ReedSolomonGF256::Exp(FX_INT32 a) -{ - return m_expTable[a]; -} -FX_INT32 CBC_ReedSolomonGF256::Log(FX_INT32 a, FX_INT32 &e) -{ - if(a == 0) { - e = BCExceptionAIsZero; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - return m_logTable[a]; -} -FX_INT32 CBC_ReedSolomonGF256::Inverse(FX_INT32 a, FX_INT32 &e) -{ - if(a == 0) { - e = BCExceptionAIsZero; - BC_EXCEPTION_CHECK_ReturnValue(e, 0); - } - return m_expTable[255 - m_logTable[a]]; -} -FX_INT32 CBC_ReedSolomonGF256::Multiply(FX_INT32 a, FX_INT32 b) -{ - if(a == 0 || b == 0) { - return 0; - } - if(a == 1) { - return b; - } - if(b == 1) { - return a; - } - return m_expTable[(m_logTable[a] + m_logTable[b]) % 255]; -} diff --git a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp b/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp deleted file mode 100644 index 6c8edb7897..0000000000 --- a/xfa/src/fxbarcode/src/BC_ReedSolomonGF256Poly.cpp +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ReedSolomonGF256.h" -#include "include/BC_ReedSolomonGF256Poly.h" -CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients) -{ - if(field == NULL) { - return; - } - m_field = field; - m_coefficients.Add(coefficients); -} -CBC_ReedSolomonGF256Poly::CBC_ReedSolomonGF256Poly() -{ - m_field = NULL; -} -void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e) -{ - if(coefficients == NULL || coefficients->GetSize() == 0) { - e = BCExceptionCoefficientsSizeIsNull; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - m_field = field; - FX_INT32 coefficientsLength = coefficients->GetSize(); - if((coefficientsLength > 1 && (*coefficients)[0] == 0)) { - FX_INT32 firstNonZero = 1; - while((firstNonZero < coefficientsLength) && ((*coefficients)[firstNonZero] == 0)) { - firstNonZero++; - } - if(firstNonZero == coefficientsLength) { - m_coefficients.Copy( *(m_field->GetZero()->GetCoefficients())); - } else { - m_coefficients.SetSize(coefficientsLength - firstNonZero); - for(FX_INT32 i = firstNonZero, j = 0; i < coefficientsLength; i++, j++) { - m_coefficients[j] = coefficients->operator [](i); - } - } - } else { - m_coefficients.Copy(*coefficients); - } -} -CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() -{ - return &m_coefficients; -} -FX_INT32 CBC_ReedSolomonGF256Poly::GetDegree() -{ - return m_coefficients.GetSize() - 1; -} -FX_BOOL CBC_ReedSolomonGF256Poly::IsZero() -{ - return m_coefficients[0] == 0; -} -FX_INT32 CBC_ReedSolomonGF256Poly::GetCoefficients(FX_INT32 degree) -{ - return m_coefficients[m_coefficients.GetSize() - 1 - degree]; -} -FX_INT32 CBC_ReedSolomonGF256Poly::EvaluateAt(FX_INT32 a) -{ - if(a == 0) { - return GetCoefficients(0); - } - FX_INT32 size = m_coefficients.GetSize(); - if(a == 1) { - FX_INT32 result = 0; - for(FX_INT32 i = 0; i < size; i++) { - result = CBC_ReedSolomonGF256::AddOrSubtract(result, m_coefficients[i]); - } - return result; - } - FX_INT32 result = m_coefficients[0]; - for(FX_INT32 j = 1; j < size; j++) { - result = CBC_ReedSolomonGF256::AddOrSubtract( - m_field->Multiply(a, result), - m_coefficients[j]); - } - return result; -} -CBC_ReedSolomonGF256Poly *CBC_ReedSolomonGF256Poly::Clone(FX_INT32 &e) -{ - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(m_field, &m_coefficients, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) -{ - if(IsZero()) { - return other->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - if(other->IsZero()) { - return this->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CFX_Int32Array smallerCoefficients; - smallerCoefficients.Copy(m_coefficients); - CFX_Int32Array largerCoefficients; - largerCoefficients.Copy( *(other->GetCoefficients())); - if(smallerCoefficients.GetSize() > largerCoefficients.GetSize()) { - CFX_Int32Array temp; - temp.Copy(smallerCoefficients); - smallerCoefficients.Copy(largerCoefficients); - largerCoefficients.Copy(temp); - } - CFX_Int32Array sumDiff; - sumDiff.SetSize(largerCoefficients.GetSize() ); - FX_INT32 lengthDiff = largerCoefficients.GetSize() - smallerCoefficients.GetSize(); - for(FX_INT32 i = 0; i < lengthDiff; i++) { - sumDiff[i] = largerCoefficients[i]; - } - for(FX_INT32 j = lengthDiff; j < largerCoefficients.GetSize(); j++) { - sumDiff[j] = (CBC_ReedSolomonGF256::AddOrSubtract(smallerCoefficients[j - lengthDiff], - largerCoefficients[j])); - } - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(m_field, &sumDiff, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e) -{ - if(IsZero() || other->IsZero()) { - CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; - } - CFX_Int32Array aCoefficients ; - aCoefficients.Copy(m_coefficients); - FX_INT32 aLength = m_coefficients.GetSize(); - CFX_Int32Array bCoefficients; - bCoefficients.Copy(*(other->GetCoefficients())); - FX_INT32 bLength = other->GetCoefficients()->GetSize(); - CFX_Int32Array product; - product.SetSize(aLength + bLength - 1); - for(FX_INT32 i = 0; i < aLength; i++) { - FX_INT32 aCoeff = m_coefficients[i]; - for(FX_INT32 j = 0; j < bLength; j++) { - product[i + j] = CBC_ReedSolomonGF256::AddOrSubtract( - product[i + j], - m_field->Multiply(aCoeff, other->GetCoefficients()->operator [](j))); - } - } - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(m_field, &product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::Multiply(FX_INT32 scalar, FX_INT32 &e) -{ - if(scalar == 0) { - CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; - } - if(scalar == 1) { - return this->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - FX_INT32 size = m_coefficients.GetSize(); - CFX_Int32Array product; - product.SetSize(size); - for(FX_INT32 i = 0; i < size; i++) { - product[i] = m_field->Multiply(m_coefficients[i], scalar); - } - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(m_field, &product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256Poly::MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e) -{ - if(degree < 0) { - e = BCExceptionDegreeIsNegative; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - if(coefficient == 0) { - CBC_ReedSolomonGF256Poly *temp = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; - } - FX_INT32 size = m_coefficients.GetSize(); - CFX_Int32Array product; - product.SetSize(size + degree); - for(FX_INT32 i = 0; i < size; i++) { - product[i] = (m_field->Multiply(m_coefficients[i], coefficient)); - } - CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly(); - temp->Init(m_field, &product, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - return temp; -} -CFX_PtrArray* CBC_ReedSolomonGF256Poly::Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e) -{ - if(other->IsZero()) { - e = BCExceptionDivideByZero; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_ReedSolomonGF256Poly* rsg1 = m_field->GetZero()->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr quotient(rsg1); - CBC_ReedSolomonGF256Poly* rsg2 = this->Clone(e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr remainder(rsg2); - FX_INT32 denominatorLeadingTerm = other->GetCoefficients(other->GetDegree()); - FX_INT32 inverseDenominatorLeadingTeam = m_field->Inverse(denominatorLeadingTerm, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - FX_BOOL bFirst = TRUE; - while(remainder->GetDegree() >= other->GetDegree() && !remainder->IsZero()) { - FX_INT32 degreeDifference = remainder->GetDegree() - other->GetDegree(); - FX_INT32 scale = m_field->Multiply(remainder->GetCoefficients((remainder->GetDegree())), - inverseDenominatorLeadingTeam); - CBC_ReedSolomonGF256Poly* rsg3 = other->MultiplyByMonomial(degreeDifference, scale, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr term(rsg3); - CBC_ReedSolomonGF256Poly* rsg4 = m_field->BuildMonomial(degreeDifference, scale, e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr iteratorQuotient(rsg4); - CBC_ReedSolomonGF256Poly* rsg5 = quotient->AddOrSubtract(iteratorQuotient.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp(rsg5); - quotient = temp; - CBC_ReedSolomonGF256Poly* rsg6 = remainder->AddOrSubtract(term.get(), e); - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - CBC_AutoPtr temp1(rsg6); - remainder = temp1; - } - CFX_PtrArray* tempPtrA = FX_NEW CFX_PtrArray; - tempPtrA->Add(quotient.release()); - tempPtrA->Add(remainder.release()); - return tempPtrA; -} -CBC_ReedSolomonGF256Poly::~CBC_ReedSolomonGF256Poly() -{ - m_coefficients.RemoveAll(); -} diff --git a/xfa/src/fxbarcode/src/BC_ResultPoint.cpp b/xfa/src/fxbarcode/src/BC_ResultPoint.cpp deleted file mode 100644 index 5618d8f38d..0000000000 --- a/xfa/src/fxbarcode/src/BC_ResultPoint.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_ResultPoint.h" -CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y): m_x(x), m_y(y) -{ -} -FX_FLOAT CBC_ResultPoint::GetX() -{ - return m_x; -} -FX_FLOAT CBC_ResultPoint::GetY() -{ - return m_y; -} diff --git a/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp b/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp deleted file mode 100644 index f079528c76..0000000000 --- a/xfa/src/fxbarcode/src/BC_SymbolInfo.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006 Jeremias Maerki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_Dimension.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_DataMatrixSymbolInfo144.h" -#define SYMBOLS_COUNT 30 -CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; -CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; -void CBC_SymbolInfo::Initialize() -{ - m_PROD_SYMBOLS[0] = FX_NEW CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1); - m_PROD_SYMBOLS[1] = FX_NEW CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1); - m_PROD_SYMBOLS[2] = FX_NEW CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1); - m_PROD_SYMBOLS[3] = FX_NEW CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1); - m_PROD_SYMBOLS[4] = FX_NEW CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2); - m_PROD_SYMBOLS[5] = FX_NEW CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1); - m_PROD_SYMBOLS[6] = FX_NEW CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1); - m_PROD_SYMBOLS[7] = FX_NEW CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1); - m_PROD_SYMBOLS[8] = FX_NEW CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1); - m_PROD_SYMBOLS[9] = FX_NEW CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2); - m_PROD_SYMBOLS[10] = FX_NEW CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1); - m_PROD_SYMBOLS[11] = FX_NEW CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2); - m_PROD_SYMBOLS[12] = FX_NEW CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1); - m_PROD_SYMBOLS[13] = FX_NEW CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1); - m_PROD_SYMBOLS[14] = FX_NEW CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2); - m_PROD_SYMBOLS[15] = FX_NEW CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4); - m_PROD_SYMBOLS[16] = FX_NEW CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4); - m_PROD_SYMBOLS[17] = FX_NEW CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4); - m_PROD_SYMBOLS[18] = FX_NEW CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4); - m_PROD_SYMBOLS[19] = FX_NEW CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4); - m_PROD_SYMBOLS[20] = FX_NEW CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42); - m_PROD_SYMBOLS[21] = FX_NEW CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56); - m_PROD_SYMBOLS[22] = FX_NEW CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36); - m_PROD_SYMBOLS[23] = FX_NEW CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48); - m_PROD_SYMBOLS[24] = FX_NEW CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56); - m_PROD_SYMBOLS[25] = FX_NEW CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68); - m_PROD_SYMBOLS[26] = FX_NEW CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56); - m_PROD_SYMBOLS[27] = FX_NEW CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68); - m_PROD_SYMBOLS[28] = FX_NEW CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62); - m_PROD_SYMBOLS[29] = FX_NEW CBC_DataMatrixSymbolInfo144(); - for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { - m_symbols[i] = m_PROD_SYMBOLS[i]; - } -} -void CBC_SymbolInfo::Finalize() -{ - for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { - delete m_PROD_SYMBOLS[i]; - m_PROD_SYMBOLS[i] = NULL; - m_symbols[i] = NULL; - } -} -CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions) -{ - m_rectangular = rectangular; - m_dataCapacity = dataCapacity; - m_errorCodewords = errorCodewords; - m_matrixWidth = matrixWidth; - m_matrixHeight = matrixHeight; - m_dataRegions = dataRegions; - m_rsBlockData = dataCapacity; - m_rsBlockError = errorCodewords; -} -CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, - FX_INT32 rsBlockData, FX_INT32 rsBlockError) -{ - m_rectangular = rectangular; - m_dataCapacity = dataCapacity; - m_errorCodewords = errorCodewords; - m_matrixWidth = matrixWidth; - m_matrixHeight = matrixHeight; - m_dataRegions = dataRegions; - m_rsBlockData = rsBlockData; - m_rsBlockError = rsBlockError; -} -CBC_SymbolInfo::~CBC_SymbolInfo() -{ -} - -CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_INT32 &e) -{ - return lookup(dataCodewords, FORCE_NONE, TRUE, e); -} -CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e) -{ - return lookup(dataCodewords, shape, TRUE, e); -} -CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e) -{ - SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE; - return lookup(dataCodewords, shape, fail, e); -} -CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e) -{ - return lookup(dataCodewords, shape, NULL, NULL, fail, e); -} -CBC_SymbolInfo* CBC_SymbolInfo::lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e) -{ - for (FX_INT32 i = 0; i < SYMBOLS_COUNT; i++) { - CBC_SymbolInfo* symbol = m_symbols[i]; - if (shape == FORCE_SQUARE && symbol->m_rectangular) { - continue; - } - if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) { - continue; - } - if (minSize != NULL && (symbol->getSymbolWidth(e) < minSize->getWidth() || symbol->getSymbolHeight(e) < minSize->getHeight())) { - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - continue; - } - if (maxSize != NULL && (symbol->getSymbolWidth(e) > maxSize->getWidth() || symbol->getSymbolHeight(e) > maxSize->getHeight())) { - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - continue; - } - if (dataCodewords <= symbol->m_dataCapacity) { - return symbol; - } - } - if (fail) { - e = BCExceptionIllegalDataCodewords; - return NULL; - } - return NULL; -} -FX_INT32 CBC_SymbolInfo::getHorizontalDataRegions(FX_INT32 &e) -{ - switch (m_dataRegions) { - case 1: - return 1; - case 2: - return 2; - case 4: - return 2; - case 16: - return 4; - case 36: - return 6; - default: - e = BCExceptionCannotHandleThisNumberOfDataRegions; - return 0; - } -} -FX_INT32 CBC_SymbolInfo::getVerticalDataRegions(FX_INT32 &e) -{ - switch (m_dataRegions) { - case 1: - return 1; - case 2: - return 1; - case 4: - return 2; - case 16: - return 4; - case 36: - return 6; - default: - e = BCExceptionCannotHandleThisNumberOfDataRegions; - return 0; - } -} -FX_INT32 CBC_SymbolInfo::getSymbolDataWidth(FX_INT32 &e) -{ - return getHorizontalDataRegions(e) * m_matrixWidth; -} -FX_INT32 CBC_SymbolInfo::getSymbolDataHeight(FX_INT32 &e) -{ - return getVerticalDataRegions(e) * m_matrixHeight; -} -FX_INT32 CBC_SymbolInfo::getSymbolWidth(FX_INT32 &e) -{ - return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2); -} -FX_INT32 CBC_SymbolInfo::getSymbolHeight(FX_INT32 &e) -{ - return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2); -} -FX_INT32 CBC_SymbolInfo::getCodewordCount() -{ - return m_dataCapacity + m_errorCodewords; -} -FX_INT32 CBC_SymbolInfo::getInterleavedBlockCount() -{ - return m_dataCapacity / m_rsBlockData; -} -FX_INT32 CBC_SymbolInfo::getDataLengthForInterleavedBlock(FX_INT32 index) -{ - return m_rsBlockData; -} -FX_INT32 CBC_SymbolInfo::getErrorLengthForInterleavedBlock(FX_INT32 index) -{ - return m_rsBlockError; -} -CFX_WideString CBC_SymbolInfo::toString(FX_INT32 &e) -{ - CFX_WideString sb; - sb += (FX_LPWSTR)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:"); - sb += (FX_LPWSTR)" data region "; - sb += m_matrixWidth; - sb += (FX_WCHAR)'x'; - sb += m_matrixHeight; - sb += (FX_LPWSTR)", symbol size "; - sb += getSymbolWidth(e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - sb += (FX_WCHAR)'x'; - sb += getSymbolHeight(e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - sb += (FX_LPWSTR)", symbol data size "; - sb += getSymbolDataWidth(e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - sb += (FX_WCHAR)'x'; - sb += getSymbolDataHeight(e); - BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)""); - sb += (FX_LPWSTR)", codewords "; - sb += m_dataCapacity; - sb += (FX_WCHAR)'+'; - sb += m_errorCodewords; - return sb; -} diff --git a/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp b/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp deleted file mode 100644 index aa3694d9e2..0000000000 --- a/xfa/src/fxbarcode/src/BC_SymbolShapeHint.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_SymbolShapeHint.h" -CBC_SymbolShapeHint::CBC_SymbolShapeHint() -{ -} -CBC_SymbolShapeHint::~CBC_SymbolShapeHint() -{ -} diff --git a/xfa/src/fxbarcode/src/BC_TextEncoder.cpp b/xfa/src/fxbarcode/src/BC_TextEncoder.cpp deleted file mode 100644 index c8da30482b..0000000000 --- a/xfa/src/fxbarcode/src/BC_TextEncoder.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_C40Encoder.h" -#include "include/BC_TextEncoder.h" -CBC_TextEncoder::CBC_TextEncoder() -{ -} -CBC_TextEncoder::~CBC_TextEncoder() -{ -} -FX_INT32 CBC_TextEncoder::getEncodingMode() -{ - return TEXT_ENCODATION; -} -FX_INT32 CBC_TextEncoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) -{ - if (c == ' ') { - sb += (FX_WCHAR)'\3'; - return 1; - } - if (c >= '0' && c <= '9') { - sb += (FX_WCHAR) (c - 48 + 4); - return 1; - } - if (c >= 'a' && c <= 'z') { - sb += (FX_WCHAR) (c - 97 + 14); - return 1; - } - if (c >= '\0' && c <= 0x1f) { - sb += (FX_WCHAR)'\0'; - sb += c; - return 2; - } - if (c >= '!' && c <= '/') { - sb += (FX_WCHAR) '\1'; - sb += (FX_WCHAR) (c - 33); - return 2; - } - if (c >= ':' && c <= '@') { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR) (c - 58 + 15); - return 2; - } - if (c >= '[' && c <= '_') { - sb += (FX_WCHAR) '\1'; - sb += (FX_WCHAR) (c - 91 + 22); - return 2; - } - if (c == 0x0060) { - sb += (FX_WCHAR) '\2'; - sb += (FX_WCHAR) (c - 96); - return 2; - } - if (c >= 'A' && c <= 'Z') { - sb += (FX_WCHAR)'\2'; - sb += (FX_WCHAR) (c - 65 + 1); - return 2; - } - if (c >= '{' && c <= 0x007f) { - sb += (FX_WCHAR)'\2'; - sb += (FX_WCHAR) (c - 123 + 27); - return 2; - } - if (c >= 0x0080) { - sb += (FX_WCHAR)'\1'; - sb += (FX_WCHAR)0x001e; - FX_INT32 len = 2; - len += encodeChar((FX_WCHAR) (c - 128), sb, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - return len; - } - CBC_HighLevelEncoder::illegalCharacter(c, e); - return -1; -} diff --git a/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp b/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp deleted file mode 100644 index b23802b784..0000000000 --- a/xfa/src/fxbarcode/src/BC_TwoDimWriter.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_Writer.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_TwoDimWriter.h" -CBC_TwoDimWriter::CBC_TwoDimWriter() -{ - m_iCorrectLevel = 1; - m_bFixedSize = TRUE; - m_output = NULL; -} -CBC_TwoDimWriter::~CBC_TwoDimWriter() -{ - if (m_output != NULL) { - delete m_output; - m_output = NULL; - } -} -void CBC_TwoDimWriter::RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix) -{ - CFX_GraphStateData stateData; - CFX_PathData path; - path.AppendRect(0, 0, (FX_FLOAT)m_Width, (FX_FLOAT)m_Height); - device->DrawPath(&path, matrix, &stateData, m_backgroundColor, m_backgroundColor, FXFILL_ALTERNATE); - FX_INT32 leftPos = 0; - FX_INT32 topPos = 0; - if ( m_bFixedSize) { - leftPos = (m_Width - m_output->GetWidth()) / 2; - topPos = (m_Height - m_output->GetHeight()) / 2; - } - CFX_Matrix matri = *matrix; - if (m_Width < m_output->GetWidth() && m_Height < m_output->GetHeight()) { - CFX_Matrix matriScale((FX_FLOAT)m_Width / (FX_FLOAT)m_output->GetWidth(), 0.0, 0.0, (FX_FLOAT)m_Height / (FX_FLOAT)m_output->GetHeight(), 0.0, 0.0); - matriScale.Concat(*matrix); - matri = matriScale; - } - for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { - for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { - CFX_PathData rect; - rect.AppendRect((FX_FLOAT)leftPos + x, (FX_FLOAT)topPos + y, (FX_FLOAT)(leftPos + x + 1), (FX_FLOAT)(topPos + y + 1)); - CFX_GraphStateData stateData; - if(m_output->Get(x, y)) { - device->DrawPath(&rect, &matri, &stateData, m_barColor, 0, FXFILL_WINDING); - } - } - } -} -void CBC_TwoDimWriter::RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e) -{ - if (m_bFixedSize) { - pOutBitmap = CreateDIBitmap(m_Width, m_Height); - } else { - pOutBitmap = CreateDIBitmap(m_output->GetWidth(), m_output->GetHeight()); - } - if (!pOutBitmap) { - e = BCExceptionFailToCreateBitmap; - return; - } - pOutBitmap->Clear(m_backgroundColor); - FX_INT32 leftPos = 0; - FX_INT32 topPos = 0; - if ( m_bFixedSize) { - leftPos = (m_Width - m_output->GetWidth()) / 2; - topPos = (m_Height - m_output->GetHeight()) / 2; - } - for (FX_INT32 x = 0; x < m_output->GetWidth(); x++) { - for (FX_INT32 y = 0; y < m_output->GetHeight(); y++) { - if (m_output->Get(x, y)) { - pOutBitmap->SetPixel(leftPos + x, topPos + y, m_barColor); - } - } - } - if (!m_bFixedSize) { - CFX_DIBitmap * pStretchBitmap = pOutBitmap->StretchTo(m_Width, m_Height); - if (pOutBitmap) { - delete pOutBitmap; - } - pOutBitmap = pStretchBitmap; - } -} -void CBC_TwoDimWriter::RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e) -{ - FX_INT32 inputWidth = codeWidth; - FX_INT32 inputHeight = codeHeight; - FX_INT32 tempWidth = inputWidth + (1 << 1); - FX_INT32 tempHeight = inputHeight + (1 << 1); - FX_FLOAT moduleHSize = (FX_FLOAT)FX_MIN(m_ModuleWidth, m_ModuleHeight); - if (moduleHSize > 8) { - moduleHSize = 8; - } else if (moduleHSize < 1) { - moduleHSize = 1; - } - FX_INT32 outputWidth = (FX_INT32)FX_MAX(tempWidth * moduleHSize, tempWidth); - FX_INT32 outputHeight = (FX_INT32)FX_MAX(tempHeight * moduleHSize, tempHeight); - FX_INT32 multiX = 1; - FX_INT32 multiY = 1; - if (m_bFixedSize) { - if (m_Width < outputWidth || m_Height < outputHeight) { - e = BCExceptionBitmapSizeError; - return; - } - } else { - if (m_Width > outputWidth || m_Height > outputHeight) { - outputWidth = (FX_INT32)(outputWidth * ceil ( (FX_FLOAT)m_Width / (FX_FLOAT)outputWidth)); - outputHeight = (FX_INT32)(outputHeight * ceil ( (FX_FLOAT)m_Height / (FX_FLOAT)outputHeight)); - } - } - multiX = (FX_INT32)ceil((FX_FLOAT)outputWidth / (FX_FLOAT)tempWidth); - multiY = (FX_INT32)ceil((FX_FLOAT)outputHeight / (FX_FLOAT) tempHeight); - if (m_bFixedSize) { - multiX = FX_MIN(multiX, multiY); - multiY = multiX; - } - FX_INT32 leftPadding = (outputWidth - (inputWidth * multiX)) / 2; - FX_INT32 topPadding = (outputHeight - (inputHeight * multiY)) / 2; - if (leftPadding < 0) { - leftPadding = 0; - } - if (topPadding < 0) { - topPadding = 0; - } - m_output = FX_NEW CBC_CommonBitMatrix; - m_output->Init(outputWidth, outputHeight); - for (FX_INT32 inputY = 0, outputY = topPadding; (inputY < inputHeight) && (outputY < outputHeight - multiY); inputY++, outputY += multiY) { - for (FX_INT32 inputX = 0, outputX = leftPadding; (inputX < inputWidth) && (outputX < outputWidth - multiX); inputX++, outputX += multiX) { - if (code[inputX + inputY * inputWidth] == 1) { - m_output->SetRegion(outputX, outputY, multiX, multiY, e); - BC_EXCEPTION_CHECK_ReturnVoid(e); - } - } - } -} diff --git a/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp b/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp deleted file mode 100644 index 993fc79689..0000000000 --- a/xfa/src/fxbarcode/src/BC_UtilCodingConvert.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_UtilCodingConvert.h" -CBC_UtilCodingConvert::CBC_UtilCodingConvert() -{ -} -CBC_UtilCodingConvert::~CBC_UtilCodingConvert() -{ -} -void CBC_UtilCodingConvert::UnicodeToLocale(const CFX_WideString &src, CFX_ByteString &dst) -{ - dst.ConvertFrom(src); -} -void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteString &dst) -{ - CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); - dst = unicode.UTF8Encode(); -} -void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString &src, CFX_ByteArray &dst) -{ - CFX_WideString unicode = CFX_WideString::FromLocal(src, src.GetLength()); - CFX_ByteString utf8 = unicode.UTF8Encode(); - for (FX_INT32 i = 0; i < utf8.GetLength(); i ++) { - dst.Add(utf8[i]); - } -} -void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray &src, CFX_ByteString &dst) -{ - CFX_ByteString utf8; - for (FX_INT32 i = 0; i < src.GetSize(); i ++) { - utf8 += src[i]; - } - CFX_WideString unicode = CFX_WideString::FromUTF8(utf8, utf8.GetLength()); - dst.ConvertFrom(unicode); -} -void CBC_UtilCodingConvert::Utf8ToLocale(const FX_BYTE *src, FX_INT32 count, CFX_ByteString &dst) -{ - CFX_WideString unicode = CFX_WideString::FromUTF8((const char*)src, count); - dst.ConvertFrom(unicode); -} -void CBC_UtilCodingConvert::UnicodeToUTF8(const CFX_WideString &src, CFX_ByteString &dst) -{ - dst = src.UTF8Encode(); -} diff --git a/xfa/src/fxbarcode/src/BC_UtilRSS.cpp b/xfa/src/fxbarcode/src/BC_UtilRSS.cpp deleted file mode 100644 index be9c2a5268..0000000000 --- a/xfa/src/fxbarcode/src/BC_UtilRSS.cpp +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_UtilRSS.h" -CBC_UtilRSS::CBC_UtilRSS() -{ -} -CBC_UtilRSS::~CBC_UtilRSS() -{ -} -CFX_Int32Array *CBC_UtilRSS::GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow) -{ - CFX_Int32Array *iTemp = FX_NEW CFX_Int32Array; - iTemp->SetSize(elements); - CBC_AutoPtr widths(iTemp); - FX_INT32 bar; - FX_INT32 narrowMask = 0; - for (bar = 0; bar < elements - 1; bar++) { - narrowMask |= (1 << bar); - FX_INT32 elmWidth = 1; - FX_INT32 subVal; - while (TRUE) { - subVal = Combins(n - elmWidth - 1, elements - bar - 2); - if (noNarrow && (narrowMask == 0) && - (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { - subVal -= Combins(n - elmWidth - (elements - bar), elements - bar - 2); - } - if (elements - bar - 1 > 1) { - FX_INT32 lessVal = 0; - for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); - mxwElement > maxWidth; - mxwElement--) { - lessVal += Combins(n - elmWidth - mxwElement - 1, elements - bar - 3); - } - subVal -= lessVal * (elements - 1 - bar); - } else if (n - elmWidth > maxWidth) { - subVal--; - } - val -= subVal; - if (val < 0) { - break; - } - elmWidth++; - narrowMask &= ~(1 << bar); - } - val += subVal; - n -= elmWidth; - (*widths)[bar] = elmWidth; - } - (*widths)[bar] = n; - return widths.release(); -} -FX_INT32 CBC_UtilRSS::GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow) -{ - FX_INT32 elements = widths.GetSize(); - FX_INT32 n = 0; - for (FX_INT32 i = 0; i < elements; i++) { - n += widths[i]; - } - FX_INT32 val = 0; - FX_INT32 narrowMask = 0; - for (FX_INT32 bar = 0; bar < elements - 1; bar++) { - FX_INT32 elmWidth; - for (elmWidth = 1, narrowMask |= (1 << bar); - elmWidth < widths[bar]; - elmWidth++, narrowMask &= ~(1 << bar)) { - FX_INT32 subVal = Combins(n - elmWidth - 1, elements - bar - 2); - if (noNarrow && (narrowMask == 0) && - (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { - subVal -= Combins(n - elmWidth - (elements - bar), - elements - bar - 2); - } - if (elements - bar - 1 > 1) { - FX_INT32 lessVal = 0; - for (FX_INT32 mxwElement = n - elmWidth - (elements - bar - 2); - mxwElement > maxWidth; mxwElement--) { - lessVal += Combins(n - elmWidth - mxwElement - 1, - elements - bar - 3); - } - subVal -= lessVal * (elements - 1 - bar); - } else if (n - elmWidth > maxWidth) { - subVal--; - } - val += subVal; - } - n -= elmWidth; - } - return val; -} -FX_INT32 CBC_UtilRSS::Combins(FX_INT32 n, FX_INT32 r) -{ - FX_INT32 maxDenom; - FX_INT32 minDenom; - if (n - r > r) { - minDenom = r; - maxDenom = n - r; - } else { - minDenom = n - r; - maxDenom = r; - } - FX_INT32 val = 1; - FX_INT32 j = 1; - for (FX_INT32 i = n; i > maxDenom; i--) { - val *= i; - if (j <= minDenom) { - val /= j; - j++; - } - } - while (j <= minDenom) { - val /= j; - j++; - } - return val; -} -CFX_Int32Array *CBC_UtilRSS::Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K) -{ - CFX_Int32Array *widths = FX_NEW CFX_Int32Array; - widths->SetSize(eDist.GetSize() + 2); - FX_INT32 twoK = K << 1; - (*widths)[0] = 1; - FX_INT32 i; - FX_INT32 minEven = 10; - FX_INT32 barSum = 1; - for (i = 1; i < twoK - 2; i += 2) { - (*widths)[i] = eDist[i - 1] - (*widths)[i - 1]; - (*widths)[i + 1] = eDist[i] - (*widths)[i]; - barSum += (*widths)[i] + (*widths)[i + 1]; - if ((*widths)[i] < minEven) { - minEven = (*widths)[i]; - } - } - (*widths)[twoK - 1] = N - barSum; - if ((*widths)[twoK - 1] < minEven) { - minEven = (*widths)[twoK - 1]; - } - if (minEven > 1) { - for (i = 0; i < twoK; i += 2) { - (*widths)[i] += minEven - 1; - (*widths)[i + 1] -= minEven - 1; - } - } - return widths; -} diff --git a/xfa/src/fxbarcode/src/BC_Utils.cpp b/xfa/src/fxbarcode/src/BC_Utils.cpp deleted file mode 100644 index 3a04ebda2b..0000000000 --- a/xfa/src/fxbarcode/src/BC_Utils.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c) -{ - if (first > last || count <= 0) { - return FALSE; - } - dst.Delete(first, last - first); - for (FX_INT32 i = 0; i < count; i ++) { - dst.Insert(0, c); - } - return TRUE; -} -void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c) -{ - for (FX_INT32 i = 0; i < count; i ++) { - dst += c; - } -} -void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba) -{ - for (FX_INT32 i = 0; i < ba.GetSize(); i ++) { - dst += ba[i]; - } -} -void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun) -{ - FX_INT32 nLength = src.GetSize(); - FX_BOOL changed = true; - do { - changed = false; - for (FX_INT32 i = 0; i < nLength - 1; i++) { - if ( fun(src[i + 1], src[i]) ) { - void *temp = src[i]; - src.SetAt(i, src[i + 1]); - src.SetAt(i + 1, temp); - changed = true; - } - } - } while (changed); -} diff --git a/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp b/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp deleted file mode 100644 index 38fa5e9477..0000000000 --- a/xfa/src/fxbarcode/src/BC_WhiteRectangleDetector.cpp +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_WhiteRectangleDetector.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_ResultPoint.h" -const FX_INT32 CBC_WhiteRectangleDetector::INIT_SIZE = 30; -const FX_INT32 CBC_WhiteRectangleDetector::CORR = 1; -CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image) -{ - m_image = image; - m_height = image->GetHeight(); - m_width = image->GetWidth(); - m_leftInit = (m_width - INIT_SIZE) >> 1; - m_rightInit = (m_width + INIT_SIZE) >> 1; - m_upInit = (m_height - INIT_SIZE) >> 1; - m_downInit = (m_height + INIT_SIZE) >> 1; -} -void CBC_WhiteRectangleDetector::Init(FX_INT32 &e) -{ - if (m_upInit < 0 || m_leftInit < 0 || m_downInit >= m_height || m_rightInit >= m_width) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnVoid(e); - } -} -CBC_WhiteRectangleDetector::CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y) -{ - m_image = image; - m_height = image->GetHeight(); - m_width = image->GetWidth(); - FX_INT32 halfsize = initSize >> 1; - m_leftInit = x - halfsize; - m_rightInit = x + halfsize; - m_upInit = y - halfsize; - m_downInit = y + halfsize; -} -CBC_WhiteRectangleDetector::~CBC_WhiteRectangleDetector() -{ -} -CFX_PtrArray *CBC_WhiteRectangleDetector::Detect(FX_INT32 &e) -{ - FX_INT32 left = m_leftInit; - FX_INT32 right = m_rightInit; - FX_INT32 up = m_upInit; - FX_INT32 down = m_downInit; - FX_BOOL sizeExceeded = FALSE; - FX_BOOL aBlackPointFoundOnBorder = TRUE; - FX_BOOL atLeastOneBlackPointFoundOnBorder = FALSE; - while (aBlackPointFoundOnBorder) { - aBlackPointFoundOnBorder = FALSE; - FX_BOOL rightBorderNotWhite = TRUE; - while (rightBorderNotWhite && right < m_width) { - rightBorderNotWhite = ContainsBlackPoint(up, down, right, FALSE); - if (rightBorderNotWhite) { - right++; - aBlackPointFoundOnBorder = TRUE; - } - } - if (right >= m_width) { - sizeExceeded = TRUE; - break; - } - FX_BOOL bottomBorderNotWhite = TRUE; - while (bottomBorderNotWhite && down < m_height) { - bottomBorderNotWhite = ContainsBlackPoint(left, right, down, TRUE); - if (bottomBorderNotWhite) { - down++; - aBlackPointFoundOnBorder = TRUE; - } - } - if (down >= m_height) { - sizeExceeded = TRUE; - break; - } - FX_BOOL leftBorderNotWhite = TRUE; - while (leftBorderNotWhite && left >= 0) { - leftBorderNotWhite = ContainsBlackPoint(up, down, left, FALSE); - if (leftBorderNotWhite) { - left--; - aBlackPointFoundOnBorder = TRUE; - } - } - if (left < 0) { - sizeExceeded = TRUE; - break; - } - FX_BOOL topBorderNotWhite = TRUE; - while (topBorderNotWhite && up >= 0) { - topBorderNotWhite = ContainsBlackPoint(left, right, up, TRUE); - if (topBorderNotWhite) { - up--; - aBlackPointFoundOnBorder = TRUE; - } - } - if (up < 0) { - sizeExceeded = TRUE; - break; - } - if (aBlackPointFoundOnBorder) { - atLeastOneBlackPointFoundOnBorder = TRUE; - } - } - if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { - FX_INT32 maxSize = right - left; - CBC_AutoPtr z(NULL); - for (FX_INT32 i = 1; i < maxSize; i++) { - z = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(down - i), (FX_FLOAT)(left + i), (FX_FLOAT)(down)) ); - if (z.get() != NULL) { - break; - } - } - if (z.get() == NULL) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_AutoPtr t(NULL); - for (FX_INT32 j = 1; j < maxSize; j++) { - t = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)left, (FX_FLOAT)(up + j), (FX_FLOAT)(left + j), (FX_FLOAT)up)); - if (t.get() != NULL) { - break; - } - } - if (t.get() == NULL) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_AutoPtr x(NULL); - for (FX_INT32 k = 1; k < maxSize; k++) { - x = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(up + k), (FX_FLOAT)(right - k), (FX_FLOAT)up)); - if (x.get() != NULL) { - break; - } - } - if (x.get() == NULL) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - CBC_AutoPtr y(NULL); - for (FX_INT32 m = 1; m < maxSize; m++) { - y = CBC_AutoPtr(GetBlackPointOnSegment((FX_FLOAT)right, (FX_FLOAT)(down - m), (FX_FLOAT)(right - m), (FX_FLOAT) down)); - if (y.get() != NULL) { - break; - } - } - if (y.get() == NULL) { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return CenterEdges(y.get(), z.get(), x.get(), t.get()); - } else { - e = BCExceptionNotFound; - BC_EXCEPTION_CHECK_ReturnValue(e, NULL); - } - return NULL; -} -FX_INT32 CBC_WhiteRectangleDetector::Round(FX_FLOAT d) -{ - return (FX_INT32) (d + 0.5f); -} -CBC_ResultPoint *CBC_WhiteRectangleDetector::GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) -{ - FX_INT32 dist = DistanceL2(aX, aY, bX, bY); - float xStep = (bX - aX) / dist; - float yStep = (bY - aY) / dist; - for (FX_INT32 i = 0; i < dist; i++) { - FX_INT32 x = Round(aX + i * xStep); - FX_INT32 y = Round(aY + i * yStep); - if (m_image->Get(x, y)) { - return FX_NEW CBC_ResultPoint((FX_FLOAT)x, (FX_FLOAT) y); - } - } - return NULL; -} -FX_INT32 CBC_WhiteRectangleDetector::DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY) -{ - float xDiff = aX - bX; - float yDiff = aY - bY; - return Round((float)sqrt(xDiff * xDiff + yDiff * yDiff)); -} -CFX_PtrArray *CBC_WhiteRectangleDetector::CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, CBC_ResultPoint *x, CBC_ResultPoint *t) -{ - float yi = y->GetX(); - float yj = y->GetY(); - float zi = z->GetX(); - float zj = z->GetY(); - float xi = x->GetX(); - float xj = x->GetY(); - float ti = t->GetX(); - float tj = t->GetY(); - if (yi < m_width / 2) { - CFX_PtrArray *result = FX_NEW CFX_PtrArray; - result->SetSize(4); - (*result)[0] = FX_NEW CBC_ResultPoint(ti - CORR, tj + CORR); - (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj + CORR); - (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj - CORR); - (*result)[3] = FX_NEW CBC_ResultPoint(yi + CORR, yj - CORR); - return result; - } else { - CFX_PtrArray *result = FX_NEW CFX_PtrArray; - result->SetSize(4); - (*result)[0] = FX_NEW CBC_ResultPoint(ti + CORR, tj + CORR); - (*result)[1] = FX_NEW CBC_ResultPoint(zi + CORR, zj - CORR); - (*result)[2] = FX_NEW CBC_ResultPoint(xi - CORR, xj + CORR); - (*result)[3] = FX_NEW CBC_ResultPoint(yi - CORR, yj - CORR); - return result; - } -} -FX_BOOL CBC_WhiteRectangleDetector::ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal) -{ - if (horizontal) { - for (FX_INT32 x = a; x <= b; x++) { - if (m_image->Get(x, fixed)) { - return TRUE; - } - } - } else { - for (FX_INT32 y = a; y <= b; y++) { - if (m_image->Get(fixed, y)) { - return TRUE; - } - } - } - return FALSE; -} diff --git a/xfa/src/fxbarcode/src/BC_Writer.cpp b/xfa/src/fxbarcode/src/BC_Writer.cpp deleted file mode 100644 index c372c97097..0000000000 --- a/xfa/src/fxbarcode/src/BC_Writer.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "barcode.h" -#include "include/BC_Writer.h" -CBC_Writer::CBC_Writer() -{ - m_CharEncoding = 0; - m_ModuleHeight = 1; - m_ModuleWidth = 1; - m_Height = 320; - m_Width = 640; - m_colorSpace = FXDIB_Argb; - m_barColor = 0xff000000; - m_backgroundColor = 0xffffffff; -} -CBC_Writer::~CBC_Writer() -{ -} -FX_BOOL CBC_Writer::SetCharEncoding(FX_INT32 encoding) -{ - m_CharEncoding = encoding; - return TRUE; -} -FX_BOOL CBC_Writer::SetModuleHeight(FX_INT32 moduleHeight) -{ - if (moduleHeight > 10 || moduleHeight < 1) { - return FALSE; - } - m_ModuleHeight = moduleHeight; - return TRUE; -} -FX_BOOL CBC_Writer::SetModuleWidth(FX_INT32 moduleWidth) -{ - if ( moduleWidth > 10 || moduleWidth < 1) { - return FALSE; - } - m_ModuleWidth = moduleWidth; - return TRUE; -} -FX_BOOL CBC_Writer::SetHeight(FX_INT32 height) -{ - m_Height = height; - return TRUE; -} -FX_BOOL CBC_Writer::SetWidth(FX_INT32 width) -{ - m_Width = width; - return TRUE; -} -void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) -{ - m_backgroundColor = backgroundColor; -} -void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) -{ - m_barColor = foregroundColor; -} -CFX_DIBitmap* CBC_Writer::CreateDIBitmap(FX_INT32 width, FX_INT32 height) -{ - CFX_DIBitmap *pDIBitmap = NULL; - pDIBitmap = FX_NEW CFX_DIBitmap; - if(pDIBitmap != NULL) { - pDIBitmap->Create(width, height, m_colorSpace); - } - return pDIBitmap; -} diff --git a/xfa/src/fxbarcode/src/BC_X12Encoder.cpp b/xfa/src/fxbarcode/src/BC_X12Encoder.cpp deleted file mode 100644 index 1b600387c1..0000000000 --- a/xfa/src/fxbarcode/src/BC_X12Encoder.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "barcode.h" -#include "include/BC_Encoder.h" -#include "include/BC_CommonBitMatrix.h" -#include "include/BC_Dimension.h" -#include "include/BC_SymbolShapeHint.h" -#include "include/BC_SymbolInfo.h" -#include "include/BC_EncoderContext.h" -#include "include/BC_HighLevelEncoder.h" -#include "include/BC_C40Encoder.h" -#include "include/BC_X12Encoder.h" -CBC_X12Encoder::CBC_X12Encoder() -{ -} -CBC_X12Encoder::~CBC_X12Encoder() -{ -} -FX_INT32 CBC_X12Encoder::getEncodingMode() -{ - return X12_ENCODATION; -} -void CBC_X12Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e) -{ - CFX_WideString buffer; - while (context.hasMoreCharacters()) { - FX_WCHAR c = context.getCurrentChar(); - context.m_pos++; - encodeChar(c, buffer, e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 count = buffer.GetLength(); - if ((count % 3) == 0) { - writeNextTriplet(context, buffer); - FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - } - handleEOD(context, buffer, e); -} -void CBC_X12Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e) -{ - context.updateSymbolInfo(e); - if (e != BCExceptionNO) { - return; - } - FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount(); - FX_INT32 count = buffer.GetLength(); - if (count == 2) { - context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); - context.m_pos -= 2; - context.signalEncoderChange(ASCII_ENCODATION); - } else if (count == 1) { - context.m_pos--; - if (available > 1) { - context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH); - } - context.signalEncoderChange(ASCII_ENCODATION); - } -} -FX_INT32 CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e) -{ - if (c == '\r') { - sb += (FX_WCHAR)'\0'; - } else if (c == '*') { - sb += (FX_WCHAR)'\1'; - } else if (c == '>') { - sb += (FX_WCHAR)'\2'; - } else if (c == ' ') { - sb += (FX_WCHAR)'\3'; - } else if (c >= '0' && c <= '9') { - sb += (FX_WCHAR) (c - 48 + 4); - } else if (c >= 'A' && c <= 'Z') { - sb += (FX_WCHAR) (c - 65 + 14); - } else { - CBC_HighLevelEncoder::illegalCharacter(c, e); - BC_EXCEPTION_CHECK_ReturnValue(e, -1); - } - return 1; -} diff --git a/xfa/src/fxbarcode/src/barcode.h b/xfa/src/fxbarcode/src/barcode.h deleted file mode 100644 index e2ad2126a0..0000000000 --- a/xfa/src/fxbarcode/src/barcode.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "../../foxitlib.h" -#include "include/utils.h" diff --git a/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h b/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h deleted file mode 100644 index 9a48b8762f..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ASCIIEncoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ASCIIENCODER_H_ -#define _BC_ASCIIENCODER_H_ -class CBC_Encoder; -class CBC_EncoderContext; -class CBC_ASCIIEncoder; -class CBC_ASCIIEncoder : public CBC_Encoder -{ -public: - CBC_ASCIIEncoder(); - virtual ~CBC_ASCIIEncoder(); - FX_INT32 getEncodingMode(); - void Encode(CBC_EncoderContext &context, FX_INT32 &e); -private: - static FX_WCHAR encodeASCIIDigits(FX_WCHAR digit1, FX_WCHAR digit2, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h b/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h deleted file mode 100644 index 96110b1d08..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Base256Encoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BASE256ENCODER_H_ -#define _BC_BASE256ENCODER_H_ -class CBC_Encoder; -class CBC_Base256Encoder; -class CBC_Base256Encoder : public CBC_Encoder -{ -public: - CBC_Base256Encoder(); - virtual ~CBC_Base256Encoder(); - FX_INT32 getEncodingMode(); - void Encode(CBC_EncoderContext &context, FX_INT32 &e); -private: - static FX_WCHAR randomize255State(FX_WCHAR ch, FX_INT32 codewordPosition); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Binarizer.h b/xfa/src/fxbarcode/src/include/BC_Binarizer.h deleted file mode 100644 index 357aef67c2..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Binarizer.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BINARIZER_H_ -#define _BC_BINARIZER_H_ -class CBC_LuminanceSource; -class CBC_CommonBitMatrix; -class CBC_CommonBitArray; -class CBC_BinaryBitmap; -class CBC_Binarizer : public CFX_Object -{ -public: - CBC_Binarizer(CBC_LuminanceSource *source); - virtual ~CBC_Binarizer(); - CBC_LuminanceSource *GetLuminanceSource(); - virtual CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e) = 0; - virtual CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e) = 0; -private: - CBC_LuminanceSource *m_source; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h b/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h deleted file mode 100644 index 638d16f5a9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_BinaryBitmap.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BINARYBITMAP_H_ -#define _BC_BINARYBITMAP_H_ -class CBC_Binarizer; -class CBC_CommonBitMatrix; -class CBC_CommonBitArray; -class CBC_BinaryBitmap; -class CBC_BinaryBitmap : public CFX_Object -{ -public: - CBC_BinaryBitmap(CBC_Binarizer *binarizer); - virtual ~CBC_BinaryBitmap(); - FX_INT32 GetWidth(); - FX_INT32 GetHeight(); - CBC_CommonBitMatrix * GetMatrix(FX_INT32 &e); - CBC_CommonBitArray * GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); - CBC_CommonBitMatrix * GetBlackMatrix(FX_INT32 &e); - FX_BOOL IsCropSupported(); - FX_BOOL IsRotateSupported(); -private: - CBC_Binarizer * m_binarizer; - CBC_CommonBitMatrix * m_matrix; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h b/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h deleted file mode 100644 index 4bff1756d5..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_BufferedImageLuminanceSource.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ -#define _BC_BUFFEREDIMAGELUMINANCESOURCE_H_ -class CBC_LuminanceSource; -class CBC_BufferedImageLuminanceSource; -class CBC_BufferedImageLuminanceSource : public CBC_LuminanceSource -{ -public: - CBC_BufferedImageLuminanceSource(const CFX_WideString &filename); - CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap); - virtual ~CBC_BufferedImageLuminanceSource(); - CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e); - CBC_LuminanceSource *Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height); - - CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e); - CFX_ByteArray *GetMatrix(); - FX_BOOL IsCropSupported(); - FX_BOOL IsRotateSupported(); - virtual void Init(FX_INT32 &e); -private: - FX_INT32 m_bytesPerLine; - FX_INT32 m_left; - FX_INT32 m_top; - CFX_Int32Array m_rgbData; - CFX_DIBitmap *m_pBitmap; - const CFX_WideString m_filename; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_C40Encoder.h b/xfa/src/fxbarcode/src/include/BC_C40Encoder.h deleted file mode 100644 index 7f2d2f7e79..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_C40Encoder.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_C40ENCODER_H_ -#define _BC_C40ENCODER_H_ -class CBC_C40Encoder; -class CBC_C40Encoder : public CBC_Encoder -{ -public: - CBC_C40Encoder(); - virtual ~CBC_C40Encoder(); - virtual FX_INT32 getEncodingMode(); - virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e); - static void writeNextTriplet(CBC_EncoderContext &context, CFX_WideString &buffer); - virtual void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); - virtual FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); -private: - FX_INT32 backtrackOneCharacter(CBC_EncoderContext &context, CFX_WideString &buffer, CFX_WideString &removed, FX_INT32 lastCharSize, FX_INT32 &e); - static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h b/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h deleted file mode 100644 index 484d87d5a7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonBitArray.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONBITARRAY_H_ -#define _BC_COMMONBITARRAY_H_ -class CBC_CommonBitArray; -class CBC_CommonBitArray : public CFX_Object -{ -public: - CBC_CommonBitArray(CBC_CommonBitArray* array); - CBC_CommonBitArray(FX_INT32 size); - CBC_CommonBitArray(); - virtual ~CBC_CommonBitArray(); - FX_INT32 GetSize(); - CFX_Int32Array& GetBits(); - FX_INT32 GetSizeInBytes(); - FX_BOOL Get(FX_INT32 i); - void Set(FX_INT32 i); - void Flip(FX_INT32 i); - void SetBulk(FX_INT32 i, FX_INT32 newBits); - FX_BOOL IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e); - FX_INT32 *GetBitArray(); - void Reverse(); - void Clear(); -private: - FX_INT32 m_size; - CFX_Int32Array m_bits; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h b/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h deleted file mode 100644 index f69d7a0e33..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonBitMatrix.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONBITMATRIX_H_ -#define _BC_COMMONBITMATRIX_H_ -class CBC_CommonBitArray; -class CBC_CommonBitMatrix; -class CBC_CommonBitMatrix : public CFX_Object -{ -public: - CBC_CommonBitMatrix(); - virtual ~CBC_CommonBitMatrix(); - FX_BOOL Get(FX_INT32 x, FX_INT32 y); - void Set(FX_INT32 x, FX_INT32 y); - void Flip(FX_INT32 x, FX_INT32 y); - void Clear(); - void SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e); - CBC_CommonBitArray* GetRow(FX_INT32 y, CBC_CommonBitArray* row); - void SetRow(FX_INT32 y, CBC_CommonBitArray* row); - CBC_CommonBitArray* GetCol(FX_INT32 y, CBC_CommonBitArray* row); - void SetCol(FX_INT32 y, CBC_CommonBitArray* col); - FX_INT32 GetWidth(); - FX_INT32 GetHeight(); - FX_INT32 GetRowSize(); - FX_INT32 GetDimension(FX_INT32 &e); - virtual void Init(FX_INT32 dimension); - virtual void Init(FX_INT32 width, FX_INT32 height); - FX_INT32* GetBits(); -private: - FX_INT32 m_width; - FX_INT32 m_height; - FX_INT32 m_rowSize; - FX_INT32* m_bits; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h b/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h deleted file mode 100644 index 53891cf671..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonBitSource.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONBITSOURCE_H_ -#define _BC_COMMONBITSOURCE_H_ -class CBC_CommonBitSource; -class CBC_CommonBitSource : public CFX_Object -{ -public: - CBC_CommonBitSource(CFX_ByteArray *bytes); - virtual ~CBC_CommonBitSource(); - FX_INT32 ReadBits(FX_INT32 numBits, FX_INT32 &e); - FX_INT32 Available(); - FX_INT32 getByteOffset(); -private: - CFX_ByteArray m_bytes; - FX_INT32 m_byteOffset; - FX_INT32 m_bitOffset; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h b/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h deleted file mode 100644 index fe0a67ffd1..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonByteArray.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONBYTEARRAY_H_ -#define _BC_COMMONBYTEARRAY_H_ -class CBC_CommonByteArray; -class CBC_CommonByteArray : public CFX_Object -{ -private: - FX_INT32 m_size; - FX_INT32 m_index; - FX_BYTE* m_bytes; -public: - CBC_CommonByteArray(); - CBC_CommonByteArray(FX_INT32 size); - CBC_CommonByteArray(FX_BYTE* byteArray, FX_INT32 size); - virtual ~CBC_CommonByteArray(); - FX_INT32 At(FX_INT32 index); - void Set(FX_INT32 index, FX_INT32 value); - FX_INT32 Size(); - FX_BOOL IsEmpty(); - void AppendByte(FX_INT32 value); - void Reserve(FX_INT32 capacity); - void Set(FX_BYTE* source, FX_INT32 offset, FX_INT32 count); - void Set(CFX_ByteArray* source, FX_INT32 offset, FX_INT32 count); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h b/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h deleted file mode 100644 index 3d831d1911..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonByteMatrix.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONBYTEMATRIX_H_ -#define _BC_COMMONBYTEMATRIX_H_ -class CBC_CommonByteMatrix; -class CBC_CommonByteMatrix : public CFX_Object -{ -public: - CBC_CommonByteMatrix(FX_INT32 width, FX_INT32 height); - virtual ~CBC_CommonByteMatrix(); - FX_INT32 GetHeight(); - FX_INT32 GetWidth(); - FX_BYTE Get(FX_INT32 x, FX_INT32 y); - FX_BYTE* GetArray(); - - void Set(FX_INT32 x, FX_INT32 y, FX_INT32 value); - void Set(FX_INT32 x, FX_INT32 y, FX_BYTE value); - void clear(FX_BYTE value); - virtual void Init(); -private: - FX_BYTE *m_bytes; - FX_INT32 m_width; - FX_INT32 m_height; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h b/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h deleted file mode 100644 index 1e9f9a433f..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonCharacterSetECI.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONCHARACTERSETECI_H_ -#define _BC_COMMONCHARACTERSETECI_H_ -class CBC_CommonECI; -class CBC_CommonCharacterSetECI; -class CBC_CommonCharacterSetECI : public CBC_CommonECI -{ -public: - CBC_CommonCharacterSetECI(FX_INT32 value, CFX_ByteString encodingName); - virtual ~CBC_CommonCharacterSetECI(); - CFX_ByteString GetEncodingName(); - static void AddCharacterSet(FX_INT32 value, CFX_ByteString encodingName); - FX_INT32 GetValue(); - static CBC_CommonCharacterSetECI* GetCharacterSetECIByValue(FX_INT32 value); - static CBC_CommonCharacterSetECI* GetCharacterSetECIByName(const CFX_ByteString& name); -private: - CFX_ByteString m_encodingName; - static void initialize(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h b/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h deleted file mode 100644 index 808203bd01..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonDecoderResult.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONDECODERRESULT_H_ -#define _BC_COMMONDECODERRESULT_H_ -class CBC_QRCoderErrorCorrectionLevel; -class CBC_PDF417ResultMetadata; -class CBC_CommonDecoderResult; -class CBC_CommonDecoderResult : public CFX_Object -{ -public: - CBC_CommonDecoderResult(); - virtual ~CBC_CommonDecoderResult(); - const CFX_ByteArray& GetRawBytes(); - const CFX_ByteString& GetText(); - const CFX_Int32Array& GetByteSegments(); - CBC_QRCoderErrorCorrectionLevel* GetECLevel(); - virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_Int32Array &byteSegments, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); - virtual void Init(const CFX_ByteArray &rawBytes, const CFX_ByteString &text, const CFX_PtrArray &byteSegments, const CFX_ByteString &ecLevel, FX_INT32 &e); - void setOther(CBC_PDF417ResultMetadata* other); -private: - CFX_ByteArray m_rawBytes; - CFX_ByteString m_text; - CFX_Int32Array m_byteSegments; - CFX_PtrArray m_pdf417byteSegments; - CBC_QRCoderErrorCorrectionLevel* m_ecLevel; - CFX_ByteString m_pdf417ecLevel; - CBC_PDF417ResultMetadata* m_other; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonECI.h b/xfa/src/fxbarcode/src/include/BC_CommonECI.h deleted file mode 100644 index 3907066066..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonECI.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONECI_H_ -#define _BC_COMMONECI_H_ -class CBC_CommonECI; -class CBC_CommonECI : public CFX_Object -{ -public: - CBC_CommonECI(FX_INT32 value); - virtual ~CBC_CommonECI(); - - FX_INT32 GetValue(); - static CBC_CommonECI* GetEICByValue(FX_INT32 value, FX_INT32 &e); -private: - FX_INT32 m_value; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h b/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h deleted file mode 100644 index 5c42a1a6a7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_CommonPerspectiveTransform.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMMONPERSPECTIVETRANSFORM_H_ -#define _BC_COMMONPERSPECTIVETRANSFORM_H_ -class CBC_CommonPerspectiveTransform; -class CBC_CommonPerspectiveTransform : public CFX_Object -{ -public: - CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31, - FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32, - FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33); - virtual ~CBC_CommonPerspectiveTransform(); - static CBC_CommonPerspectiveTransform *QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3, - FX_FLOAT x0p, FX_FLOAT y0p, - FX_FLOAT x1p, FX_FLOAT y1p, - FX_FLOAT x2p, FX_FLOAT y2p, - FX_FLOAT x3p, FX_FLOAT y3p); - static CBC_CommonPerspectiveTransform *SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3); - static CBC_CommonPerspectiveTransform *QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0, - FX_FLOAT x1, FX_FLOAT y1, - FX_FLOAT x2, FX_FLOAT y2, - FX_FLOAT x3, FX_FLOAT y3); - CBC_CommonPerspectiveTransform *BuildAdjoint(); - CBC_CommonPerspectiveTransform *Times(CBC_CommonPerspectiveTransform &other); - void TransformPoints(CFX_FloatArray *points); -private: - FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h deleted file mode 100644 index c5f1f3f7a0..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixBitMatrixParser.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXBITMATRIXPARSER_H_ -#define _BC_DATAMATRIXBITMATRIXPARSER_H_ -class CBC_CommonBitMatrix; -class CBC_DataMatrixVersion; -class CBC_DataMatrixBitMatrixParser; -class CBC_DataMatrixBitMatrixParser : public CFX_Object -{ -public: - CBC_DataMatrixBitMatrixParser(); - virtual ~CBC_DataMatrixBitMatrixParser(); - CBC_DataMatrixVersion *GetVersion(); - CFX_ByteArray *ReadCodewords(FX_INT32 &e); - FX_BOOL ReadModule(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); - FX_INT32 ReadUtah(FX_INT32 row, FX_INT32 column, FX_INT32 numRows, FX_INT32 numColumns); - FX_INT32 ReadCorner1(FX_INT32 numRows, FX_INT32 numColumns); - FX_INT32 ReadCorner2(FX_INT32 numRows, FX_INT32 numColumns); - FX_INT32 ReadCorner3(FX_INT32 numRows, FX_INT32 numColumns); - FX_INT32 ReadCorner4(FX_INT32 numRows, FX_INT32 numColumns); - CBC_CommonBitMatrix *ExtractDataRegion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); - virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); -private: - static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); - CBC_CommonBitMatrix *m_mappingBitMatrix; - CBC_CommonBitMatrix *m_readMappingMatrix; - CBC_DataMatrixVersion *m_version; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h deleted file mode 100644 index 1dd62fe1fe..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixDataBlock.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXDATABLOCK_H_ -#define _BC_DATAMATRIXDATABLOCK_H_ -class CBC_DataMatrixVersion; -class CBC_DataMatrixDataBlock; -class CBC_DataMatrixDataBlock : public CFX_Object -{ -public: - virtual ~CBC_DataMatrixDataBlock(); - - FX_INT32 GetNumDataCodewords(); - CFX_ByteArray* GetCodewords(); - - static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e); -private: - FX_INT32 m_numDataCodewords; - CFX_ByteArray m_codewords; - - CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h deleted file mode 100644 index 060972d53a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecodedBitStreamParser.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ -#define _BC_DATAMATRIXDECODEDBITSTREAMPARSER_H_ -class CBC_CommonDecoderResult; -class CBC_CommonBitSource; -class CBC_DataMatrixDecodedBitStreamParser; -class CBC_DataMatrixDecodedBitStreamParser : public CFX_Object -{ -public: - CBC_DataMatrixDecodedBitStreamParser(); - virtual ~CBC_DataMatrixDecodedBitStreamParser(); - static CBC_CommonDecoderResult *Decode(CFX_ByteArray &bytes, FX_INT32 &e); - -private: - static FX_INT32 DecodeAsciiSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_ByteString &resultTrailer, FX_INT32 &e); - static void DecodeC40Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); - static void DecodeTextSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); - static void DecodeAnsiX12Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); - static void ParseTwoBytes(FX_INT32 firstByte, FX_INT32 secondByte, CFX_Int32Array &result); - static void DecodeEdifactSegment(CBC_CommonBitSource *bits, CFX_ByteString &result, FX_INT32 &e); - static void DecodeBase256Segment(CBC_CommonBitSource *bits, CFX_ByteString &result, CFX_Int32Array &byteSegments, FX_INT32 &e); - static FX_BYTE Unrandomize255State(FX_INT32 randomizedBase256Codeword, FX_INT32 base256CodewordPosition); - - const static FX_CHAR C40_BASIC_SET_CHARS[]; - const static FX_CHAR C40_SHIFT2_SET_CHARS[]; - - - const static FX_CHAR TEXT_BASIC_SET_CHARS[]; - const static FX_CHAR TEXT_SHIFT3_SET_CHARS[]; - const static FX_INT32 PAD_ENCODE; - const static FX_INT32 ASCII_ENCODE; - const static FX_INT32 C40_ENCODE; - const static FX_INT32 TEXT_ENCODE; - const static FX_INT32 ANSIX12_ENCODE; - const static FX_INT32 EDIFACT_ENCODE; - const static FX_INT32 BASE256_ENCODE; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h deleted file mode 100644 index 44f7efc7b7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixDecoder.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXDECODER_H_ -#define _BC_DATAMATRIXDECODER_H_ -class CBC_ReedSolomonDecoder; -class CBC_CommonDecoderResult; -class CBC_CommonBitMatrix; -class CBC_DataMatrixDecoder; -class CBC_DataMatrixDecoder : public CFX_Object -{ -public: - CBC_DataMatrixDecoder(); - virtual ~CBC_DataMatrixDecoder(); - CBC_CommonDecoderResult *Decode(CBC_CommonBitMatrix *bits, FX_INT32 &e); - virtual void Init(); -private: - void CorrectErrors(CFX_ByteArray &codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); - CBC_ReedSolomonDecoder *m_rsDecoder; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h deleted file mode 100644 index 2d3ca744fe..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixDetector.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXDETECTOR_H_ -#define _BC_DATAMATRIXDETECTOR_H_ -class CBC_CommonBitMatrix; -class CBC_WhiteRectangleDetector; -class CBC_ResultPoint; -class CBC_QRDetectorResult; -class CBC_DataMatrixDetector; -class ResultPointsAndTransitions; -class CBC_ResultPointsAndTransitions : public CFX_Object -{ -public: - CBC_ResultPointsAndTransitions(CBC_ResultPoint *from, CBC_ResultPoint *to, FX_INT32 transitions) - { - m_from = from; - m_to = to; - m_transitions = transitions; - } - ~CBC_ResultPointsAndTransitions() - { - } - CBC_ResultPoint *GetFrom() - { - return m_from; - } - CBC_ResultPoint *GetTo() - { - return m_to; - } - FX_INT32 GetTransitions() - { - return m_transitions; - } -private: - CBC_ResultPoint *m_from; - CBC_ResultPoint *m_to; - FX_INT32 m_transitions; -}; -class CBC_DataMatrixDetector -{ -public: - CBC_DataMatrixDetector(CBC_CommonBitMatrix *image); - virtual ~CBC_DataMatrixDetector(); - CBC_QRDetectorResult *Detect(FX_INT32 &e); - CBC_ResultPoint *CorrectTopRightRectangular(CBC_ResultPoint *bottomLeft, - CBC_ResultPoint *bottomRight, - CBC_ResultPoint *topLeft, - CBC_ResultPoint *topRight, - FX_INT32 dimensionTop, FX_INT32 dimensionRight); - CBC_ResultPoint *CorrectTopRight(CBC_ResultPoint *bottomLeft, - CBC_ResultPoint *bottomRight, - CBC_ResultPoint *topLeft, - CBC_ResultPoint *topRight, - FX_INT32 dimension); - CBC_CommonBitMatrix *SampleGrid(CBC_CommonBitMatrix *image, - CBC_ResultPoint *topLeft, - CBC_ResultPoint *bottomLeft, - CBC_ResultPoint *bottomRight, - CBC_ResultPoint *topRight, - FX_INT32 dimensionX, FX_INT32 dimensionY, FX_INT32 &e); - CBC_ResultPointsAndTransitions *TransitionsBetween(CBC_ResultPoint *from, CBC_ResultPoint *to); - FX_BOOL IsValid(CBC_ResultPoint *p); - FX_INT32 Distance(CBC_ResultPoint *a, CBC_ResultPoint *b); - void Increment(CFX_MapPtrTemplate &table, CBC_ResultPoint *key); - FX_INT32 Round(FX_FLOAT d); - void OrderBestPatterns(CFX_PtrArray *patterns); - virtual void Init(FX_INT32 &e); -private: - CBC_CommonBitMatrix *m_image; - CBC_WhiteRectangleDetector *m_rectangleDetector; - const static FX_INT32 INTEGERS[5]; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h deleted file mode 100644 index 4301512d70..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixReader.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXREADER_H_ -#define _BC_DATAMATRIXREADER_H_ -class CBC_BinaryBitmap; -class CBC_DataMatrixDecoder; -class CBC_Reader; -class CBC_DataMatrixReader; -class CBC_DataMatrixReader : public CBC_Reader -{ -public: - CBC_DataMatrixReader(); - virtual ~CBC_DataMatrixReader(); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, int hints, FX_INT32 &e); - - virtual void Init(); -private: - CBC_DataMatrixDecoder *m_decoder; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h deleted file mode 100644 index e749b27d86..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixSymbolInfo144.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXSYMBOLINFO144_H_ -#define _BC_DATAMATRIXSYMBOLINFO144_H_ -class CBC_SymbolInfo; -class CBC_DataMatrixSymbolInfo144; -class CBC_DataMatrixSymbolInfo144 : public CBC_SymbolInfo -{ -public: - CBC_DataMatrixSymbolInfo144(); - virtual ~CBC_DataMatrixSymbolInfo144(); - FX_INT32 getInterleavedBlockCount(); - FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h deleted file mode 100644 index 41d2f23db6..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixVersion.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXVERSION_H_ -#define _BC_DATAMATRIXVERSION_H_ -class ECB; -class ECBlocks; -class CBC_DataMatrixVersion; -class ECB : public CFX_Object -{ -public: - ECB(FX_INT32 count, FX_INT32 dataCodewords) - { - m_count = count; - m_dataCodewords = dataCodewords; - } - - FX_INT32 GetCount() - { - return m_count; - } - - FX_INT32 GetDataCodewords() - { - return m_dataCodewords; - } -private: - FX_INT32 m_count; - FX_INT32 m_dataCodewords; -}; -class ECBlocks : public CFX_Object -{ -public: - ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks) - { - m_ecCodewords = ecCodewords; - m_ecBlocks.Add(ecBlocks); - } - - ECBlocks(FX_INT32 ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) - { - m_ecCodewords = ecCodewords; - m_ecBlocks.Add(ecBlocks1); - m_ecBlocks.Add(ecBlocks2); - } - ~ECBlocks() - { - for(FX_INT32 i = 0; i < m_ecBlocks.GetSize(); i++) { - delete (ECB*)m_ecBlocks[i]; - } - m_ecBlocks.RemoveAll(); - } - - FX_INT32 GetECCodewords() - { - return m_ecCodewords; - } - - const CFX_PtrArray &GetECBlocks() - { - return m_ecBlocks; - } -private: - FX_INT32 m_ecCodewords; - CFX_PtrArray m_ecBlocks; -}; -class CBC_DataMatrixVersion : public CFX_Object -{ -public: - CBC_DataMatrixVersion(FX_INT32 versionNumber, - FX_INT32 symbolSizeRows, - FX_INT32 symbolSizeColumns, - FX_INT32 dataRegionSizeRows, - FX_INT32 dataRegionSizeColumns, - ECBlocks *ecBlocks); - virtual ~CBC_DataMatrixVersion(); - static void Initialize(); - static void Finalize(); - FX_INT32 GetVersionNumber(); - FX_INT32 GetSymbolSizeRows(); - FX_INT32 GetSymbolSizeColumns(); - FX_INT32 GetDataRegionSizeRows(); - FX_INT32 GetDataRegionSizeColumns(); - FX_INT32 GetTotalCodewords(); - ECBlocks *GetECBlocks(); - static CBC_DataMatrixVersion *GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e); - static void ReleaseAll(); -private: - FX_INT32 m_versionNumber; - FX_INT32 m_symbolSizeRows; - FX_INT32 m_symbolSizeColumns; - FX_INT32 m_dataRegionSizeRows; - FX_INT32 m_dataRegionSizeColumns; - ECBlocks *m_ecBlocks; - FX_INT32 m_totalCodewords; - static CFX_PtrArray* VERSIONS; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h b/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h deleted file mode 100644 index c8a6bdd823..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DataMatrixWriter.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DATAMATRIXWRITER_H_ -#define _BC_DATAMATRIXWRITER_H_ -class CBC_CommonByteMatrix; -class CBC_CommonBitMatrix; -class CBC_DefaultPlacement; -class CBC_SymbolShapeHint; -class CBC_SymbolInfo; -class CBC_TwoDimWriter; -class CBC_DataMatrixWriter; -class CBC_DataMatrixWriter : public CBC_TwoDimWriter -{ -public: - CBC_DataMatrixWriter(); - virtual ~CBC_DataMatrixWriter(); - FX_BYTE* Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BOOL SetErrorCorrectionLevel (FX_INT32 level); - -private: - static CBC_CommonByteMatrix* encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); - FX_INT32 m_iCorrectLevel; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DecoderResult.h b/xfa/src/fxbarcode/src/include/BC_DecoderResult.h deleted file mode 100644 index ff98b2c407..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DecoderResult.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DECODERRESULT_H_ -#define _BC_DECODERRESULT_H_ -class CBC_DecoderResult; -class CBC_DecoderResult : public CFX_Object -{ -public: - CBC_DecoderResult(CFX_ByteArray* rawBytes, CFX_ByteString text, CFX_ByteString ecLevel); - virtual ~CBC_DecoderResult(); - CFX_ByteArray* getRawBytes(); - CFX_ByteString getText(); - CFX_ByteString getECLevel(); - FX_INT32 getErrorsCorrected(); - void setErrorsCorrected(FX_INT32 errorsCorrected); - FX_INT32 getErasures(); - void setErasures(FX_INT32 erasures); - CFX_Object* getOther(); - void setOther(CFX_Object* other); -private: - CFX_ByteArray* m_rawBytes; - CFX_ByteString m_text; - CFX_ByteString m_ecLevel; - FX_INT32 m_errorsCorrected; - FX_INT32 m_erasures; - CFX_Object* m_other; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h b/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h deleted file mode 100644 index ba2da03408..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_DefaultPlacement.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DEFAULTPLACEMENT_H_ -#define _BC_DEFAULTPLACEMENT_H_ -class CBC_DefaultPlacement; -class CBC_DefaultPlacement : public CFX_Object -{ -public: - CBC_DefaultPlacement(CFX_WideString codewords, FX_INT32 numcols, FX_INT32 numrows); - virtual ~CBC_DefaultPlacement(); - - FX_INT32 getNumrows(); - FX_INT32 getNumcols(); - CFX_ByteArray& getBits(); - FX_BOOL getBit(FX_INT32 col, FX_INT32 row); - void setBit(FX_INT32 col, FX_INT32 row, FX_BOOL bit); - FX_BOOL hasBit(FX_INT32 col, FX_INT32 row); - void place(); -private: - CFX_WideString m_codewords; - FX_INT32 m_numrows; - FX_INT32 m_numcols; - CFX_ByteArray m_bits; - void module(FX_INT32 row, FX_INT32 col, FX_INT32 pos, FX_INT32 bit); - void utah(FX_INT32 row, FX_INT32 col, FX_INT32 pos); - void corner1(FX_INT32 pos); - void corner2(FX_INT32 pos); - void corner3(FX_INT32 pos); - void corner4(FX_INT32 pos); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Dimension.h b/xfa/src/fxbarcode/src/include/BC_Dimension.h deleted file mode 100644 index ff4aecace4..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Dimension.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DIMENSION_H_ -#define _BC_DIMENSION_H_ -class CBC_Dimension; -class CBC_Dimension : public CFX_Object -{ -public: - CBC_Dimension(); - CBC_Dimension(FX_INT32 width, FX_INT32 height, FX_INT32 &e); - virtual ~CBC_Dimension(); - FX_INT32 getWidth(); - FX_INT32 getHeight(); - FX_INT32 hashCode(); - CFX_WideString toString(); -private: - FX_INT32 m_width; - FX_INT32 m_height; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h b/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h deleted file mode 100644 index 7e2453a71d..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_EdifactEncoder.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_EDIFACTENCODER_H_ -#define _BC_EDIFACTENCODER_H_ -class CBC_EncoderContext; -class CBC_EdifactEncoder; -class CBC_EdifactEncoder : public CBC_Encoder -{ -public: - CBC_EdifactEncoder(); - virtual ~CBC_EdifactEncoder(); - FX_INT32 getEncodingMode(); - void Encode(CBC_EncoderContext &context, FX_INT32 &e); -private: - static void handleEOD(CBC_EncoderContext &context, CFX_WideString buffer, FX_INT32 &e); - static void encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); - static CFX_WideString encodeToCodewords(CFX_WideString sb, FX_INT32 startPos, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Encoder.h b/xfa/src/fxbarcode/src/include/BC_Encoder.h deleted file mode 100644 index 10ac8763e5..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Encoder.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ENCODER_H_ -#define _BC_ENCODER_H_ -class CBC_EncoderContext; -class CBC_Encoder; -class CBC_Encoder : public CFX_Object -{ -public: - CBC_Encoder(); - virtual ~CBC_Encoder(); - virtual FX_INT32 getEncodingMode() = 0; - virtual void Encode(CBC_EncoderContext &context, FX_INT32 &e) = 0; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_EncoderContext.h b/xfa/src/fxbarcode/src/include/BC_EncoderContext.h deleted file mode 100644 index 0099dbc9f0..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_EncoderContext.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ENCODERCONTEXT_H_ -#define _BC_ENCODERCONTEXT_H_ -class CBC_SymbolShapeHint; -class CBC_SymbolInfo; -class CBC_Dimension; -class CBC_EncoderContext; -class CBC_EncoderContext : public CBC_SymbolShapeHint -{ -public: - CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); - virtual ~CBC_EncoderContext(); - void setSymbolShape(SymbolShapeHint shape); - void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize); - CFX_WideString getMessage(); - void setSkipAtEnd(FX_INT32 count); - FX_WCHAR getCurrentChar(); - FX_WCHAR getCurrent(); - void writeCodewords(CFX_WideString codewords); - void writeCodeword(FX_WCHAR codeword); - FX_INT32 getCodewordCount(); - void signalEncoderChange(FX_INT32 encoding); - void resetEncoderSignal(); - FX_BOOL hasMoreCharacters(); - FX_INT32 getRemainingCharacters(); - void updateSymbolInfo(FX_INT32 &e); - void updateSymbolInfo(FX_INT32 len, FX_INT32 &e); - void resetSymbolInfo(); -public: - CFX_WideString m_msg; - CFX_WideString m_codewords; - FX_INT32 m_pos; - FX_INT32 m_newEncoding; - CBC_SymbolInfo* m_symbolInfo; -private: - FX_INT32 getTotalMessageCharCount(); -private: - SymbolShapeHint m_shape; - CBC_Dimension* m_minSize; - CBC_Dimension* m_maxSize; - FX_INT32 m_skipAtEnd; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h deleted file mode 100644 index 973ff33b8e..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ErrorCorrection.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ERRORCORRECTION_H_ -#define _BC_ERRORCORRECTION_H_ -class CBC_SymbolInfo; -class CBC_ErrorCorrection; -class CBC_ErrorCorrection : public CFX_Object -{ -public: - CBC_ErrorCorrection(); - virtual ~CBC_ErrorCorrection(); - static void Initialize(); - static void Finalize(); - static CFX_WideString encodeECC200(CFX_WideString codewords, CBC_SymbolInfo* symbolInfo, FX_INT32 &e); -private: - static FX_INT32 FACTOR_SETS[]; - static FX_INT32 FACTORS[][100]; - static FX_INT32 MODULO_VALUE; - static FX_INT32 LOG[256]; - static FX_INT32 ALOG[256]; -private: - static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 numECWords, FX_INT32 &e); - static CFX_WideString createECCBlock(CFX_WideString codewords, FX_INT32 start, FX_INT32 len, FX_INT32 numECWords, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h b/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h deleted file mode 100644 index bac9291947..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_FinderPatternInfo.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_FINDERPATTERNINFO_H_ -#define _BC_FINDERPATTERNINFO_H_ -class CBC_QRFinderPattern; -class CBC_QRFinderPatternInfo; -class CBC_QRFinderPatternInfo : public CFX_Object -{ -private: - CBC_QRFinderPattern *m_bottomLeft; - CBC_QRFinderPattern *m_topLeft; - CBC_QRFinderPattern *m_topRight; -public: - CBC_QRFinderPatternInfo(CFX_PtrArray *patternCenters); - virtual ~CBC_QRFinderPatternInfo(); - CBC_QRFinderPattern* GetBottomLeft(); - CBC_QRFinderPattern* GetTopLeft(); - CBC_QRFinderPattern* GetTopRight(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h b/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h deleted file mode 100644 index ef084c075e..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_GlobalHistogramBinarizer.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_GLOBALHISTOGRAMBINARIZER_H_ -#define _BC_GLOBALHISTOGRAMBINARIZER_H_ -class CBC_CommonBinarizer; -class CBC_CommonBitArray; -class CBC_CommonBitMatrix; -class CBC_LuminanceSource; -class CBC_GlobalHistogramBinarizer; -class CBC_GlobalHistogramBinarizer : public CBC_Binarizer -{ -public: - CBC_GlobalHistogramBinarizer(CBC_LuminanceSource *source); - virtual ~CBC_GlobalHistogramBinarizer(); - - void InitArrays(FX_INT32 luminanceSize); - CBC_CommonBitMatrix *GetBlackMatrix(FX_INT32 &e); - CBC_CommonBitArray *GetBlackRow(FX_INT32 y, CBC_CommonBitArray *row, FX_INT32 &e); - static FX_INT32 EstimateBlackPoint(CFX_Int32Array &buckets, FX_INT32 &e); -private: - CFX_ByteArray m_luminance; - CFX_Int32Array m_buckets; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h b/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h deleted file mode 100644 index 170ca9f8fa..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_HighLevelEncoder.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_HIGHLEVALENCODER_H_ -#define _BC_HIGHLEVALENCODER_H_ -class CBC_SymbolShapeHint; -class CBC_HighLevelEncoder; -#define ASCII_ENCODATION 0 -#define C40_ENCODATION 1 -#define TEXT_ENCODATION 2 -#define X12_ENCODATION 3 -#define EDIFACT_ENCODATION 4 -#define BASE256_ENCODATION 5 -class CBC_HighLevelEncoder : public CBC_SymbolShapeHint -{ -public: - CBC_HighLevelEncoder(); - virtual ~CBC_HighLevelEncoder(); - CFX_ByteArray& getBytesForMessage(CFX_WideString msg); - static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e); - static CFX_WideString encodeHighLevel(CFX_WideString msg, CFX_WideString ecLevel, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_INT32 &e); - static FX_INT32 lookAheadTest(CFX_WideString msg, FX_INT32 startpos, FX_INT32 currentMode); - static FX_BOOL isDigit(FX_WCHAR ch); - static FX_BOOL isExtendedASCII(FX_WCHAR ch); - static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); - static void illegalCharacter(FX_WCHAR c, FX_INT32 &e); - -public: - static FX_WCHAR LATCH_TO_C40; - static FX_WCHAR LATCH_TO_BASE256; - static FX_WCHAR UPPER_SHIFT; - static FX_WCHAR LATCH_TO_ANSIX12; - static FX_WCHAR LATCH_TO_TEXT; - static FX_WCHAR LATCH_TO_EDIFACT; - static FX_WCHAR C40_UNLATCH; - static FX_WCHAR X12_UNLATCH; -private: - static FX_WCHAR PAD; - static FX_WCHAR MACRO_05; - static FX_WCHAR MACRO_06; - static const wchar_t* MACRO_05_HEADER; - static const wchar_t* MACRO_06_HEADER; - static const wchar_t MACRO_TRAILER; - CFX_ByteArray m_bytearray; -private: - static FX_WCHAR randomize253State(FX_WCHAR ch, FX_INT32 codewordPosition); - static FX_INT32 findMinimums(CFX_FloatArray &charCounts, CFX_Int32Array &intCharCounts, FX_INT32 min, CFX_ByteArray &mins); - static FX_INT32 getMinimumCount(CFX_ByteArray &mins); - static FX_BOOL isNativeC40(FX_WCHAR ch); - static FX_BOOL isNativeText(FX_WCHAR ch); - static FX_BOOL isNativeX12(FX_WCHAR ch); - static FX_BOOL isX12TermSep(FX_WCHAR ch); - static FX_BOOL isNativeEDIFACT(FX_WCHAR ch); - static FX_BOOL isSpecialB256(FX_WCHAR ch); - -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h b/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h deleted file mode 100644 index 6aa85101c9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_LuminanceSource.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_LUMINANCESOURCE_H -#define _BC_LUMINANCESOURCE_H -class CBC_LuminanceSource; -class CBC_LuminanceSource : public CFX_Object -{ -public: - CBC_LuminanceSource(FX_INT32 width, FX_INT32 height); - virtual ~CBC_LuminanceSource(); - FX_INT32 GetWidth(); - FX_INT32 GetHeight(); - - virtual CFX_ByteArray *GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e) = 0; - virtual CFX_ByteArray *GetMatrix() = 0; - virtual FX_BOOL IsCropSupported() - { - return FALSE; - } - virtual FX_BOOL IsRotateSupported() - { - return FALSE; - } - - virtual CBC_LuminanceSource *RotateCounterClockwise(FX_INT32 &e) = 0; -protected: - FX_INT32 m_width; - FX_INT32 m_height; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDReader.h b/xfa/src/fxbarcode/src/include/BC_OneDReader.h deleted file mode 100644 index 8645c9edf9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OneDReader.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDREADER_H_ -#define _BC_ONEDREADER_H_ -class CBC_Reader; -class CBC_BinaryBitmap; -class CBC_CommonBitArray; -class CBC_OneDReader; -class CBC_OneDReader : public CBC_Reader -{ -public: - CBC_OneDReader(); - virtual ~CBC_OneDReader(); - virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); - virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); - virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e) - { - return ""; - } -private: - CFX_ByteString DeDecode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); - -protected: - const static FX_INT32 INTEGER_MATH_SHIFT; - const static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; - void RecordPattern(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); - void RecordPatternInReverse(CBC_CommonBitArray *row, FX_INT32 start, CFX_Int32Array *counters, FX_INT32 &e); - FX_INT32 PatternMatchVariance(CFX_Int32Array *counters, const FX_INT32 *pattern, FX_INT32 maxIndividualVariance); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDimReader.h b/xfa/src/fxbarcode/src/include/BC_OneDimReader.h deleted file mode 100644 index bb10060ba3..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OneDimReader.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDUPCEANREADER_H_ -#define _BC_ONEDUPCEANREADER_H_ -class CBC_OneDReader; -class CBC_CommonBitArray; -class CBC_OneDimReader; -class CBC_OneDimReader : public CBC_OneDReader -{ -private: - const static FX_INT32 MAX_AVG_VARIANCE; - const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; - - FX_BOOL CheckStandardUPCEANChecksum(CFX_ByteString &s, FX_INT32 &e); -public: - const static FX_INT32 START_END_PATTERN[3]; - const static FX_INT32 MIDDLE_PATTERN[5]; - const static FX_INT32 L_PATTERNS[10][4]; - const static FX_INT32 L_AND_G_PATTERNS[20][4]; - CBC_OneDimReader(); - virtual ~CBC_OneDimReader(); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); -protected: - CFX_Int32Array *FindStartGuardPattern(CBC_CommonBitArray *row, FX_INT32 &e); - virtual FX_BOOL CheckChecksum(CFX_ByteString &s, FX_INT32 &e); - CFX_Int32Array *FindGuardPattern(CBC_CommonBitArray *row, FX_INT32 rowOffset, FX_BOOL whiteFirst, CFX_Int32Array *pattern, FX_INT32 &e); - FX_INT32 DecodeDigit(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, const FX_INT32* patterns, FX_INT32 patternLength, FX_INT32 &e); - virtual FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e) - { - return 0; - } - virtual CFX_Int32Array *DecodeEnd(CBC_CommonBitArray *row, FX_INT32 endStart, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h b/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h deleted file mode 100644 index cd5d937aca..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OneDimWriter.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDIMWRITER_H_ -#define _BC_ONEDIMWRITER_H_ -class CBC_Writer; -class CBC_CommonBitMatrix; -class CBC_OneDimWriter; -class CBC_OneDimWriter : public CBC_Writer -{ -public: - CBC_OneDimWriter(); - virtual ~CBC_OneDimWriter(); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - virtual FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e) - { - return NULL; - }; - virtual void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_WSTR contents, FX_INT32 &e); - virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_WSTR contents, FX_INT32 &e); - virtual FX_BOOL CheckContentValidity(FX_WSTR contents) - { - return TRUE; - }; - virtual CFX_WideString FilterContents(FX_WSTR contents) - { - return CFX_WideString(); - } - virtual CFX_WideString RenderTextContents(FX_WSTR contents) - { - return CFX_WideString(); - } - virtual void SetPrintChecksum(FX_BOOL checksum); - virtual void SetDataLength(FX_INT32 length); - virtual void SetCalcChecksum(FX_INT32 state); - virtual void SetFontSize(FX_FLOAT size); - virtual void SetFontStyle(FX_INT32 style); - virtual void SetFontColor(FX_ARGB color); - virtual FX_BOOL SetFont(CFX_Font * cFont); -protected: - FX_BOOL m_bPrintChecksum; - FX_INT32 m_iDataLenth; - FX_BOOL m_bCalcChecksum; - CFX_Font* m_pFont; - FX_FLOAT m_fFontSize; - FX_INT32 m_iFontStyle; - FX_DWORD m_fontColor; - BC_TEXT_LOC m_locTextLoc; - FX_INT32 m_iContentLen; - FX_BOOL m_bLeftPadding; - FX_BOOL m_bRightPadding; - CBC_CommonBitMatrix* m_output; - FX_INT32 m_barWidth; - FX_INT32 m_multiple; - FX_FLOAT m_outputHScale; - void CalcTextInfo(const CFX_ByteString &text, FXTEXT_CHARPOS *charPos, CFX_Font *cFont, FX_FLOAT geWidth, FX_INT32 fontSize, FX_FLOAT &charsLen); - virtual void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice *device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); - virtual void ShowBitmapChars(CFX_DIBitmap *pOutBitmap, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); - virtual void ShowDeviceChars(CFX_RenderDevice *device, const CFX_Matrix* matrix, const CFX_ByteString str, FX_FLOAT geWidth, FXTEXT_CHARPOS* pCharPos, FX_FLOAT locX, FX_FLOAT locY, FX_INT32 barWidth); - FX_INT32 AppendPattern(FX_BYTE* target, FX_INT32 pos, const FX_INT32* pattern, FX_INT32 patternLength, FX_INT32 startColor, FX_INT32 &e); - FX_WCHAR Upper(FX_WCHAR ch); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h deleted file mode 100644 index 1d03491841..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarReader.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODABARREADER_H_ -#define _BC_ONEDCODABARREADER_H_ -class CBC_CommonBitArray; -class CBC_OneDReader; -class CBC_OnedCodaBarReader; -class CBC_OnedCodaBarReader : public CBC_OneDReader -{ -public: - CBC_OnedCodaBarReader(); - virtual ~CBC_OnedCodaBarReader(); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); - CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); - FX_BOOL ArrayContains(const FX_CHAR array[], FX_CHAR key); - FX_CHAR ToNarrowWidePattern(CFX_Int32Array *counter); - static FX_LPCSTR ALPHABET_STRING; - - - const static FX_INT32 CHARACTER_ENCODINGS[22]; - - const static FX_INT32 minCharacterLength; - - const static FX_CHAR STARTEND_ENCODING[8]; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h b/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h deleted file mode 100644 index b81839ca4a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCodaBarWriter.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODABARWRITER_H_ -#define _BC_ONEDCODABARWRITER_H_ -enum BC_TEXT_LOC; -class CBC_OneDimWriter; -class CBC_OnedCodaBarWriter; -class CBC_OnedCodaBarWriter : public CBC_OneDimWriter -{ -public: - CBC_OnedCodaBarWriter(); - virtual ~CBC_OnedCodaBarWriter(); - FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - CFX_WideString encodedContents(FX_WSTR contents); - FX_BOOL CheckContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - FX_BOOL SetStartChar(FX_CHAR start); - FX_BOOL SetEndChar(FX_CHAR end); - void SetDataLength(FX_INT32 length); - FX_BOOL SetTextLocation(BC_TEXT_LOC location); - FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); - FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent); -private: - void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - const static FX_CHAR START_END_CHARS[]; - const static FX_CHAR CONTENT_CHARS[]; - FX_CHAR m_chStart; - FX_CHAR m_chEnd; - FX_INT32 m_iWideNarrRatio; - -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h deleted file mode 100644 index 94e1a6388b..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCode128Reader.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODA128READER_H_ -#define _BC_ONEDCODA128READER_H_ -class CBC_OneDReader; -class CBC_CommonBitArray; -class CBC_OnedCoda128Reader; -class CBC_OnedCode128Reader : public CBC_OneDReader -{ -public: - CBC_OnedCode128Reader(); - virtual ~CBC_OnedCode128Reader(); - virtual CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); - const static FX_INT32 CODE_PATTERNS[107][7]; - const static FX_INT32 MAX_AVG_VARIANCE; - const static FX_INT32 MAX_INDIVIDUAL_VARIANCE; - - const static FX_INT32 CODE_SHIFT; - const static FX_INT32 CODE_CODE_C; - const static FX_INT32 CODE_CODE_B; - const static FX_INT32 CODE_CODE_A; - const static FX_INT32 CODE_FNC_1; - const static FX_INT32 CODE_FNC_2; - const static FX_INT32 CODE_FNC_3; - const static FX_INT32 CODE_FNC_4_A; - const static FX_INT32 CODE_FNC_4_B ; - - const static FX_INT32 CODE_START_A; - const static FX_INT32 CODE_START_B; - const static FX_INT32 CODE_START_C; - const static FX_INT32 CODE_STOP; -private: - CFX_Int32Array *FindStartPattern(CBC_CommonBitArray *row, FX_INT32 &e); - FX_INT32 DecodeCode(CBC_CommonBitArray *row, CFX_Int32Array *counters, FX_INT32 rowOffset, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h deleted file mode 100644 index daa48eca51..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCode128Writer.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODA128WRITER_H_ -#define _BC_ONEDCODA128WRITER_H_ -class CBC_OneDimWriter; -class CBC_OnedCoda128Writer; -class CBC_OnedCode128Writer : public CBC_OneDimWriter -{ -public: - CBC_OnedCode128Writer(); - CBC_OnedCode128Writer(BC_TYPE type); - virtual ~CBC_OnedCode128Writer(); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength , FX_INT32 &e); - FX_BOOL CheckContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - FX_BOOL SetTextLocation(BC_TEXT_LOC location); - BC_TYPE GetType(); -private: - FX_BOOL IsDigits(const CFX_ByteString &contents, FX_INT32 start, FX_INT32 length); - FX_INT32 Encode128B(const CFX_ByteString &contents, CFX_PtrArray &patterns); - FX_INT32 Encode128C(const CFX_ByteString &contents, CFX_PtrArray &patterns); - BC_TYPE m_codeFormat; - const static FX_INT32 CODE_START_B; - const static FX_INT32 CODE_START_C; - const static FX_INT32 CODE_CODE_B; - const static FX_INT32 CODE_CODE_C; - const static FX_INT32 CODE_STOP; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h deleted file mode 100644 index 81fd6b79e9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCode39Reader.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODA39READER_H_ -#define _BC_ONEDCODA39READER_H_ -class CBC_OneDReader; -class CBC_CommonBitArray; -class CBC_OnedCoda39Reader; -class CBC_OnedCode39Reader : public CBC_OneDReader -{ -public: - static FX_LPCSTR ALPHABET_STRING; - static FX_LPCSTR CHECKSUM_STRING; - const static FX_INT32 CHARACTER_ENCODINGS[44]; - const static FX_INT32 ASTERISK_ENCODING; - CBC_OnedCode39Reader(); - CBC_OnedCode39Reader(FX_BOOL usingCheckDigit); - CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode); - virtual ~CBC_OnedCode39Reader(); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); -private: - FX_BOOL m_usingCheckDigit; - FX_BOOL m_extendedMode; - CFX_Int32Array *FindAsteriskPattern(CBC_CommonBitArray *row, FX_INT32 &e); - FX_INT32 ToNarrowWidePattern(CFX_Int32Array *counters); - FX_CHAR PatternToChar(FX_INT32 pattern, FX_INT32 &e); - CFX_ByteString DecodeExtended(CFX_ByteString &encoded, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h deleted file mode 100644 index b37d9d8e19..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedCode39Writer.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDCODA39WRITER_H_ -#define _BC_ONEDCODA39WRITER_H_ -enum BC_TEXT_LOC; -class CBC_OneDimWriter; -class CBC_OnedCoda39Writer; -class CBC_OnedCode39Writer : public CBC_OneDimWriter -{ -public: - CBC_OnedCode39Writer(); - CBC_OnedCode39Writer(FX_BOOL extendedMode); - virtual ~CBC_OnedCode39Writer(); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BYTE *Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); - void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - CFX_WideString encodedContents(FX_WSTR contents, FX_INT32 &e); - FX_BOOL CheckContentValidity(FX_WSTR contents); - FX_BOOL CheckExtendedContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - CFX_WideString FilterExtendedContents(FX_WSTR contents); - CFX_WideString RenderTextContents(FX_WSTR contents); - CFX_WideString RenderExtendedTextContents(FX_WSTR contents); - FX_BOOL SetTextLocation(BC_TEXT_LOC loction); - FX_BOOL SetWideNarrowRatio(FX_INT32 ratio); -private: - void ToIntArray(FX_INT32 a, FX_INT32 *toReturn); - FX_CHAR CalcCheckSum(const CFX_ByteString &contents, FX_INT32 &e); - FX_INT32 m_iWideNarrRatio; - FX_BOOL m_extendedMode; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h deleted file mode 100644 index 9afb9b6418..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Reader.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDEAN13READER_H_ -#define _BC_ONEDEAN13READER_H_ -class CBC_OneDimReader; -class CBC_CommonBitArray; -class CBC_OnedEAN13Reader; -class CBC_OnedEAN13Reader : public CBC_OneDimReader -{ -public: - const static FX_INT32 FIRST_DIGIT_ENCODINGS[10]; - CBC_OnedEAN13Reader(); - virtual ~CBC_OnedEAN13Reader(); -private: - void DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e); -protected: - FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); - friend class CBC_OnedUPCAReader; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h deleted file mode 100644 index 2353cfda95..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedEAN13Writer.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDEAN13WRITER_H_ -#define _BC_ONEDEAN13WRITER_H_ -class CBC_OneDimWriter; -class CBC_OnedEAN13Writer; -class CBC_OnedEAN13Writer : public CBC_OneDimWriter -{ -private: - FX_INT32 m_codeWidth; -public: - CBC_OnedEAN13Writer(); - virtual ~CBC_OnedEAN13Writer(); - - FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, - FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BYTE* Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); - void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - FX_BOOL CheckContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - FX_INT32 CalcChecksum(const CFX_ByteString &contents); -protected: - void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h deleted file mode 100644 index a32bb63083..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Reader.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDEAN8READER_H_ -#define _BC_ONEDEAN8READER_H_ -class CBC_OneDimReader; -class CBC_CommonBitArray; -class CBC_OnedEAN8Reader; -class CBC_OnedEAN8Reader : public CBC_OneDimReader -{ -public: - CBC_OnedEAN8Reader(); - virtual ~CBC_OnedEAN8Reader(); -protected: - FX_INT32 DecodeMiddle(CBC_CommonBitArray*, CFX_Int32Array *startRange, CFX_ByteString &result, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h b/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h deleted file mode 100644 index 2b55734538..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedEAN8Writer.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDEAN8WRITER_H_ -#define _BC_ONEDEAN8WRITER_H_ -enum BC_TEXT_LOC; -class CBC_OneDimWriter; -class CBC_OnedEAN8Writer; -class CBC_OnedEAN8Writer : public CBC_OneDimWriter -{ -private: - FX_INT32 m_codeWidth; -public: - CBC_OnedEAN8Writer(); - virtual ~CBC_OnedEAN8Writer(); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight , FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints , FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, FX_INT32 &outLength, FX_INT32 &e); - void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - FX_BOOL CheckContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - void SetDataLength(FX_INT32 length); - FX_BOOL SetTextLocation(BC_TEXT_LOC location); - FX_INT32 CalcChecksum(const CFX_ByteString &contents); -protected: - - void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h b/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h deleted file mode 100644 index 5df6c739ff..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedUPCAReader.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDUPCAREADER_H_ -#define _BC_ONEDUPCAREADER_H_ -class CBC_BinaryBitmap; -class CBC_CommonBitArray; -class CBC_OneDimReader; -class CBC_OnedEAN13Reader; -class CBC_OnedUPCAReader; -class CBC_OnedUPCAReader : public CBC_OneDimReader -{ -private: - CBC_OnedEAN13Reader *m_ean13Reader; -public: - CBC_OnedUPCAReader(); - virtual ~CBC_OnedUPCAReader(); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, FX_INT32 hints, FX_INT32 &e); - CFX_ByteString DecodeRow(FX_INT32 rowNumber, CBC_CommonBitArray *row, CFX_Int32Array *startGuardRange, FX_INT32 hints, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); - virtual void Init(); -protected: - FX_INT32 DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e); - CFX_ByteString MaybeReturnResult(CFX_ByteString &result, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h b/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h deleted file mode 100644 index 4174ceb36e..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_OnedUPCAWriter.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_ONEDUPCAWRITER_H_ -#define _BC_ONEDUPCAWRITER_H_ -class CBC_Writer; -class CBC_OnedEAN13Writer; -class CBC_OnedUPCAWriter; -class CBC_OnedUPCAWriter : public CBC_OneDimWriter -{ -private: - CBC_OnedEAN13Writer *m_subWriter; -public: - CBC_OnedUPCAWriter(); - virtual ~CBC_OnedUPCAWriter(); - virtual void Init(); - FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE* Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - void RenderResult(FX_WSTR contents, FX_BYTE* code, FX_INT32 codeLength, FX_BOOL isDevice, FX_INT32 &e); - FX_BOOL CheckContentValidity(FX_WSTR contents); - CFX_WideString FilterContents(FX_WSTR contents); - FX_INT32 CalcChecksum(const CFX_ByteString &contents); - -protected: - - void ShowChars(FX_WSTR contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, FX_INT32 barWidth, FX_INT32 multiple, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417.h b/xfa/src/fxbarcode/src/include/BC_PDF417.h deleted file mode 100644 index ab31244add..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417_H_ -#define _BC_PDF417_H_ -class CBC_Compaction; -class CBC_BarcodeRow; -class CBC_BarcodeMatrix; -class CBC_PDF417; -class CBC_PDF417 : public CFX_Object -{ -public: - CBC_PDF417(); - CBC_PDF417(FX_BOOL compact); - virtual ~CBC_PDF417(); - CBC_BarcodeMatrix* getBarcodeMatrix(); - void generateBarcodeLogic(CFX_WideString msg, FX_INT32 errorCorrectionLevel, FX_INT32 &e); - void setDimensions(FX_INT32 maxCols, FX_INT32 minCols, FX_INT32 maxRows, FX_INT32 minRows); - void setCompaction(Compaction compaction); - void setCompact(FX_BOOL compact); -private: - static FX_INT32 START_PATTERN; - static FX_INT32 STOP_PATTERN; - static FX_INT32 CODEWORD_TABLE[][1000]; - static FX_FLOAT PREFERRED_RATIO; - static FX_FLOAT DEFAULT_MODULE_WIDTH; - static FX_FLOAT HEIGHT; - CBC_BarcodeMatrix* m_barcodeMatrix; - FX_BOOL m_compact; - Compaction m_compaction; - FX_INT32 m_minCols; - FX_INT32 m_maxCols; - FX_INT32 m_maxRows; - FX_INT32 m_minRows; -private: - static FX_INT32 calculateNumberOfRows(FX_INT32 m, FX_INT32 k, FX_INT32 c); - static FX_INT32 getNumberOfPadCodewords(FX_INT32 m, FX_INT32 k, FX_INT32 c, FX_INT32 r); - static void encodeChar(FX_INT32 pattern, FX_INT32 len, CBC_BarcodeRow* logic); - void encodeLowLevel(CFX_WideString fullCodewords, FX_INT32 c, FX_INT32 r, FX_INT32 errorCorrectionLevel, CBC_BarcodeMatrix* logic); - CFX_Int32Array* determineDimensions(FX_INT32 sourceCodeWords, FX_INT32 errorCorrectionCodeWords, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h deleted file mode 100644 index d8a0c5d0ae..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMatrix.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BARCODEMATRIX_H_ -#define _BC_BARCODEMATRIX_H_ -class CBC_BarcodeRow; -class CBC_BarcodeMatrix; -class CBC_BarcodeMatrix : public CFX_Object -{ -public: - CBC_BarcodeMatrix(); - CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width); - virtual ~CBC_BarcodeMatrix(); - void set(FX_INT32 x, FX_INT32 y, FX_BYTE value); - void setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black); - void startRow(); - CBC_BarcodeRow* getCurrentRow(); - CFX_ByteArray& getMatrix(); - CFX_ByteArray& getScaledMatrix(FX_INT32 scale); - CFX_ByteArray& getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale); - FX_INT32 getWidth(); - FX_INT32 getHeight(); -private: - CFX_PtrArray m_matrix; - CFX_ByteArray m_matrixOut; - FX_INT32 m_currentRow; - FX_INT32 m_height; - FX_INT32 m_width; - FX_INT32 m_outWidth; - FX_INT32 m_outHeight; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h deleted file mode 100644 index 62b1282827..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeMetadata.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BARCODEMETADATA_H_ -#define _BC_BARCODEMETADATA_H_ -class CBC_BarcodeMetadata; -class CBC_BarcodeMetadata : public CFX_Object -{ -public: - CBC_BarcodeMetadata(FX_INT32 columnCount, FX_INT32 rowCountUpperPart, FX_INT32 rowCountLowerPart, FX_INT32 errorCorrectionLevel); - virtual ~CBC_BarcodeMetadata(); - FX_INT32 getColumnCount(); - FX_INT32 getErrorCorrectionLevel(); - FX_INT32 getRowCount(); - FX_INT32 getRowCountUpperPart(); - FX_INT32 getRowCountLowerPart(); -private: - FX_INT32 m_columnCount; - FX_INT32 m_errorCorrectionLevel; - FX_INT32 m_rowCountUpperPart; - FX_INT32 m_rowCountLowerPart; - FX_INT32 m_rowCount; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h deleted file mode 100644 index 75fd15b653..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeRow.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BARCODEROW_H_ -#define _BC_BARCODEROW_H_ -class CBC_BarcodeRow; -class CBC_BarcodeRow : public CFX_Object -{ -public: - CBC_BarcodeRow(FX_INT32 width); - virtual ~CBC_BarcodeRow(); - void set(FX_INT32 x, FX_BYTE value); - void set(FX_INT32 x, FX_BOOL black); - void addBar(FX_BOOL black, FX_INT32 width); - CFX_ByteArray& getRow(); - CFX_ByteArray& getScaledRow(FX_INT32 scale); -private: - CFX_ByteArray m_row; - CFX_ByteArray m_output; - FX_INT32 m_currentLocation; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h b/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h deleted file mode 100644 index 1695c8ac5a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417BarcodeValue.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BARCODEVALUE_H_ -#define _BC_BARCODEVALUE_H_ -class CBC_BarcodeValue; -class CBC_BarcodeValue : public CFX_Object -{ -public: - CBC_BarcodeValue(); - virtual ~CBC_BarcodeValue(); - void setValue(FX_INT32 value); - CFX_Int32Array* getValue(); - FX_INT32 getConfidence(FX_INT32 value); -private: - CFX_Int32Array m_keys; - CFX_Int32Array m_values; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h b/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h deleted file mode 100644 index efae2b706f..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417BoundingBox.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_BOUNDINGBOX_H_ -#define _BC_BOUNDINGBOX_H_ -class CBC_CommonBitMatrix; -class CBC_ResultPoint; -class CBC_BoundingBox; -class CBC_BoundingBox : public CFX_Object -{ -public: - CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, FX_INT32 &e); - CBC_BoundingBox(CBC_BoundingBox* boundingBox); - virtual ~CBC_BoundingBox(); - static CBC_BoundingBox* merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, FX_INT32 &e); - CBC_BoundingBox* addMissingRows(FX_INT32 missingStartRows, FX_INT32 missingEndRows, FX_BOOL isLeft, FX_INT32 &e); - void setTopRight(CBC_ResultPoint topRight); - void setBottomRight(CBC_ResultPoint bottomRight); - FX_INT32 getMinX(); - FX_INT32 getMaxX(); - FX_INT32 getMinY(); - FX_INT32 getMaxY(); - CBC_ResultPoint* getTopLeft(); - CBC_ResultPoint* getTopRight(); - CBC_ResultPoint* getBottomLeft(); - CBC_ResultPoint* getBottomRight(); -private: - CBC_CommonBitMatrix* m_image; - CBC_ResultPoint* m_topLeft; - CBC_ResultPoint* m_bottomLeft; - CBC_ResultPoint* m_topRight; - CBC_ResultPoint* m_bottomRight; - FX_INT32 m_minX; - FX_INT32 m_maxX; - FX_INT32 m_minY; - FX_INT32 m_maxY; - void init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight); - void calculateMinMaxValues(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h b/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h deleted file mode 100644 index 93b3cf6bb3..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Codeword.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_CODEWORD_H_ -#define _BC_CODEWORD_H_ -class CBC_Codeword; -class CBC_Codeword : public CFX_Object -{ -public: - CBC_Codeword(FX_INT32 startX, FX_INT32 endX, FX_INT32 bucket, FX_INT32 value); - virtual ~CBC_Codeword(); - FX_BOOL hasValidRowNumber() ; - FX_BOOL isValidRowNumber(FX_INT32 rowNumber); - void setRowNumberAsRowIndicatorColumn(); - FX_INT32 getWidth(); - FX_INT32 getStartX(); - FX_INT32 getEndX(); - FX_INT32 getBucket(); - FX_INT32 getValue(); - FX_INT32 getRowNumber(); - void setRowNumber(FX_INT32 rowNumber); - CFX_ByteString toString(); -private: - static FX_INT32 BARCODE_ROW_UNKNOWN; - FX_INT32 m_startX; - FX_INT32 m_endX; - FX_INT32 m_bucket; - FX_INT32 m_value; - FX_INT32 m_rowNumber; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h deleted file mode 100644 index da22683bfa..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417CodewordDecoder.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417CODEWORDDECODER_H_ -#define _BC_PDF417CODEWORDDECODER_H_ -class CBC_PDF417Common; -class CBC_PDF417CodewordDecoder; -#define column 8 -class CBC_PDF417CodewordDecoder : public CFX_Object -{ -public: - CBC_PDF417CodewordDecoder(); - virtual ~CBC_PDF417CodewordDecoder(); - static void Initialize(); - static void Finalize(); - static FX_INT32 getDecodedValue(CFX_Int32Array& moduleBitCount); -private: - static FX_FLOAT RATIOS_TABLE[][8]; - static CFX_Int32Array* sampleBitCounts(CFX_Int32Array& moduleBitCount); - static FX_INT32 getDecodedCodewordValue(CFX_Int32Array& moduleBitCount); - static FX_INT32 getBitValue(CFX_Int32Array& moduleBitCount); - static FX_INT32 getClosestDecodedValue(CFX_Int32Array& moduleBitCount); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Common.h b/xfa/src/fxbarcode/src/include/BC_PDF417Common.h deleted file mode 100644 index 19e3fe57da..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Common.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417COMMON_H_ -#define _BC_PDF417COMMON_H_ -class CBC_PDF417Common; -class CBC_PDF417Common : public CFX_Object -{ -public: - CBC_PDF417Common(); - virtual ~CBC_PDF417Common(); - static FX_INT32 getBitCountSum(CFX_Int32Array& moduleBitCount); - static FX_INT32 getCodeword(FX_DWORD symbol); - static FX_INT32 NUMBER_OF_CODEWORDS; - static FX_INT32 MAX_CODEWORDS_IN_BARCODE; - static FX_INT32 MIN_ROWS_IN_BARCODE; - static FX_INT32 MAX_ROWS_IN_BARCODE; - static FX_INT32 MAX_CODEWORDS_IN_ROW; - static FX_INT32 MODULES_IN_CODEWORD; - static FX_INT32 MODULES_IN_STOP_PATTERN; - static FX_INT32 BARS_IN_MODULE; - static FX_INT32 SYMBOL_TABLE[]; - static FX_INT32 CODEWORD_TABLE[]; -private: - static CFX_Int32Array* EMPTY_INT_ARRAY; - static FX_INT32 findCodewordIndex(FX_DWORD symbol); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h b/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h deleted file mode 100644 index 774a23fbdf..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Compaction.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_COMPACTION_H_ -#define _BC_COMPACTION_H_ -class CBC_Compaction; -enum Compaction { - AUTO, - TEXT, - BYTES, - NUMERIC -}; -class CBC_Compaction : public CFX_Object -{ -public: - CBC_Compaction(); - virtual ~CBC_Compaction(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h deleted file mode 100644 index 64ae2aee53..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417DecodedBitStreamParser.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DECODEDBITSTREAMPARSER_H_ -#define _BC_DECODEDBITSTREAMPARSER_H_ -class CBC_CommonDecoderResult; -class CBC_PDF417ResultMetadata; -class CBC_DecodedBitStreamPaser; -class CBC_DecodedBitStreamPaser : public CFX_Object -{ -public: - CBC_DecodedBitStreamPaser(); - virtual ~CBC_DecodedBitStreamPaser(); - static void Initialize(); - static void Finalize(); - static CBC_CommonDecoderResult* decode(CFX_Int32Array &codewords, CFX_ByteString ecLevel, FX_INT32 &e); - -private: - enum Mode { - ALPHA, - LOWER, - MIXED, - PUNCT, - ALPHA_SHIFT, - PUNCT_SHIFT - }; - static FX_INT32 MAX_NUMERIC_CODEWORDS; - static FX_INT32 PL; - static FX_INT32 LL; - static FX_INT32 AS; - static FX_INT32 ML; - static FX_INT32 AL; - static FX_INT32 PS; - static FX_INT32 PAL; - static FX_CHAR PUNCT_CHARS[29]; - static FX_CHAR MIXED_CHARS[30]; - static FX_INT32 NUMBER_OF_SEQUENCE_CODEWORDS; - static FX_INT32 decodeMacroBlock(CFX_Int32Array &codewords, FX_INT32 codeIndex, CBC_PDF417ResultMetadata* resultMetadata, FX_INT32 &e); - static FX_INT32 textCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); - static void decodeTextCompaction(CFX_Int32Array &textCompactionData, CFX_Int32Array &byteCompactionData, FX_INT32 length, CFX_ByteString &result); - static FX_INT32 byteCompaction(FX_INT32 mode, CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result); - static FX_INT32 numericCompaction(CFX_Int32Array &codewords, FX_INT32 codeIndex, CFX_ByteString &result, FX_INT32 &e); - static CFX_ByteString decodeBase900toBase10(CFX_Int32Array &codewords, FX_INT32 count, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h deleted file mode 100644 index 9c3401459b..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResult.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_EDTECTIONRESULT_H_ -#define _BC_EDTECTIONRESULT_H_ -class CBC_BarcodeMetadata; -class CBC_BoundingBox; -class CBC_Codeword; -class CBC_DetectionResultColumn; -class CBC_DetectionResult; -class CBC_DetectionResult : public CFX_Object -{ -public: - CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata, CBC_BoundingBox* boundingBox); - virtual ~CBC_DetectionResult(); - CFX_PtrArray& getDetectionResultColumns(); - void setBoundingBox(CBC_BoundingBox* boundingBox); - CBC_BoundingBox* getBoundingBox(); - void setDetectionResultColumn(FX_INT32 barcodeColumn, CBC_DetectionResultColumn* detectionResultColumn); - CBC_DetectionResultColumn* getDetectionResultColumn(FX_INT32 barcodeColumn); - CFX_ByteString toString(); - - FX_INT32 getBarcodeColumnCount(); - FX_INT32 getBarcodeRowCount(); - FX_INT32 getBarcodeECLevel(); -private: - static FX_INT32 ADJUST_ROW_NUMBER_SKIP; - CBC_BarcodeMetadata* m_barcodeMetadata; - CFX_PtrArray m_detectionResultColumns; - CBC_BoundingBox* m_boundingBox; - FX_INT32 m_barcodeColumnCount; -private: - void adjustIndicatorColumnRowNumbers(CBC_DetectionResultColumn* detectionResultColumn); - FX_INT32 adjustRowNumbers(); - FX_INT32 adjustRowNumbersByRow(); - FX_INT32 adjustRowNumbersFromBothRI(); - FX_INT32 adjustRowNumbersFromRRI(); - FX_INT32 adjustRowNumbersFromLRI(); - static FX_INT32 adjustRowNumberIfValid(FX_INT32 rowIndicatorRowNumber, FX_INT32 invalidRowCounts, CBC_Codeword* codeword); - void adjustRowNumbers(FX_INT32 barcodeColumn, FX_INT32 codewordsRow, CFX_PtrArray* codewords); - static FX_BOOL adjustRowNumber(CBC_Codeword* codeword, CBC_Codeword* otherCodeword); - - -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h deleted file mode 100644 index eddc3bce6d..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultColumn.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DETECTIONRESULTCOLUMN_H_ -#define _BC_DETECTIONRESULTCOLUMN_H_ -class CBC_Codeword; -class CBC_BoundingBox; -class CBC_DetectionResultColumn; -class CBC_DetectionResultColumn : public CFX_Object -{ -public: - CBC_DetectionResultColumn(CBC_BoundingBox* boundingBox); - virtual ~CBC_DetectionResultColumn(); - CBC_Codeword* getCodewordNearby(FX_INT32 imageRow); - FX_INT32 imageRowToCodewordIndex(FX_INT32 imageRow); - FX_INT32 codewordIndexToImageRow(FX_INT32 codewordIndex); - void setCodeword(FX_INT32 imageRow, CBC_Codeword* codeword); - CBC_Codeword* getCodeword(FX_INT32 imageRow); - CBC_BoundingBox* getBoundingBox(); - CFX_PtrArray* getCodewords(); - CFX_ByteString toString(); -public: - CBC_BoundingBox* m_boundingBox; - CFX_PtrArray* m_codewords; -private: - static FX_INT32 MAX_NEARBY_DISTANCE; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h deleted file mode 100644 index fbdd0f0ec4..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417DetectionResultRowIndicatorColumn.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ -#define _BC_DETECTIONRESULTROWINDICATORCOLUMN_H_ -class CBC_BarcodeMetadata; -class CBC_BoundingBox; -class CBC_DetectionResultRowIndicatorColumn; -class CBC_DetectionResultRowIndicatorColumn : public CBC_DetectionResultColumn -{ -public: - CBC_DetectionResultRowIndicatorColumn(CBC_BoundingBox* boundingBox, FX_BOOL isLeft); - virtual ~CBC_DetectionResultRowIndicatorColumn(); - void setRowNumbers(); - FX_INT32 adjustCompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); - CFX_Int32Array* getRowHeights(FX_INT32 &e); - FX_INT32 adjustIncompleteIndicatorColumnRowNumbers(CBC_BarcodeMetadata barcodeMetadata); - CBC_BarcodeMetadata* getBarcodeMetadata(); - FX_BOOL isLeft(); - CFX_ByteString toString(); -private: - FX_BOOL m_isLeft; - void removeIncorrectCodewords(CFX_PtrArray* codewords, CBC_BarcodeMetadata barcodeMetadata); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h b/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h deleted file mode 100644 index 557559e1f7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Detector.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DETECTOR_H_ -#define _BC_DETECTOR_H_ -class CBC_PDF417DetectorResult; -class CBC_BinaryBitmap; -class CBC_CommonBitMatrix; -class CBC_CommonBitArray; -class CBC_Detector; -class CBC_Detector : public CFX_Object -{ -public: - CBC_Detector(); - virtual ~CBC_Detector(); - static CBC_PDF417DetectorResult* detect(CBC_BinaryBitmap* image, FX_INT32 hints, FX_BOOL multiple, FX_INT32 &e); - static void rotate180(CBC_CommonBitMatrix* bitMatrix); - static CBC_CommonBitArray* mirror(CBC_CommonBitArray* input, CBC_CommonBitArray* result); -private: - static FX_INT32 INDEXES_START_PATTERN[]; - static FX_INT32 INDEXES_STOP_PATTERN[]; - static FX_INT32 INTEGER_MATH_SHIFT; - static FX_INT32 PATTERN_MATCH_RESULT_SCALE_FACTOR; - static FX_INT32 MAX_AVG_VARIANCE; - static FX_INT32 MAX_INDIVIDUAL_VARIANCE; - static FX_INT32 START_PATTERN[]; - static FX_INT32 STOP_PATTERN[]; - static FX_INT32 MAX_PIXEL_DRIFT; - static FX_INT32 MAX_PATTERN_DRIFT; - static FX_INT32 SKIPPED_ROW_COUNT_MAX; - static FX_INT32 ROW_STEP; - static FX_INT32 BARCODE_MIN_HEIGHT; - static CFX_PtrArray* detect(FX_BOOL multiple, CBC_CommonBitMatrix* bitMatrix); - static CFX_PtrArray* findVertices(CBC_CommonBitMatrix* matrix, FX_INT32 startRow, FX_INT32 startColumn); - static void copyToResult(CFX_PtrArray* result, CFX_PtrArray* tmpResult, FX_INT32* destinationIndexes, FX_INT32 destinationLength); - static CFX_PtrArray* findRowsWithPattern(CBC_CommonBitMatrix* matrix, FX_INT32 height, FX_INT32 width, FX_INT32 startRow, FX_INT32 startColumn, FX_INT32* pattern, FX_INT32 patternLength); - static CFX_Int32Array* findGuardPattern(CBC_CommonBitMatrix* matrix, FX_INT32 column, FX_INT32 row, FX_INT32 width, FX_BOOL whiteFirst, FX_INT32* pattern, FX_INT32 patternLength, CFX_Int32Array &counters); - static FX_INT32 patternMatchVariance(CFX_Int32Array &counters, FX_INT32* pattern, FX_INT32 maxIndividualVariance); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h b/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h deleted file mode 100644 index ba557f1541..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417DetectorResult.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417DETECTORRESULT_H_ -#define _BC_PDF417DETECTORRESULT_H_ -class CBC_CommonBitMatrix; -class CBC_PDF417DetectorResult; -class CBC_PDF417DetectorResult : public CFX_Object -{ -public: - CBC_PDF417DetectorResult(CBC_CommonBitMatrix* bits, CFX_PtrArray* points); - virtual ~CBC_PDF417DetectorResult(); - CBC_CommonBitMatrix* getBits() ; - CFX_PtrArray* getPoints(); -private: - CBC_CommonBitMatrix* m_bits; - CFX_PtrArray* m_points; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h b/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h deleted file mode 100644 index 6f8eaffed7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Dimensions.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_DIMENSIONS_H_ -#define _BC_DIMENSIONS_H_ -class CBC_Dimensions; -class CBC_Dimensions : public CFX_Object -{ -public: - CBC_Dimensions(FX_INT32 minCols, FX_INT32 maxCols, FX_INT32 minRows, FX_INT32 maxRows); - virtual ~CBC_Dimensions(); - FX_INT32 getMinCols(); - FX_INT32 getMaxCols(); - FX_INT32 getMinRows(); - FX_INT32 getMaxRows(); -private: - FX_INT32 m_minCols; - FX_INT32 m_maxCols; - FX_INT32 m_minRows; - FX_INT32 m_maxRows; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h deleted file mode 100644 index 4ce8eda7d6..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ECErrorCorrection.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417ECERRORCORRECTION_H_ -#define _BC_PDF417ECERRORCORRECTION_H_ -class CBC_PDF417ECModulusGF; -class CBC_PDF417ECModulusPoly; -class CBC_PDF417ECErrorCorrection; -class CBC_PDF417ECErrorCorrection : public CFX_Object -{ -public: - CBC_PDF417ECErrorCorrection(); - virtual ~CBC_PDF417ECErrorCorrection(); - static void Initialize(FX_INT32 &e); - static void Finalize(); - static FX_INT32 decode(CFX_Int32Array &received, FX_INT32 numECCodewords, CFX_Int32Array &erasures, FX_INT32 &e); -private: - static CBC_PDF417ECModulusGF* m_field; - static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a, CBC_PDF417ECModulusPoly* b, FX_INT32 R, FX_INT32 &e); - static CFX_Int32Array* findErrorLocations(CBC_PDF417ECModulusPoly* errorLocator, FX_INT32 &e); - static CFX_Int32Array* findErrorMagnitudes(CBC_PDF417ECModulusPoly* errorEvaluator, CBC_PDF417ECModulusPoly* errorLocator, CFX_Int32Array &errorLocations, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h deleted file mode 100644 index 7ebe33ecfd..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusGF.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417ECMODULUSGF_H_ -#define _BC_PDF417ECMODULUSGF_H_ -class CBC_PDF417ECModulusPoly; -class CBC_PDF417Common; -class CBC_PDF417ECModulusGF; -class CBC_PDF417ECModulusGF : public CFX_Object -{ -public: - CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e); - virtual ~CBC_PDF417ECModulusGF(); - static void Initialize(FX_INT32 &e); - static void Finalize(); - CBC_PDF417ECModulusPoly* getZero(); - CBC_PDF417ECModulusPoly* getOne(); - CBC_PDF417ECModulusPoly* buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); - FX_INT32 add(FX_INT32 a, FX_INT32 b); - FX_INT32 subtract(FX_INT32 a, FX_INT32 b); - FX_INT32 exp(FX_INT32 a); - FX_INT32 log(FX_INT32 a, FX_INT32 &e); - FX_INT32 inverse(FX_INT32 a, FX_INT32 &e); - FX_INT32 multiply(FX_INT32 a, FX_INT32 b); - FX_INT32 getSize(); - static CBC_PDF417ECModulusGF* PDF417_GF; -private: - CFX_Int32Array m_expTable; - CFX_Int32Array m_logTable; - CBC_PDF417ECModulusPoly* m_zero; - CBC_PDF417ECModulusPoly* m_one; - FX_INT32 m_modulus; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h b/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h deleted file mode 100644 index 9a9d6c16f2..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ECModulusPoly.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417ECMODULUSPOLY_H_ -#define _BC_PDF417ECMODULUSPOLY_H_ -class CBC_PDF417ECModulusGF; -class CBC_PDF417ECModulusPoly; -class CBC_PDF417ECModulusPoly : public CFX_Object -{ -public: - CBC_PDF417ECModulusPoly(CBC_PDF417ECModulusGF* field, CFX_Int32Array &coefficients, FX_INT32 &e); - virtual ~CBC_PDF417ECModulusPoly(); - CFX_Int32Array& getCoefficients(); - CBC_PDF417ECModulusGF* getField(); - FX_INT32 getDegree(); - FX_BOOL isZero(); - FX_INT32 getCoefficient(FX_INT32 degree); - FX_INT32 evaluateAt(FX_INT32 a); - CBC_PDF417ECModulusPoly* add(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); - CBC_PDF417ECModulusPoly* subtract(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); - CBC_PDF417ECModulusPoly* multiply(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); - CBC_PDF417ECModulusPoly* negative(FX_INT32 &e); - CBC_PDF417ECModulusPoly* multiply(FX_INT32 scalar, FX_INT32 &e); - CBC_PDF417ECModulusPoly* multiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); - CFX_PtrArray* divide(CBC_PDF417ECModulusPoly* other, FX_INT32 &e); - CFX_ByteString toString(); -private: - CBC_PDF417ECModulusGF* m_field; - CFX_Int32Array m_coefficients; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h b/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h deleted file mode 100644 index 4e3aee8d26..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ErrorCorrection.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417ERRORCORRECTION_H_ -#define _BC_PDF417ERRORCORRECTION_H_ -class CBC_PDF417ErrorCorrection; -class CBC_PDF417ErrorCorrection : public CFX_Object -{ -public: - CBC_PDF417ErrorCorrection(); - virtual ~CBC_PDF417ErrorCorrection(); - static FX_INT32 getErrorCorrectionCodewordCount(FX_INT32 errorCorrectionLevel, FX_INT32 &e); - static FX_INT32 getRecommendedMinimumErrorCorrectionLevel(FX_INT32 n, FX_INT32 &e); - static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords, FX_INT32 errorCorrectionLevel, FX_INT32 &e); -private: - static FX_INT32 EC_COEFFICIENTS[][2500]; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h deleted file mode 100644 index ed962030ac..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417HighLevelEncoder.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417HIGHLEVELENCODER_H_ -#define _BC_PDF417HIGHLEVELENCODER_H_ - -#include "BC_PDF417Compaction.h" - -class CBC_PDF417HighLevelEncoder : public CFX_Object -{ -public: - static CFX_WideString encodeHighLevel(CFX_WideString msg, Compaction compaction, FX_INT32 &e); - static void Inverse(); - static void Initialize(); - static void Finalize(); -private: - static FX_INT32 TEXT_COMPACTION; - static FX_INT32 BYTE_COMPACTION; - static FX_INT32 NUMERIC_COMPACTION; - static FX_INT32 SUBMODE_PUNCTUATION; - static FX_INT32 LATCH_TO_TEXT; - static FX_INT32 LATCH_TO_BYTE_PADDED; - static FX_INT32 LATCH_TO_NUMERIC; - static FX_INT32 SHIFT_TO_BYTE; - static FX_INT32 LATCH_TO_BYTE; - static FX_BYTE TEXT_MIXED_RAW[]; - static FX_BYTE TEXT_PUNCTUATION_RAW[]; - static FX_INT32 MIXED[128]; - static FX_INT32 PUNCTUATION[128]; - static FX_INT32 encodeText(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb, FX_INT32 initialSubmode); - static void encodeBinary(CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 count, FX_INT32 startmode, CFX_WideString &sb); - static void encodeNumeric(CFX_WideString msg, FX_INT32 startpos, FX_INT32 count, CFX_WideString &sb); - static FX_BOOL isDigit(FX_WCHAR ch); - static FX_BOOL isAlphaUpper(FX_WCHAR ch); - static FX_BOOL isAlphaLower(FX_WCHAR ch); - static FX_BOOL isMixed(FX_WCHAR ch); - static FX_BOOL isPunctuation(FX_WCHAR ch); - static FX_BOOL isText(FX_WCHAR ch); - static FX_INT32 determineConsecutiveDigitCount(CFX_WideString msg, FX_INT32 startpos); - static FX_INT32 determineConsecutiveTextCount(CFX_WideString msg, FX_INT32 startpos); - static FX_INT32 determineConsecutiveBinaryCount(CFX_WideString msg, CFX_ByteArray* bytes, FX_INT32 startpos, FX_INT32 &e); - - friend class PDF417HighLevelEncoder_EncodeNumeric_Test; - friend class PDF417HighLevelEncoder_EncodeBinary_Test; - friend class PDF417HighLevelEncoder_EncodeText_Test; - friend class PDF417HighLevelEncoder_ConsecutiveDigitCount_Test; - friend class PDF417HighLevelEncoder_ConsecutiveTextCount_Test; - friend class PDF417HighLevelEncoder_ConsecutiveBinaryCount_Test; -}; - -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h b/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h deleted file mode 100644 index e6c0236cf7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Reader.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417READER_H_ -#define _BC_PDF417READER_H_ -class CBC_BinaryBitmap; -class CBC_ResultPoint; -class CBC_PDF417Reader; -class CBC_PDF417Reader : public CBC_Reader -{ -public: - CBC_PDF417Reader(); - virtual ~CBC_PDF417Reader(); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_BOOL multiple, FX_INT32 hints, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); -private: - static FX_INT32 getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); - static FX_INT32 getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2); - static FX_INT32 getMaxCodewordWidth(CFX_PtrArray& p); - static FX_INT32 getMinCodewordWidth(CFX_PtrArray& p); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h b/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h deleted file mode 100644 index e6c7780304..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ResultMetadata.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417READER_H_ -#define _BC_PDF417READER_H_ -class CBC_PDF417ResultMetadata; -class CBC_PDF417ResultMetadata : public CFX_Object -{ -public: - CBC_PDF417ResultMetadata(); - virtual ~CBC_PDF417ResultMetadata(); - FX_INT32 getSegmentIndex(); - void setSegmentIndex(FX_INT32 segmentIndex); - CFX_ByteString getFileId(); - void setFileId(CFX_ByteString fileId); - CFX_Int32Array& getOptionalData(); - void setOptionalData(CFX_Int32Array &optionalData); - FX_BOOL isLastSegment(); - void setLastSegment(FX_BOOL lastSegment); -private: - FX_INT32 m_segmentIndex; - CFX_ByteString m_fileId; - CFX_Int32Array m_optionalData; - FX_BOOL m_lastSegment; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h b/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h deleted file mode 100644 index 924e5f798a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417ScanningDecoder.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417SCANNINGDECODER_H_ -#define _BC_PDF417SCANNINGDECODER_H_ -class CBC_CommonDecoderResult; -class CBC_CommonBitMatrix; -class CBC_ErrorCorrection; -class CBC_Codeword; -class CBC_BoundingBox; -class CBC_ResultPoint; -class CBC_BarcodeMetadata; -class CBC_BarcodeValue; -class CBC_DetectionResult; -class CBC_DetectionResultRowIndicatorColumn; -class CBC_PDF417ScanningDecoder; -class CBC_PDF417ScanningDecoder : public CFX_Object -{ -public: - CBC_PDF417ScanningDecoder(); - virtual ~CBC_PDF417ScanningDecoder(); - static void Initialize(); - static void Finalize(); - static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_ResultPoint* imageTopRight, - CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth, FX_INT32 &e); - static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix); -private: - static FX_INT32 CODEWORD_SKEW_SIZE; - static FX_INT32 MAX_ERRORS; - static FX_INT32 MAX_EC_CODEWORDS; - static CBC_PDF417ECErrorCorrection* errorCorrection; - static CBC_DetectionResult* merge(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, FX_INT32 &e); - static CBC_BoundingBox* adjustBoundingBox(CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e); - static FX_INT32 getMax(CFX_Int32Array& values); - static CBC_BarcodeMetadata* getBarcodeMetadata(CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn); - static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoint startPoint, - FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); - static void adjustCodewordCount(CBC_DetectionResult* detectionResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e); - static CBC_CommonDecoderResult* createDecoderResult(CBC_DetectionResult* detectionResult, FX_INT32 &e); - static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureArray, CFX_Int32Array &ambiguousIndexes, - CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e); - static CFX_PtrArray* createBarcodeMatrix(CBC_DetectionResult* detectionResult); - static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn); - static FX_INT32 getStartColumn(CBC_DetectionResult* detectionResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight); - static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, - FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); - static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startColumn, FX_INT32 imageRow); - static FX_INT32 getNumberOfECCodeWords(FX_INT32 barcodeECLevel); - static FX_INT32 adjustCodewordStartColumn(CBC_CommonBitMatrix* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 codewordStartColumn, FX_INT32 imageRow); - static FX_BOOL checkCodewordSkew(FX_INT32 codewordSize, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth); - static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e); - static FX_INT32 correctErrors(CFX_Int32Array &codewords, CFX_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e); - static void verifyCodewordCount(CFX_Int32Array &codewords, FX_INT32 numECCodewords, FX_INT32 &e); - static CFX_Int32Array* getBitCountForCodeword(FX_INT32 codeword); - static FX_INT32 getCodewordBucketNumber(FX_INT32 codeword); - static FX_INT32 getCodewordBucketNumber(CFX_Int32Array& moduleBitCount); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h b/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h deleted file mode 100644 index 5d974f9377..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_PDF417Writer.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_PDF417WRITER_H_ -#define _BC_PDF417WRITER_H_ -class CBC_TwoDimWriter; -class CBC_PDF417Writer; -class CBC_PDF417Writer : public CBC_TwoDimWriter -{ -public: - CBC_PDF417Writer(); - virtual ~CBC_PDF417Writer(); - FX_BYTE * Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE * Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); - void SetTruncated(FX_BOOL truncated); -private: - void rotateArray(CFX_ByteArray& bitarray, FX_INT32 width, FX_INT32 height); - FX_BOOL m_bTruncated; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h deleted file mode 100644 index a52687b6b7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPattern.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRALIGNMENTPATTERN_H_ -#define _BC_QRALIGNMENTPATTERN_H_ -class CBC_CommonBitArray; -class CBC_ResultPoint; -class CBC_REAI013x0x1xDecoder; -class CBC_QRAlignmentPattern : public CBC_ResultPoint -{ -private: - FX_FLOAT m_moduleSize; -public: - CBC_QRAlignmentPattern(FX_FLOAT posX, FX_FLOAT posY, FX_FLOAT estimateModuleSize); - virtual ~CBC_QRAlignmentPattern(); - FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); - FX_FLOAT GetX(); - FX_FLOAT GetY(); - CBC_QRAlignmentPattern *Clone(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h b/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h deleted file mode 100644 index 5471c4e62a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRAlignmentPatternFinder.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRALIGNMENTPATTERNFINDER_H_ -#define _BC_QRALIGNMENTPATTERNFINDER_H_ -class CBC_CommonBitMatrix; -class CBC_QRAlignmentPattern; -class CBC_QRAlignmentPatternFinder; -class CBC_QRAlignmentPatternFinder : public CFX_Object -{ -private: - CBC_CommonBitMatrix *m_image; - CFX_PtrArray m_possibleCenters; - FX_INT32 m_startX; - FX_INT32 m_startY; - FX_INT32 m_width; - FX_INT32 m_height; - FX_FLOAT m_moduleSize; - CFX_Int32Array m_crossCheckStateCount; -public: - CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix *image, FX_INT32 startX, FX_INT32 startY, FX_INT32 width, FX_INT32 height, FX_FLOAT moduleSize); - virtual ~CBC_QRAlignmentPatternFinder(); - FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); - FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 startJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); - CBC_QRAlignmentPattern* Find(FX_INT32 &e); - CBC_QRAlignmentPattern *HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); - static FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h b/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h deleted file mode 100644 index 2e176f63d3..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRBitMatrixParser.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRABITMATRIXPARSER_H_ -#define _BC_QRABITMATRIXPARSER_H_ -class CBC_CommonBitMatrix ; -class CBC_QRCoderVersion; -class CBC_QRCoderFormatInformation; -class CBC_QRDataMask; -class CBC_QRBitMatrixParser; -class CBC_QRBitMatrixParser : public CFX_Object -{ -private: - CBC_CommonBitMatrix *m_bitMatrix; - CBC_CommonBitMatrix *m_tempBitMatrix; - CBC_QRCoderVersion *m_version; - CBC_QRCoderFormatInformation *m_parsedFormatInfo; - FX_INT32 m_dimension; -public: - CBC_QRBitMatrixParser(); - virtual ~CBC_QRBitMatrixParser(); - CBC_QRCoderFormatInformation *ReadFormatInformation(FX_INT32 &e); - CBC_QRCoderVersion *ReadVersion(FX_INT32 &e); - FX_INT32 CopyBit(FX_INT32 i, FX_INT32 j, FX_INT32 versionBits); - CFX_ByteArray *ReadCodewords(FX_INT32 &e); - virtual void Init(CBC_CommonBitMatrix *bitMatrix, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h b/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h deleted file mode 100644 index 71a1ad3dd6..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCodeReader.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODEREADER_H_ -#define _BC_QRCODEREADER_H_ -class CBC_QRDetector; -class CBC_BinaryBitmap; -class CBC_QRCoderDecoder; -class CBC_ResultPoint; -class CBC_ReedSolomonGF256; -class CBC_QRCoderVersion; -class CBC_QRDetector; -class CBC_QRDetectorResult; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderMode; -class CBC_QRDataMask; -class CBC_QRCodeReader; -class CBC_QRCodeReader : public CBC_Reader -{ -private: - CBC_QRCoderDecoder *m_decoder; -public: - CBC_QRCodeReader(); - virtual ~CBC_QRCodeReader(); - CFX_ByteString Decode(CFX_DIBitmap *pBitmap, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); - CFX_ByteString Decode(const CFX_WideString &filename, FX_INT32 hints, FX_INT32 byteModeDecode, FX_INT32 &e); - static void ReleaseAll(); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e); - CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e); - virtual void Init(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h b/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h deleted file mode 100644 index a4a4cbe048..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCodeWriter.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERWRITER_H_ -#define _BC_QRCODERWRITER_H_ -#include "BC_TwoDimWriter.h" -class CBC_TwoDimWriter; -class CBC_MultiBarCodes; -class CBC_QRCoderWriter; -class CBC_QRCodeWriter : public CBC_TwoDimWriter -{ -public: - CBC_QRCodeWriter(); - virtual ~CBC_QRCodeWriter(); - FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e); - FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e); - FX_BOOL SetVersion(FX_INT32 version); - FX_BOOL SetErrorCorrectionLevel(FX_INT32 level); - static void ReleaseAll(); -private: - - FX_INT32 m_iVersion; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoder.h deleted file mode 100644 index 89ce140fbd..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoder.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODER_H_ -#define _BC_QRCODER_H_ -class CBC_QRCoderErrorCorrectionLevel ; -class CBC_QRCoderMode; -class CBC_CommonByteMatrix; -class CBC_QRCoder; -class CBC_QRCoder : public CFX_Object -{ -private: - CBC_QRCoderMode* m_mode; - CBC_QRCoderErrorCorrectionLevel* m_ecLevel; - FX_INT32 m_version; - FX_INT32 m_matrixWidth; - FX_INT32 m_maskPattern; - FX_INT32 m_numTotalBytes; - FX_INT32 m_numDataBytes; - FX_INT32 m_numECBytes; - FX_INT32 m_numRSBlocks; - CBC_CommonByteMatrix* m_matrix; -public: - const static FX_INT32 NUM_MASK_PATTERNS; - CBC_QRCoder(); - virtual ~CBC_QRCoder(); - CBC_QRCoderMode* GetMode(); - CBC_QRCoderErrorCorrectionLevel* GetECLevel(); - FX_INT32 GetVersion(); - FX_INT32 GetMatrixWidth(); - FX_INT32 GetMaskPattern(); - FX_INT32 GetNumTotalBytes(); - FX_INT32 GetNumDataBytes(); - FX_INT32 GetNumECBytes(); - FX_INT32 GetNumRSBlocks(); - CBC_CommonByteMatrix* GetMatrix(); - FX_INT32 At(FX_INT32 x, FX_INT32 y, FX_INT32 &e); - FX_BOOL IsValid(); - - void SetMode(CBC_QRCoderMode* value); - void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel); - void SetVersion(FX_INT32 version); - void SetMatrixWidth(FX_INT32 width); - void SetMaskPattern(FX_INT32 pattern); - void SetNumDataBytes(FX_INT32 bytes); - void SetNumTotalBytes(FX_INT32 value); - void SetNumECBytes(FX_INT32 value); - void SetNumRSBlocks(FX_INT32 block); - void SetMatrix(CBC_CommonByteMatrix* value); - static FX_BOOL IsValidMaskPattern(FX_INT32 maskPattern); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h b/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h deleted file mode 100644 index 6e9abba6c9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderBitVector.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRECODERBITVECTOR_H_ -#define _BC_QRECODERBITVECTOR_H_ -class CBC_QRCoderBitVector; -class CBC_QRCoderBitVector : public CFX_Object -{ -private: - FX_INT32 m_sizeInBits; - FX_BYTE *m_array; - FX_INT32 m_size; - - void AppendByte(FX_INT32 value); -public: - CBC_QRCoderBitVector(); - virtual ~CBC_QRCoderBitVector(); - FX_INT32 At(FX_INT32 index, FX_INT32 &e); - FX_INT32 Size(); - FX_INT32 sizeInBytes(); - void AppendBit(FX_INT32 bit, FX_INT32 &e); - void AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e); - void AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e); - void XOR(CBC_QRCoderBitVector *other, FX_INT32 &e); - FX_BYTE* GetArray(); - void Clear(); - virtual void Init(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h b/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h deleted file mode 100644 index 234ac1a776..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderBlockPair.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERBLOCKPAIR_H_ -#define _BC_QRCODERBLOCKPAIR_H_ -class CBC_CommonByteArray; -class CBC_QRCoderBlockPair; -class CBC_QRCoderBlockPair : public CFX_Object -{ -private: - CBC_CommonByteArray* m_dataBytes; - CBC_CommonByteArray* m_errorCorrectionBytes; -public: - CBC_QRCoderBlockPair(CBC_CommonByteArray* data, CBC_CommonByteArray* errorCorrection); - virtual ~CBC_QRCoderBlockPair(); - - CBC_CommonByteArray* GetDataBytes(); - CBC_CommonByteArray* GetErrorCorrectionBytes(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h deleted file mode 100644 index 355af78180..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderDecoder.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERDECODER_H_ -#define _BC_QRCODERDECODER_H_ -class CBC_CommonBitMatrix; -class CBC_ReedSolomonDecoder; -class CBC_CommonDecoderResult; -class CBC_QRBitMatrixParser; -class CBC_QRCoderVersion; -class CBC_QRDataBlock; -class CBC_QRCoderDecoder; -class CBC_QRCoderDecoder : public CFX_Object -{ -private: - CBC_ReedSolomonDecoder *m_rsDecoder; -public: - CBC_QRCoderDecoder(); - virtual ~CBC_QRCoderDecoder(); - - CBC_CommonDecoderResult* Decode(FX_BOOL* image, FX_INT32 width, FX_INT32 height, FX_INT32 &e); - CBC_CommonDecoderResult* Decode(CBC_CommonBitMatrix* bits, FX_INT32 byteModeDecode, FX_INT32 &e); - void CorrectErrors(CFX_ByteArray* codewordBytes, FX_INT32 numDataCodewords, FX_INT32 &e); - virtual void Init(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h b/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h deleted file mode 100644 index c6494b75cd..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderECB.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERECB_H_ -#define _BC_QRCODERECB_H_ -class CBC_QRCoderECB; -class CBC_QRCoderECB : public CFX_Object -{ -private: - FX_INT32 m_count; - FX_INT32 m_dataCodeWords; -public: - CBC_QRCoderECB(FX_INT32 count, FX_INT32 dataCodeWords); - virtual ~CBC_QRCoderECB(); - FX_INT32 GetCount(); - FX_INT32 GetDataCodeWords(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h b/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h deleted file mode 100644 index 385837510a..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderECBlocks.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERECBLOCKS_H_ -#define _BC_QRCODERECBLOCKS_H_ -class CBC_QRCoderECB; -class CBC_QRCoderECBlocks; -class CBC_QRCoderECBlocks : public CFX_Object -{ -private: - FX_INT32 m_ecCodeWordsPerBlock; - CFX_PtrArray m_ecBlocks; -public: - CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks); - CBC_QRCoderECBlocks(FX_INT32 ecCodeWordsPerBlock, CBC_QRCoderECB* ecBlocks1, CBC_QRCoderECB* ecBlocks2); - virtual ~CBC_QRCoderECBlocks(); - FX_INT32 GetECCodeWordsPerBlock(); - FX_INT32 GetNumBlocks(); - FX_INT32 GetTotalECCodeWords(); - CFX_PtrArray* GetECBlocks(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h b/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h deleted file mode 100644 index 8dea2a6477..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderEncoder.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERENCODER_H_ -#define _BC_QRCODERENCODER_H_ -class Make_Pair; -class CBC_QRCoder; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderMode; -class CBC_QRCoderBitVector; -class CBC_CommonByteArray; -class CBC_CommonByteMatrix; -class CBC_QRCoderEncoder; -class CBC_QRCoderEncoder : public CFX_Object -{ -private: - const static FX_INT32 m_alphaNumbericTable[96]; -public: - CBC_QRCoderEncoder(); - virtual ~CBC_QRCoderEncoder(); - - static void Encode(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e, FX_INT32 versionSpecify = 0); - static void Encode(const CFX_WideString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); - static void EncodeWithSpecifyVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, - CBC_QRCoder *qrCode, FX_INT32 versionSpecify, FX_INT32 &e); - static void EncodeWithAutoVersion(const CFX_ByteString &content, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoder *qrCode, FX_INT32 &e); - static CBC_QRCoderMode* ChooseMode(const CFX_ByteString & content, CFX_ByteString encoding); - static FX_INT32 GetAlphaNumericCode(FX_INT32 code); - static void AppendECI(CBC_QRCoderBitVector* bits); - static void AppendBytes(const CFX_ByteString &content, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); - static void AppendNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void AppendAlphaNumericBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void Append8BitBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, CFX_ByteString encoding, FX_INT32 &e); - static void Append8BitBytes(CFX_ByteArray &bytes, CBC_QRCoderBitVector *bits, FX_INT32 &e); - static void AppendKanjiBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void AppendGBKBytes(const CFX_ByteString &content, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void InitQRCode(FX_INT32 numInputBytes, FX_INT32 versionNumber, - CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); - static void InitQRCode(FX_INT32 numInputBytes, CBC_QRCoderErrorCorrectionLevel* ecLevel, CBC_QRCoderMode* mode, CBC_QRCoder* qrCode, FX_INT32 &e); - static void AppendModeInfo(CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void AppendLengthInfo(FX_INT32 numLetters, FX_INT32 version, CBC_QRCoderMode* mode, CBC_QRCoderBitVector* bits, FX_INT32 &e); - - static void InterleaveWithECBytes(CBC_QRCoderBitVector* bits, FX_INT32 numTotalBytes, FX_INT32 numDataBytes, FX_INT32 numRSBlocks, CBC_QRCoderBitVector* result, FX_INT32 &e); - static void GetNumDataBytesAndNumECBytesForBlockID(FX_INT32 numTotalBytes, FX_INT32 numDataBytes, - FX_INT32 numRSBlocks, FX_INT32 blockID, - FX_INT32 &numDataBytesInBlock, FX_INT32& numECBytesInBlocks); - static CBC_CommonByteArray* GenerateECBytes(CBC_CommonByteArray* dataBytes, FX_INT32 numEcBytesInBlock, FX_INT32 &e); - static FX_INT32 ChooseMaskPattern(CBC_QRCoderBitVector* bits, CBC_QRCoderErrorCorrectionLevel* ecLevel, - FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static FX_INT32 CalculateMaskPenalty(CBC_CommonByteMatrix* matrix); - static void TerminateBits(FX_INT32 numDataBytes, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static FX_INT32 GetSpanByVersion(CBC_QRCoderMode *modeFirst, CBC_QRCoderMode *modeSecond, FX_INT32 versionNum, FX_INT32 &e); - static void MergeString(CFX_PtrArray &result, FX_INT32 versionNum, FX_INT32 &e); - static void SplitString(const CFX_ByteString &content, CFX_PtrArray &result); - static void AppendDataModeLenghInfo(CFX_PtrArray &splitResult, CBC_QRCoderBitVector &headerAndDataBits, CBC_QRCoderMode *tempMode, CBC_QRCoder *qrCode, CFX_ByteString &encoding, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h b/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h deleted file mode 100644 index 2c0ad7b0b7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderErrorCorrectionLevel.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERERRORCORRECTIONLEVEL_H_ -#define _BC_QRCODERERRORCORRECTIONLEVEL_H_ -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderErrorCorrectionLevel : public CFX_Object -{ -private: - FX_INT32 m_ordinal; - FX_INT32 m_bits; - CFX_ByteString m_name; - CBC_QRCoderErrorCorrectionLevel(FX_INT32 ordinal, FX_INT32 bits, FX_CHAR* name); - CBC_QRCoderErrorCorrectionLevel(); -public: - static CBC_QRCoderErrorCorrectionLevel* L; - static CBC_QRCoderErrorCorrectionLevel* M; - static CBC_QRCoderErrorCorrectionLevel* Q; - static CBC_QRCoderErrorCorrectionLevel* H; - virtual ~CBC_QRCoderErrorCorrectionLevel(); - static void Initialize(); - static void Finalize(); - FX_INT32 Ordinal(); - FX_INT32 GetBits(); - CFX_ByteString GetName(); - static void Destroy(); - static CBC_QRCoderErrorCorrectionLevel* ForBits(FX_INT32 bits); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h b/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h deleted file mode 100644 index 9d828c8380..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderFormatInformation.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERFORMATINFORMATION_H_ -#define _BC_QRCODERFORMATINFORMATION_H_ -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderFormatInformation; -class CBC_QRCoderFormatInformation : public CFX_Object -{ -private: - const static FX_INT32 FORMAT_INFO_MASK_QR; - const static FX_INT32 FORMAT_INFO_DECODE_LOOKUP[32][2]; - const static FX_INT32 BITS_SET_IN_HALF_BYTE[16]; - CBC_QRCoderErrorCorrectionLevel* m_errorCorrectLevl; - FX_BYTE m_dataMask; -public: - CBC_QRCoderFormatInformation(FX_INT32 formatInfo); - virtual ~CBC_QRCoderFormatInformation(); - FX_BYTE GetDataMask(); - CBC_QRCoderErrorCorrectionLevel* GetErrorCorrectionLevel(); - - static FX_INT32 NumBitsDiffering(FX_INT32 a, FX_INT32 b); - static CBC_QRCoderFormatInformation* DecodeFormatInformation(FX_INT32 maskedFormatInfo); - static CBC_QRCoderFormatInformation* DoDecodeFormatInformation(FX_INT32 maskedFormatInfo); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h deleted file mode 100644 index 134d344e72..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderMaskUtil.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERMASKUTIL_H_ -#define _BC_QRCODERMASKUTIL_H_ -class CBC_CommonByteMatrix; -class CBC_QRCoderMaskUtil; -class CBC_QRCoderMaskUtil : public CFX_Object -{ -public: - CBC_QRCoderMaskUtil(); - virtual ~CBC_QRCoderMaskUtil(); - static FX_BOOL GetDataMaskBit(FX_INT32 maskPattern, FX_INT32 x, FX_INT32 y, FX_INT32 &e); - - static FX_INT32 ApplyMaskPenaltyRule1(CBC_CommonByteMatrix* matrix); - static FX_INT32 ApplyMaskPenaltyRule2(CBC_CommonByteMatrix* matrix); - static FX_INT32 ApplyMaskPenaltyRule3(CBC_CommonByteMatrix* matrix); - static FX_INT32 ApplyMaskPenaltyRule4(CBC_CommonByteMatrix* matrix); - static FX_INT32 ApplyMaskPenaltyRule1Internal(CBC_CommonByteMatrix* matrix, FX_BOOL isHorizontal); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h deleted file mode 100644 index 23a9d88128..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderMatrixUtil.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERMATRIXUTIL_H_ -#define _BC_QRCODERMATRIXUTIL_H_ -class CBC_CommonByteMatrix; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderBitVector; -class CBC_QRCoderMatrixUtil; -class CBC_QRCoderMatrixUtil : public CFX_Object -{ -private: - const static FX_INT32 POSITION_DETECTION_PATTERN[7][7]; - const static FX_INT32 VERTICAL_SEPARATION_PATTERN[7][1]; - const static FX_INT32 HORIZONTAL_SEPARATION_PATTERN[1][8]; - const static FX_INT32 POSITION_ADJUSTMENT_PATTERN[5][5]; - const static FX_INT32 POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[40][7]; - const static FX_INT32 TYPE_INFO_COORDINATES[15][2]; - const static FX_INT32 VERSION_INFO_POLY; - const static FX_INT32 TYPE_INFO_POLY; - const static FX_INT32 TYPE_INFO_MASK_PATTERN; -public: - CBC_QRCoderMatrixUtil(); - virtual ~CBC_QRCoderMatrixUtil(); - static void ClearMatrix(CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void BuildMatrix(CBC_QRCoderBitVector* dataBits, CBC_QRCoderErrorCorrectionLevel* ecLevel, - FX_INT32 version, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedBasicPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedTypeInfo(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_CommonByteMatrix *matrix, FX_INT32 &e); - static void EmbedDataBits(CBC_QRCoderBitVector* dataBits, FX_INT32 maskPattern, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void MaybeEmbedVersionInfo(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static FX_INT32 FindMSBSet(FX_INT32 value); - static FX_INT32 CalculateBCHCode(FX_INT32 code, FX_INT32 poly); - static void MakeTypeInfoBits(CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 maskPattern, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static void MakeVersionInfoBits(FX_INT32 version, CBC_QRCoderBitVector* bits, FX_INT32 &e); - static FX_BOOL IsEmpty(FX_INT32 value); - static FX_BOOL IsValidValue(FX_INT32 value); - static void EmbedTimingPatterns(CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedDarkDotAtLeftBottomCorner(CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedHorizontalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedVerticalSeparationPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedPositionAdjustmentPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedPositionDetectionPattern(FX_INT32 xStart, FX_INT32 yStart, CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void EmbedPositionDetectionPatternsAndSeparators(CBC_CommonByteMatrix* matrix, FX_INT32 &e); - static void MaybeEmbedPositionAdjustmentPatterns(FX_INT32 version, CBC_CommonByteMatrix* matrix, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h b/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h deleted file mode 100644 index 71cea9fc78..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderMode.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERMODE_H_ -#define _BC_QRCODERMODE_H_ -class CBC_QRCoderVersion; -class CBC_QRCoderMode; -class CBC_QRCoderMode : public CFX_Object -{ -private: - FX_INT32* m_characterCountBitsForVersions; - FX_INT32 m_bits; - CFX_ByteString m_name; - CBC_QRCoderMode(FX_INT32 *characterCountBitsForVersions, FX_INT32 x1, FX_INT32 x2, FX_INT32 x3, FX_INT32 bits, CFX_ByteString name); - CBC_QRCoderMode(); -public: - static CBC_QRCoderMode* sBYTE; - static CBC_QRCoderMode* sNUMERIC; - static CBC_QRCoderMode* sALPHANUMERIC; - static CBC_QRCoderMode* sKANJI; - static CBC_QRCoderMode* sECI; - static CBC_QRCoderMode* sGBK; - static CBC_QRCoderMode* sTERMINATOR; - static CBC_QRCoderMode* sFNC1_FIRST_POSITION; - static CBC_QRCoderMode* sFNC1_SECOND_POSITION; - static CBC_QRCoderMode* sSTRUCTURED_APPEND; - virtual ~CBC_QRCoderMode(); - - static void Initialize(); - static void Finalize(); - static CBC_QRCoderMode* ForBits(FX_INT32 bits, FX_INT32 &e); - FX_INT32 GetCharacterCountBits(CBC_QRCoderVersion* version, FX_INT32 &e); - FX_INT32 GetBits(); - CFX_ByteString GetName(); - static void Destroy(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h b/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h deleted file mode 100644 index b693dd6dd7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRCoderVersion.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRCODERVERSION_H_ -#define _BC_QRCODERVERSION_H_ -class CBC_QRCoderECBlocks; -class CBC_CommonBitMatrix; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRCoderVersion; -class CBC_QRCoderVersion : public CFX_Object -{ -private: - const static FX_INT32 VERSION_DECODE_INFO[34]; - static CFX_PtrArray *VERSION; - FX_INT32 m_versionNumber; - FX_INT32 m_totalCodeWords; - CFX_Int32Array m_alignmentPatternCenters; - CFX_PtrArray m_ecBlocks; - - CBC_QRCoderVersion(); - CBC_QRCoderVersion(FX_INT32 versionNumber, CBC_QRCoderECBlocks* ecBlocks1, CBC_QRCoderECBlocks* ecBlocks2, - CBC_QRCoderECBlocks* ecBlocks3, CBC_QRCoderECBlocks* ecBlocks4); -public: - virtual ~CBC_QRCoderVersion(); - static void Initialize(); - static void Finalize(); - - FX_INT32 GetVersionNumber(); - FX_INT32 GetTotalCodeWords(); - FX_INT32 GetDimensionForVersion(); - CBC_CommonBitMatrix *BuildFunctionPattern(FX_INT32 &e); - CFX_Int32Array* GetAlignmentPatternCenters(); - CBC_QRCoderECBlocks* GetECBlocksForLevel(CBC_QRCoderErrorCorrectionLevel *ecLevel); - static CBC_QRCoderVersion* GetVersionForNumber(FX_INT32 versionNumber, FX_INT32 &e); - static CBC_QRCoderVersion* GetProvisionalVersionForDimension(FX_INT32 dimension, FX_INT32 &e); - static CBC_QRCoderVersion* DecodeVersionInformation(FX_INT32 versionBits, FX_INT32 &e); - static void Destroy(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h b/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h deleted file mode 100644 index 4f68c7a9f3..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRDataBlock.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRDATABLOCK_H_ -#define _BC_QRDATABLOCK_H_ -class CBC_QRCoderVersion; -class CBC_QRCoderECBlocks; -class CBC_QRCoderECB; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_QRDataBlock; -class CBC_QRDataBlock : public CFX_Object -{ -private: - FX_INT32 m_numDataCodewords; - CFX_ByteArray *m_codewords; - CBC_QRDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords); -public: - virtual ~CBC_QRDataBlock(); - FX_INT32 GetNumDataCodewords(); - CFX_ByteArray* GetCodewords(); - static CFX_PtrArray *GetDataBlocks(CFX_ByteArray* rawCodewords, - CBC_QRCoderVersion *version, CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDataMask.h b/xfa/src/fxbarcode/src/include/BC_QRDataMask.h deleted file mode 100644 index 6fcc09d556..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRDataMask.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRDATAMASK_H_ -#define _BC_QRDATAMASK_H_ -class CBC_CommonBitMatrix; -class CBC_QRDataMask; -class CBC_QRDataMask : public CFX_Object -{ -public: - static CFX_PtrArray *DATA_MASKS; - CBC_QRDataMask(); - virtual ~CBC_QRDataMask(); - static void Initialize(); - static void Finalize(); - virtual FX_BOOL IsMasked(FX_INT32 i, FX_INT32 j) = 0; - void UnmaskBitMatirx(CBC_CommonBitMatrix *bits, FX_INT32 dimension); - static CBC_QRDataMask* ForReference(FX_INT32 reference, FX_INT32 &e); - static FX_INT32 BuildDataMasks(); - static void Destroy(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h b/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h deleted file mode 100644 index b64485f788..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRDecodedBitStreamParser.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRDECODEDBITSTREAMPARSER_H_ -#define _BC_QRDECODEDBITSTREAMPARSER_H_ -class CBC_CommonDecoderResult; -class CBC_QRCoderErrorCorrectionLevel; -class CBC_CommonBitSource; -class CBC_QRCoderVersion; -class CBC_CommonCharacterSetECI; -class CBC_QRDecodedBitStreamParser; -class CBC_QRDecodedBitStreamParser : public CFX_Object -{ -private: - const static FX_CHAR ALPHANUMERIC_CHARS[45]; - static FX_LPCSTR UTF_8; - CBC_QRDecodedBitStreamParser(); -public: - virtual ~CBC_QRDecodedBitStreamParser(); - static CBC_CommonDecoderResult* Decode(CFX_ByteArray *bytes, CBC_QRCoderVersion *version, - CBC_QRCoderErrorCorrectionLevel* ecLevel, FX_INT32 byteModeDecode, FX_INT32 &e); - - static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes); - static FX_INT32 ParseECIValue(CBC_CommonBitSource* bits, FX_INT32 &e); - static void DecodeGBKSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); - static void DecodeKanjiSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); - static void DecodeNumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_INT32 &e); - static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, FX_BOOL fac1InEffect, FX_INT32 &e); - static void DecodeByteSegment(CBC_CommonBitSource* bits, CFX_ByteString &result, FX_INT32 count, CBC_CommonCharacterSetECI *currentCharacterSetECI, - CFX_Int32Array *byteSegments, FX_INT32 byteModeDecode, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDetector.h b/xfa/src/fxbarcode/src/include/BC_QRDetector.h deleted file mode 100644 index 60c301cb7b..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRDetector.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRDETECTOR_H_ -#define _BC_QRDETECTOR_H_ -class CBC_ResultPoint; -class CBC_CommonBitMatrix; -class CBC_QRDetectorResult; -class CBC_QRFinderPatternInfo; -class CBC_QRAlignmentPattern; -class CBC_QRFinderPatternFinder; -class CBC_QRCoderVersion; -class CBC_QRGridSampler; -class CBC_QRAlignmentPatternFinder; -class CBC_QRAlignmentPattern; -class CBC_QRDetector; -class CBC_QRDetector -{ -private: - CBC_CommonBitMatrix *m_image; -public: - CBC_QRDetector(CBC_CommonBitMatrix *image); - virtual ~CBC_QRDetector(); - - CBC_CommonBitMatrix* GetImage(); - CBC_QRDetectorResult* Detect(FX_INT32 hints, FX_INT32 &e); - CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo *info, FX_INT32 &e); - FX_FLOAT CalculateModuleSize(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft); - FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint *pattern, CBC_ResultPoint *otherPattern); - FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); - FX_FLOAT SizeOfBlackWhiteBlackRun(FX_INT32 fromX, FX_INT32 fromY, FX_INT32 toX, FX_INT32 toY); - CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize, FX_INT32 estAlignmentX, FX_INT32 estAlignmentY, FX_FLOAT allowanceFactor, FX_INT32 &e); - static FX_INT32 Round(FX_FLOAT d); - static FX_INT32 ComputeDimension(CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, CBC_ResultPoint *bottomLeft, FX_FLOAT moduleSize, FX_INT32 &e); - static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, CBC_ResultPoint *topLeft, CBC_ResultPoint *topRight, - CBC_ResultPoint *bottomLeft, CBC_ResultPoint* alignmentPattern, FX_INT32 dimension, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h b/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h deleted file mode 100644 index 13f6d3dc46..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRDetectorResult.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRDETECTORRESULT_H_ -#define _BC_QRDETECTORRESULT_H_ -class CBC_CommonBitMatrix; -class CBC_ResultPoint; -class CBC_QRDetectorResult; -class CBC_QRDetectorResult : public CFX_Object -{ -private: - CBC_CommonBitMatrix *m_bits; - CFX_PtrArray *m_points; -public: - CBC_QRDetectorResult(CBC_CommonBitMatrix *bits, CFX_PtrArray *points); - virtual ~CBC_QRDetectorResult(); - CBC_CommonBitMatrix *GetBits(); - CFX_PtrArray *GetPoints(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h b/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h deleted file mode 100644 index af88a727d9..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRFinderPattern.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRFINDERPATTERN_H_ -#define _BC_QRFINDERPATTERN_H_ -class CBC_ResultPoint; -class CBC_QRFinderPattern; -class CBC_QRFinderPattern : public CBC_ResultPoint -{ -private: - FX_FLOAT m_estimatedModuleSize; - FX_INT32 m_count; -public: - CBC_QRFinderPattern(FX_FLOAT x, FX_FLOAT posY, FX_FLOAT estimatedModuleSize); - virtual ~CBC_QRFinderPattern(); - - FX_INT32 GetCount(); - FX_FLOAT GetX(); - FX_FLOAT GetY(); - FX_FLOAT GetEstimatedModuleSize(); - void IncrementCount(); - FX_BOOL AboutEquals(FX_FLOAT moduleSize, FX_FLOAT i, FX_FLOAT j); - CBC_QRFinderPattern *Clone(); -}; -typedef CBC_QRFinderPattern FinderPattern; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h b/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h deleted file mode 100644 index 7470b553ee..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRFinderPatternFinder.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRFINDERPATTERNFINDER_H_ -#define _BC_QRFINDERPATTERNFINDER_H_ -class CBC_CommonBitMatrix; -class CBC_QRFinderPattern; -class CBC_ResultPoint; -class CBC_QRFinderPatternInfo; -class CBC_QRFinderPatternFinder; -class CBC_QRFinderPatternFinder : public CFX_Object -{ -private: - const static FX_INT32 CENTER_QUORUM; - const static FX_INT32 MIN_SKIP; - const static FX_INT32 MAX_MODULES; - const static FX_INT32 INTEGER_MATH_SHIFT; - FX_BOOL m_hasSkipped; - CBC_CommonBitMatrix* m_image; - CFX_Int32Array m_crossCheckStateCount; - CFX_PtrArray m_possibleCenters; -public: - CBC_QRFinderPatternFinder(CBC_CommonBitMatrix *image); - virtual ~CBC_QRFinderPatternFinder(); - FX_INT32 FindRowSkip(); - CBC_CommonBitMatrix* GetImage(); - CBC_QRFinderPatternInfo* Find(FX_INT32 hint, FX_INT32 &e); - - CFX_Int32Array &GetCrossCheckStateCount(); - CFX_PtrArray *GetPossibleCenters(); - CFX_PtrArray *SelectBestpatterns(FX_INT32 &e); - - FX_BOOL HandlePossibleCenter(const CFX_Int32Array &stateCount, FX_INT32 i, FX_INT32 j); - FX_BOOL HaveMultiplyConfirmedCenters(); - FX_FLOAT CenterFromEnd(const CFX_Int32Array &stateCount, FX_INT32 end); - FX_FLOAT CrossCheckVertical(FX_INT32 startI, FX_INT32 centerJ, FX_INT32 maxCount, FX_INT32 originalStateCountTotal); - FX_FLOAT CrossCheckHorizontal(FX_INT32 startJ, FX_INT32 CenterI, FX_INT32 maxCOunt, FX_INT32 originalStateCountTotal); - static void OrderBestPatterns(CFX_PtrArray *patterns); - static FX_BOOL FoundPatternCross(const CFX_Int32Array &stateCount); - static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h b/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h deleted file mode 100644 index 0b8c7d3ab7..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_QRGridSampler.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_QRGRIDSAMPLER_H_ -#define _BC_QRGRIDSAMPLER_H_ -class CBC_CommonBitMatrix; -class CBC_CommonPerspectiveTransform; -class CBC_CommonDefaultGridSampler; -class CBC_QRGridSampler; -class CBC_QRGridSampler -{ -private: - static CBC_QRGridSampler m_gridSampler; -public: - CBC_QRGridSampler(); - virtual ~CBC_QRGridSampler(); - virtual CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix *image, FX_INT32 dimensionX, FX_INT32 dimensionY, - FX_FLOAT p1ToX, FX_FLOAT p1ToY, - FX_FLOAT p2ToX, FX_FLOAT p2ToY, - FX_FLOAT p3ToX, FX_FLOAT p3ToY, - FX_FLOAT p4ToX, FX_FLOAT p4ToY, - FX_FLOAT p1FromX, FX_FLOAT p1FromY, - FX_FLOAT p2FromX, FX_FLOAT p2FromY, - FX_FLOAT p3FromX, FX_FLOAT p3FromY, - FX_FLOAT p4FromX, FX_FLOAT p4FromY, FX_INT32 &e); - - static CBC_QRGridSampler &GetInstance(); - static void CheckAndNudgePoints(CBC_CommonBitMatrix *image, CFX_FloatArray *points, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Reader.h b/xfa/src/fxbarcode/src/include/BC_Reader.h deleted file mode 100644 index 42b2aa11f5..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Reader.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_READER_H_ -#define _BC_READER_H_ -class CBC_BinaryBitmap; -class CBC_Reader; -class CBC_Reader : public CFX_Object -{ -public: - CBC_Reader(); - virtual ~CBC_Reader(); - virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 &e) = 0; - virtual CFX_ByteString Decode(CBC_BinaryBitmap *image, FX_INT32 hints, FX_INT32 &e) = 0; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h deleted file mode 100644 index 2950b8f315..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ReedSolomon.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_READSOLOMON_H_ -#define _BC_READSOLOMON_H_ -class CBC_ReedSolomonGF256; -class CBC_ReedSolomonGF256Poly; -class CBC_ReedSolomonEncoder; -class CBC_ReedSolomonEncoder : public CFX_Object -{ -private: - CBC_ReedSolomonGF256* m_field; - CFX_PtrArray m_cachedGenerators; - CBC_ReedSolomonGF256Poly* BuildGenerator(FX_INT32 degree, FX_INT32 &e); -public: - CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256 * field); - virtual ~CBC_ReedSolomonEncoder(); - - void Encode(CFX_Int32Array *toEncode, FX_INT32 ecBytes, FX_INT32 &e); - virtual void Init(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h deleted file mode 100644 index c1dd0f03f5..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ReedSolomonDecoder.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_REEDSOLOMONDECODER_H_ -#define _BC_REEDSOLOMONDECODER_H_ -class CBC_ReedSolomonGF256; -class CBC_ReedSolomonGF256Poly; -class CBC_ReedSolomonDecoder; -class CBC_ReedSolomonDecoder : public CFX_Object -{ -private: - CBC_ReedSolomonGF256 * m_field; -public: - CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256 * field); - virtual ~CBC_ReedSolomonDecoder(); - void Decode(CFX_Int32Array* received, FX_INT32 twoS, FX_INT32 &e); - CFX_PtrArray* RunEuclideanAlgorithm(CBC_ReedSolomonGF256Poly* a, CBC_ReedSolomonGF256Poly* b, FX_INT32 R, FX_INT32 &e); - CFX_Int32Array* FindErrorLocations(CBC_ReedSolomonGF256Poly* errorLocator, FX_INT32 &e); - CFX_Int32Array* FindErrorMagnitudes(CBC_ReedSolomonGF256Poly* errorEvaluator, CFX_Int32Array* errorLocations, FX_BOOL dataMatrix, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h deleted file mode 100644 index 1687b95e09..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_REEDSOLOMONGF256_H_ -#define _BC_REEDSOLOMONGF256_H_ -class CBC_ReedSolomonGF256Poly; -class CBC_ReedSolomonGF256; -class CBC_ReedSolomonGF256 : public CFX_Object -{ -public: - static void Initialize(); - static void Finalize(); - static CBC_ReedSolomonGF256 *QRCodeFild; - static CBC_ReedSolomonGF256 *DataMatrixField; - CBC_ReedSolomonGF256(FX_INT32 primitive); - virtual ~CBC_ReedSolomonGF256(); - CBC_ReedSolomonGF256Poly* GetZero(); - CBC_ReedSolomonGF256Poly* GetOne(); - CBC_ReedSolomonGF256Poly* BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); - static FX_INT32 AddOrSubtract(FX_INT32 a, FX_INT32 b); - FX_INT32 Exp(FX_INT32 a); - FX_INT32 Log(FX_INT32 a, FX_INT32 &e); - FX_INT32 Inverse(FX_INT32 a, FX_INT32 &e); - FX_INT32 Multiply(FX_INT32 a, FX_INT32 b); - virtual void Init(); -private: - FX_INT32 m_expTable[256]; - FX_INT32 m_logTable[256]; - CBC_ReedSolomonGF256Poly *m_zero; - CBC_ReedSolomonGF256Poly *m_one; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h b/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h deleted file mode 100644 index a6db24e231..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ReedSolomonGF256Poly.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_READSOLOMONGF256POLY_H_ -#define _BC_READSOLOMONGF256POLY_H_ -class CBC_ReedSolomonGF256; -class CBC_ReedSolomonGF256Poly; -class CBC_ReedSolomonGF256Poly : public CFX_Object -{ -public: - CBC_ReedSolomonGF256Poly(CBC_ReedSolomonGF256* field, FX_INT32 coefficients); - CBC_ReedSolomonGF256Poly(); - virtual ~CBC_ReedSolomonGF256Poly(); - FX_INT32 GetCoefficients(FX_INT32 degree); - CFX_Int32Array* GetCoefficients(); - FX_INT32 GetDegree(); - FX_BOOL IsZero(); - FX_INT32 EvaluateAt(FX_INT32 a); - CBC_ReedSolomonGF256Poly* AddOrSubtract(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); - CBC_ReedSolomonGF256Poly* Multiply(CBC_ReedSolomonGF256Poly* other, FX_INT32 &e); - CBC_ReedSolomonGF256Poly* Multiply(FX_INT32 scalar, FX_INT32 &e); - CBC_ReedSolomonGF256Poly* MultiplyByMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e); - CFX_PtrArray* Divide(CBC_ReedSolomonGF256Poly *other, FX_INT32 &e); - CBC_ReedSolomonGF256Poly* Clone(FX_INT32 &e); - virtual void Init(CBC_ReedSolomonGF256* field, CFX_Int32Array* coefficients, FX_INT32 &e); -private: - CBC_ReedSolomonGF256* m_field; - CFX_Int32Array m_coefficients; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_ResultPoint.h b/xfa/src/fxbarcode/src/include/BC_ResultPoint.h deleted file mode 100644 index 7001cfa2a5..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_ResultPoint.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_RESULTPOINT_H_ -#define _BC_RESULTPOINT_H_ -class CBC_ResultPoint; -class CBC_ResultPoint : public CFX_Object -{ -public: - CBC_ResultPoint(); - CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y); - virtual ~CBC_ResultPoint() - { - } - virtual FX_FLOAT GetX(); - virtual FX_FLOAT GetY(); -protected: - FX_FLOAT m_x; - FX_FLOAT m_y; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h b/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h deleted file mode 100644 index 0450a28725..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_SymbolInfo.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_SYMBOLINFO_H_ -#define _BC_SYMBOLINFO_H_ -class CBC_SymbolShapeHint; -class CBC_Dimension; -class CBC_SymbolInfo; -class CBC_SymbolInfo : public CBC_SymbolShapeHint -{ -public: - CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, - FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions); - virtual ~CBC_SymbolInfo(); - static void Initialize(); - static void Finalize(); - static void overrideSymbolSet(CBC_SymbolInfo* override); - static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_INT32 &e); - static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_INT32 &e); - static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, FX_INT32 &e); - static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, FX_BOOL fail, FX_INT32 &e); - static CBC_SymbolInfo* lookup(FX_INT32 dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, FX_INT32 &e); - FX_INT32 getHorizontalDataRegions(FX_INT32 &e); - FX_INT32 getVerticalDataRegions(FX_INT32 &e); - FX_INT32 getSymbolDataWidth(FX_INT32 &e); - FX_INT32 getSymbolDataHeight(FX_INT32 &e); - FX_INT32 getSymbolWidth(FX_INT32 &e); - FX_INT32 getSymbolHeight(FX_INT32 &e); - FX_INT32 getCodewordCount(); - FX_INT32 getInterleavedBlockCount(); - FX_INT32 getDataLengthForInterleavedBlock(FX_INT32 index); - FX_INT32 getErrorLengthForInterleavedBlock(FX_INT32 index); - CFX_WideString toString(FX_INT32 &e); -public: - FX_INT32 m_dataCapacity; - FX_INT32 m_errorCodewords; - FX_INT32 m_matrixWidth; - FX_INT32 m_matrixHeight; - FX_INT32 m_rsBlockData; - FX_INT32 m_rsBlockError; - static CBC_SymbolInfo* m_PROD_SYMBOLS[30]; -private: - static CBC_SymbolInfo* m_symbols[30]; - FX_BOOL m_rectangular; - FX_INT32 m_dataRegions; -private: - CBC_SymbolInfo(FX_BOOL rectangular, FX_INT32 dataCapacity, FX_INT32 errorCodewords, FX_INT32 matrixWidth, FX_INT32 matrixHeight, FX_INT32 dataRegions, - FX_INT32 rsBlockData, FX_INT32 rsBlockError); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h b/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h deleted file mode 100644 index 2b030012a3..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_SymbolShapeHint.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_SYMBOLSHAPEHINT_H_ -#define _BC_SYMBOLSHAPEHINT_H_ -class CBC_SymbolShapeHint; -class CBC_SymbolShapeHint : public CFX_Object -{ -public: - CBC_SymbolShapeHint(); - virtual ~CBC_SymbolShapeHint(); - enum SymbolShapeHint { - FORCE_NONE, - FORCE_SQUARE, - FORCE_RECTANGLE, - }; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_TextEncoder.h b/xfa/src/fxbarcode/src/include/BC_TextEncoder.h deleted file mode 100644 index f1168679a6..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_TextEncoder.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_TEXTENCODER_H_ -#define _BC_TEXTENCODER_H_ -class CBC_TextEncoder; -class CBC_TextEncoder : public CBC_C40Encoder -{ -public: - CBC_TextEncoder(); - virtual ~CBC_TextEncoder(); - FX_INT32 getEncodingMode(); - FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h b/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h deleted file mode 100644 index 369d494c08..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_TwoDimWriter.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_TWODIMWRITER_H_ -#define _BC_TWODIMWRITER_H_ -#include "BC_Writer.h" -class CBC_Writer; -class CBC_CommonBitMatrix; -class CBC_TwoDimWriter; -class CBC_TwoDimWriter : public CBC_Writer -{ -public: - CBC_TwoDimWriter(); - virtual ~CBC_TwoDimWriter(); - virtual FX_BYTE* Encode(const CFX_WideString& contents, FX_INT32 ecLevel, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) - { - return NULL; - }; - virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) - { - return NULL; - }; - virtual FX_BYTE* Encode(const CFX_ByteString& contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) - { - return NULL; - }; - virtual void RenderResult(FX_BYTE *code, FX_INT32 codeWidth, FX_INT32 codeHeight, FX_INT32 &e); - virtual void RenderBitmapResult(CFX_DIBitmap *&pOutBitmap, FX_INT32& e); - virtual void RenderDeviceResult(CFX_RenderDevice* device, const CFX_Matrix* matrix); - virtual FX_BOOL SetErrorCorrectionLevel (FX_INT32 level) = 0; - virtual FX_INT32 GetErrorCorrectionLevel() - { - return m_iCorrectLevel; - }; - -protected: - FX_INT32 m_iCorrectLevel; - FX_BOOL m_bFixedSize; - CBC_CommonBitMatrix* m_output; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h b/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h deleted file mode 100644 index 1ee3a8c64c..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_UtilCodingConvert.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_UTILCODINGCONVERT_H_ -#define _BC_UTILCODINGCONVERT_H_ -class CBC_UtilCodingConvert; -class CBC_UtilCodingConvert : public CFX_Object -{ -public: - CBC_UtilCodingConvert(); - virtual ~CBC_UtilCodingConvert(); - static void UnicodeToLocale(const CFX_WideString &source, CFX_ByteString &result); - static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteString &result); - static void LocaleToUtf8(const CFX_ByteString &source, CFX_ByteArray &result); - static void Utf8ToLocale(const CFX_ByteArray &source, CFX_ByteString &result); - static void Utf8ToLocale(const FX_BYTE *source, FX_INT32 count, CFX_ByteString &result); - static void UnicodeToUTF8(const CFX_WideString &source, CFX_ByteString &result); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_UtilRSS.h b/xfa/src/fxbarcode/src/include/BC_UtilRSS.h deleted file mode 100644 index 37834eaa76..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_UtilRSS.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_UTILRESS_H_ -#define _BC_UTILRESS_H_ -class CBC_RssPair; -class CBC_UtilRSS : public CFX_Object -{ -public: - virtual ~CBC_UtilRSS(); - static FX_INT32 GetRSSvalue(CFX_Int32Array &widths, FX_INT32 maxWidth, FX_BOOL noNarrow); - -protected: - static CFX_Int32Array *GetRssWidths(FX_INT32 val, FX_INT32 n, FX_INT32 elements, FX_INT32 maxWidth, FX_BOOL noNarrow); - static FX_INT32 Combins(FX_INT32 n, FX_INT32 r); - static CFX_Int32Array *Elements(CFX_Int32Array &eDist, FX_INT32 N, FX_INT32 K); -private: - CBC_UtilRSS(); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h b/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h deleted file mode 100644 index 83d91ced92..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_WhiteRectangleDetector.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_WHITERECTANLEDETECTOR_H_ -#define _BC_WHITERECTANLEDETECTOR_H_ -class CBC_CommonBitMatrix; -class CBC_ResultPoint; -class CBC_WhiteRectangleDetector; -class CBC_WhiteRectangleDetector : public CFX_Object -{ -public: - CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image); - CBC_WhiteRectangleDetector(CBC_CommonBitMatrix *image, FX_INT32 initSize, FX_INT32 x, FX_INT32 y); - virtual ~CBC_WhiteRectangleDetector(); - CFX_PtrArray *Detect(FX_INT32 &e); - virtual void Init(FX_INT32 &e); -private: - FX_INT32 Round(float d); - CBC_ResultPoint *GetBlackPointOnSegment(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); - FX_INT32 DistanceL2(FX_FLOAT aX, FX_FLOAT aY, FX_FLOAT bX, FX_FLOAT bY); - CFX_PtrArray *CenterEdges(CBC_ResultPoint *y, CBC_ResultPoint *z, - CBC_ResultPoint *x, CBC_ResultPoint *t); - FX_BOOL ContainsBlackPoint(FX_INT32 a, FX_INT32 b, FX_INT32 fixed, FX_BOOL horizontal); - const static FX_INT32 INIT_SIZE; - const static FX_INT32 CORR; - - CBC_CommonBitMatrix *m_image; - FX_INT32 m_height; - FX_INT32 m_width; - FX_INT32 m_leftInit; - FX_INT32 m_rightInit; - FX_INT32 m_downInit; - FX_INT32 m_upInit; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_Writer.h b/xfa/src/fxbarcode/src/include/BC_Writer.h deleted file mode 100644 index deb68c07be..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_Writer.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_WRITER_H_ -#define _BC_WRITER_H_ -class CBC_Writer; -class CBC_Writer : public CFX_Object -{ -public: - CBC_Writer(); - virtual ~CBC_Writer(); - virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e) = 0; - virtual FX_BYTE *Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e) = 0; - virtual FX_BOOL SetCharEncoding(FX_INT32 encoding); - virtual FX_BOOL SetModuleHeight(FX_INT32 moduleHeight); - virtual FX_BOOL SetModuleWidth(FX_INT32 moduleWidth); - virtual FX_BOOL SetHeight(FX_INT32 height); - virtual FX_BOOL SetWidth(FX_INT32 width); - virtual void SetBackgroundColor(FX_ARGB backgroundColor); - virtual void SetBarcodeColor(FX_ARGB foregroundColor); -protected: - CFX_DIBitmap* CreateDIBitmap(FX_INT32 width, FX_INT32 height); - FX_INT32 m_CharEncoding; - FX_INT32 m_ModuleHeight; - FX_INT32 m_ModuleWidth; - FX_INT32 m_Height; - FX_INT32 m_Width; - FXDIB_Format m_colorSpace; - FX_ARGB m_barColor; - FX_ARGB m_backgroundColor; -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/BC_X12Encoder.h b/xfa/src/fxbarcode/src/include/BC_X12Encoder.h deleted file mode 100644 index 21111bc5cc..0000000000 --- a/xfa/src/fxbarcode/src/include/BC_X12Encoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_X12ENCODER_H_ -#define _BC_X12ENCODER_H_ -class CBC_C40Encoder; -class CBC_X12Encoder; -class CBC_X12Encoder : public CBC_C40Encoder -{ -public: - CBC_X12Encoder(); - virtual ~CBC_X12Encoder(); - FX_INT32 getEncodingMode(); - void Encode(CBC_EncoderContext &context, FX_INT32 &e); - void handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e); - FX_INT32 encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e); -}; -#endif diff --git a/xfa/src/fxbarcode/src/include/utils.h b/xfa/src/fxbarcode/src/include/utils.h deleted file mode 100644 index ecaadccef0..0000000000 --- a/xfa/src/fxbarcode/src/include/utils.h +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef _BC_UTILS_H_ -#define _BC_UTILS_H_ -typedef CFX_MapPtrTemplate CFX_PtrToInt32; -FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c); -void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c); -void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba); -typedef FX_BOOL (*BC_PtrArrayCompareCallback)(FX_LPVOID l, FX_LPVOID r); -void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun); -template -class CBC_AutoPtr -{ -public: - typedef _Ty element_type; - explicit CBC_AutoPtr(_Ty *_P = 0) - : _Owns(_P != 0), _Ptr(_P) {} - CBC_AutoPtr(const CBC_AutoPtr<_Ty>& _Y) - : _Owns(_Y._Owns), _Ptr(_Y.release()) {} - CBC_AutoPtr<_Ty>& operator=(const CBC_AutoPtr<_Ty>& _Y) - { - if (this != &_Y) { - if (_Ptr != _Y.get()) { - if (_Owns) { - delete _Ptr; - } - _Owns = _Y._Owns; - } else if (_Y._Owns) { - _Owns = TRUE; - } - _Ptr = _Y.release(); - } - return (*this); - } - ~CBC_AutoPtr() - { - if (_Owns) { - delete _Ptr; - } - } - _Ty& operator*() const - { - return (*get()); - } - _Ty *operator->() const - { - return (get()); - } - _Ty *get() const - { - return (_Ptr); - } - _Ty *release() const - { - ((CBC_AutoPtr<_Ty> *)this)->_Owns = FALSE; - return (_Ptr); - } -private: - FX_BOOL _Owns; - _Ty *_Ptr; -}; -#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) -#include -#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_) -#include -#endif -#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) -#define FXSYS_isnan(x) _isnan(x) -#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_) -#include -#define FXSYS_isnan(x) std::isnan(x) -#elif (_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_) -#include -#define FXSYS_isnan(x) isnan(x) -#endif -#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) -#define FXSYS_nan() (std::numeric_limits::quiet_NaN()) -#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_) -#define FXSYS_nan() NAN -#endif -enum BCFORMAT { - BCFORMAT_UNSPECIFY = -1, - BCFORMAT_CODABAR, - BCFORMAT_CODE_39, - BCFORMAT_CODE_128, - BCFORMAT_CODE_128B, - BCFORMAT_CODE_128C, - BCFORMAT_EAN_8, - BCFORMAT_UPC_A, - BCFORMAT_EAN_13, - BCFORMAT_PDF_417, - BCFORMAT_DATAMATRIX, - BCFORMAT_QR_CODE -}; -#define BCFORMAT_ECLEVEL_L 0 -#define BCFORMAT_ECLEVEL_M 1 -#define BCFORMAT_ECLEVEL_Q 2 -#define BCFORMAT_ECLEVEL_H 3 -#include -#define FXSYS_IntMax INT_MAX -#define FXSYS_Isdigit isdigit -#define BCExceptionNO 0 -#define BCExceptionNotFound 1 -#define BCExceptionEndLessThanStart 2 -#define BCExceptionUnknownDecoder 3 -#define BCExceptionRotateNotSupported 4 -#define BCExceptionHeightAndWidthMustBeAtLeast1 5 -#define BCExceptionRegionMustFitInsideMatrix 6 -#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7 -#define BCExceptionFormatException 8 -#define BCExceptionIllegalArgumentMustMatchVersionSize 9 -#define BCExceptionChecksumException 10 -#define BCExceptionIllegalArgumentInvalidFirstDigit 11 -#define BCExceptionIllegalArgumentInvalidSecondDigit 12 -#define BCExceptionRuntimeDecodingInvalidISO_IEC 13 -#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14 -#define BCExceptionLeftAndTopMustBeNonnegative 15 -#define BCExceptionIllegalArgument 16 -#define BCExceptionBadECI 17 -#define BCExceptionUnSupportedBarcode 18 -#define BCExceptionUnSupportedString 19 -#define BCExceptionDigitLengthMustBe8 20 -#define BCExceptionDataCheckException 21 -#define BCExceptionExtractNumberValueFromBitArray 22 -#define BCExceptionRead 23 -#define BCExceptionRequestedRowIsOutSizeTheImage 24 -#define BCExceptionNoContents 26 -#define BCExceptionUnSupportEclevel 27 -#define BCExceptionUnSupportMode 28 -#define BCExceptionReferenceMustBeBetween0And7 29 -#define BCExceptionBadErrorLocation 30 -#define BCExceptionDegreeIsNegative 31 -#define BCExceptionDivideByZero 32 -#define BCExceptionCoefficientsSizeIsNull 33 -#define BCExceptionNoCorrectionBytes 34 -#define BCExceptionNoDataBytesProvided 35 -#define BCExceptionR_I_1IsZero 36 -#define BCExceptionAIsZero 37 -#define BCExceptionIsZero 38 -#define BCExceptionDegreeNotMatchRoots 39 -#define BCExceptionContentsLengthShouldBetween1and80 40 -#define BCExceptionOnlyEncodeCODE_128 41 -#define BCExceptionOnlyEncodeCODE_39 42 -#define BCExceptionOnlyEncodeEAN_13 43 -#define BCExceptionOnlyEncodeEAN_8 44 -#define BCExceptionOnlyEncodeITF 45 -#define BCExceptionDigitLengthShould13 46 -#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47 -#define BCExceptionOnlyEncodeUPC_A 48 -#define BCExceptionDigitLengthShouldBe12 49 -#define BCExceptionValueMustBeEither0or1 50 -#define BCExceptionReedsolomnDecodeException 51 -#define BCExceptionBadIndexException 52 -#define BCExceptionBadValueException 53 -#define BCExceptionBadNumBitsException 54 -#define BCExceptioncanNotOperatexorOperator 55 -#define BCExceptionVersionMust1_40 56 -#define BCExceptionUnknown 57 -#define BCExceptionNoSuchVersion 58 -#define BCExceptionCannotFindBlockInfo 59 -#define BCExceptionDataTooBig 60 -#define BCExceptionInvalidQRCode 61 -#define BCExceptionDataTooMany 62 -#define BCExceptionBitsNotEqualCacity 63 -#define BCExceptionUnsupportedMode 64 -#define BCExceptionInvalidateCharacter 65 -#define BCExceptionBytesNotMatchOffset 66 -#define BCExceptionSizeInBytesDiffer 67 -#define BCExceptionInvalidateMaskPattern 68 -#define BCExceptionNullPointer 69 -#define BCExceptionBadMask 70 -#define BCExceptionBitSizeNot15 71 -#define BCExceptionBitSizeNot18 72 -#define BCExceptionInvalidateImageData 73 -#define BCExceptionHeight_8BeZero 74 -#define BCExceptionCharacterNotThisMode 75 -#define BCExceptionBitsBytesNotMatch 76 -#define BCExceptionInvalidateData 77 -#define BCExceptionLoadFile 78 -#define BCExceptionPDF417EncodeFail 79 -#define BCExceptionFailToCreateBitmap 80 -#define BCExceptionLoadFontFail 81 -#define BCExceptionOnlyEncodeCODEBAR 82 -#define BCExceptionCodabarShouldStartWithOneOfABCD 83 -#define BCExceptionCodabarShouldEndWithOneOfTNE 84 -#define BCExceptionCodabarEncodeCharsInvalid 85 -#define BCExceptionOnlyEncodeDATAMATRIX 86 -#define BCExceptionCharactersOutsideISO88591Encoding 87 -#define BCExceptionIllegalDataCodewords 88 -#define BCExceptionCannotHandleThisNumberOfDataRegions 89 -#define BCExceptionIllegalStateUnexpectedCase 90 -#define BCExceptionIllegalStateCountMustNotExceed4 91 -#define BCExceptionIllegalStateMessageLengthInvalid 92 -#define BCExceptionIllegalArgumentNotGigits 93 -#define BCExceptionIllegalStateIllegalMode 94 -#define BCExceptionOnlyEncodePDF417 95 -#define BCExceptionNonEncodableCharacterDetected 96 -#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97 -#define BCExceptionNoRecommendationPossible 98 -#define BCExceptionIllegalArgumentnMustBeAbove0 99 -#define BCExceptionUnableToFitMessageInColumns 100 -#define BCExceptionEncodedMessageContainsTooManyCodeWords 101 -#define BCExceptionBitmapSizeError 102 -#define BCExceptionFormatInstance 102 -#define BCExceptionChecksumInstance 103 -#define BCExceptiontNotFoundInstance 104 -#define BCExceptionNotFoundInstance 105 -#define BCExceptionCannotMetadata 106 -#define TWO_DIGIT_DATA_LENGTH_SIZE 24 -#define THREE_DIGIT_DATA_LENGTH_SIZE 23 -#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57 -#define FOUR_DIGIT_DATA_LENGTH_SIZE 17 -#define BC_EXCEPTION_CHECK_ReturnVoid(e) if (e != BCExceptionNO) return; -#define BC_EXCEPTION_CHECK_ReturnValue(e, v) if (e != BCExceptionNO) return v; -#endif diff --git a/xfa/src/fxbarcode/utils.h b/xfa/src/fxbarcode/utils.h new file mode 100644 index 0000000000..ecaadccef0 --- /dev/null +++ b/xfa/src/fxbarcode/utils.h @@ -0,0 +1,219 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _BC_UTILS_H_ +#define _BC_UTILS_H_ +typedef CFX_MapPtrTemplate CFX_PtrToInt32; +FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString &dst, FX_DWORD first, FX_DWORD last, FX_INT32 count, FX_CHAR c); +void BC_FX_ByteString_Append(CFX_ByteString &dst, FX_INT32 count, FX_CHAR c); +void BC_FX_ByteString_Append(CFX_ByteString &dst, const CFX_ByteArray &ba); +typedef FX_BOOL (*BC_PtrArrayCompareCallback)(FX_LPVOID l, FX_LPVOID r); +void BC_FX_PtrArray_Sort(CFX_PtrArray &src, BC_PtrArrayCompareCallback fun); +template +class CBC_AutoPtr +{ +public: + typedef _Ty element_type; + explicit CBC_AutoPtr(_Ty *_P = 0) + : _Owns(_P != 0), _Ptr(_P) {} + CBC_AutoPtr(const CBC_AutoPtr<_Ty>& _Y) + : _Owns(_Y._Owns), _Ptr(_Y.release()) {} + CBC_AutoPtr<_Ty>& operator=(const CBC_AutoPtr<_Ty>& _Y) + { + if (this != &_Y) { + if (_Ptr != _Y.get()) { + if (_Owns) { + delete _Ptr; + } + _Owns = _Y._Owns; + } else if (_Y._Owns) { + _Owns = TRUE; + } + _Ptr = _Y.release(); + } + return (*this); + } + ~CBC_AutoPtr() + { + if (_Owns) { + delete _Ptr; + } + } + _Ty& operator*() const + { + return (*get()); + } + _Ty *operator->() const + { + return (get()); + } + _Ty *get() const + { + return (_Ptr); + } + _Ty *release() const + { + ((CBC_AutoPtr<_Ty> *)this)->_Owns = FALSE; + return (_Ptr); + } +private: + FX_BOOL _Owns; + _Ty *_Ptr; +}; +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#include +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_) +#include +#endif +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#define FXSYS_isnan(x) _isnan(x) +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_) +#include +#define FXSYS_isnan(x) std::isnan(x) +#elif (_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_) +#include +#define FXSYS_isnan(x) isnan(x) +#endif +#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_) +#define FXSYS_nan() (std::numeric_limits::quiet_NaN()) +#elif (_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_) +#define FXSYS_nan() NAN +#endif +enum BCFORMAT { + BCFORMAT_UNSPECIFY = -1, + BCFORMAT_CODABAR, + BCFORMAT_CODE_39, + BCFORMAT_CODE_128, + BCFORMAT_CODE_128B, + BCFORMAT_CODE_128C, + BCFORMAT_EAN_8, + BCFORMAT_UPC_A, + BCFORMAT_EAN_13, + BCFORMAT_PDF_417, + BCFORMAT_DATAMATRIX, + BCFORMAT_QR_CODE +}; +#define BCFORMAT_ECLEVEL_L 0 +#define BCFORMAT_ECLEVEL_M 1 +#define BCFORMAT_ECLEVEL_Q 2 +#define BCFORMAT_ECLEVEL_H 3 +#include +#define FXSYS_IntMax INT_MAX +#define FXSYS_Isdigit isdigit +#define BCExceptionNO 0 +#define BCExceptionNotFound 1 +#define BCExceptionEndLessThanStart 2 +#define BCExceptionUnknownDecoder 3 +#define BCExceptionRotateNotSupported 4 +#define BCExceptionHeightAndWidthMustBeAtLeast1 5 +#define BCExceptionRegionMustFitInsideMatrix 6 +#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7 +#define BCExceptionFormatException 8 +#define BCExceptionIllegalArgumentMustMatchVersionSize 9 +#define BCExceptionChecksumException 10 +#define BCExceptionIllegalArgumentInvalidFirstDigit 11 +#define BCExceptionIllegalArgumentInvalidSecondDigit 12 +#define BCExceptionRuntimeDecodingInvalidISO_IEC 13 +#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14 +#define BCExceptionLeftAndTopMustBeNonnegative 15 +#define BCExceptionIllegalArgument 16 +#define BCExceptionBadECI 17 +#define BCExceptionUnSupportedBarcode 18 +#define BCExceptionUnSupportedString 19 +#define BCExceptionDigitLengthMustBe8 20 +#define BCExceptionDataCheckException 21 +#define BCExceptionExtractNumberValueFromBitArray 22 +#define BCExceptionRead 23 +#define BCExceptionRequestedRowIsOutSizeTheImage 24 +#define BCExceptionNoContents 26 +#define BCExceptionUnSupportEclevel 27 +#define BCExceptionUnSupportMode 28 +#define BCExceptionReferenceMustBeBetween0And7 29 +#define BCExceptionBadErrorLocation 30 +#define BCExceptionDegreeIsNegative 31 +#define BCExceptionDivideByZero 32 +#define BCExceptionCoefficientsSizeIsNull 33 +#define BCExceptionNoCorrectionBytes 34 +#define BCExceptionNoDataBytesProvided 35 +#define BCExceptionR_I_1IsZero 36 +#define BCExceptionAIsZero 37 +#define BCExceptionIsZero 38 +#define BCExceptionDegreeNotMatchRoots 39 +#define BCExceptionContentsLengthShouldBetween1and80 40 +#define BCExceptionOnlyEncodeCODE_128 41 +#define BCExceptionOnlyEncodeCODE_39 42 +#define BCExceptionOnlyEncodeEAN_13 43 +#define BCExceptionOnlyEncodeEAN_8 44 +#define BCExceptionOnlyEncodeITF 45 +#define BCExceptionDigitLengthShould13 46 +#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47 +#define BCExceptionOnlyEncodeUPC_A 48 +#define BCExceptionDigitLengthShouldBe12 49 +#define BCExceptionValueMustBeEither0or1 50 +#define BCExceptionReedsolomnDecodeException 51 +#define BCExceptionBadIndexException 52 +#define BCExceptionBadValueException 53 +#define BCExceptionBadNumBitsException 54 +#define BCExceptioncanNotOperatexorOperator 55 +#define BCExceptionVersionMust1_40 56 +#define BCExceptionUnknown 57 +#define BCExceptionNoSuchVersion 58 +#define BCExceptionCannotFindBlockInfo 59 +#define BCExceptionDataTooBig 60 +#define BCExceptionInvalidQRCode 61 +#define BCExceptionDataTooMany 62 +#define BCExceptionBitsNotEqualCacity 63 +#define BCExceptionUnsupportedMode 64 +#define BCExceptionInvalidateCharacter 65 +#define BCExceptionBytesNotMatchOffset 66 +#define BCExceptionSizeInBytesDiffer 67 +#define BCExceptionInvalidateMaskPattern 68 +#define BCExceptionNullPointer 69 +#define BCExceptionBadMask 70 +#define BCExceptionBitSizeNot15 71 +#define BCExceptionBitSizeNot18 72 +#define BCExceptionInvalidateImageData 73 +#define BCExceptionHeight_8BeZero 74 +#define BCExceptionCharacterNotThisMode 75 +#define BCExceptionBitsBytesNotMatch 76 +#define BCExceptionInvalidateData 77 +#define BCExceptionLoadFile 78 +#define BCExceptionPDF417EncodeFail 79 +#define BCExceptionFailToCreateBitmap 80 +#define BCExceptionLoadFontFail 81 +#define BCExceptionOnlyEncodeCODEBAR 82 +#define BCExceptionCodabarShouldStartWithOneOfABCD 83 +#define BCExceptionCodabarShouldEndWithOneOfTNE 84 +#define BCExceptionCodabarEncodeCharsInvalid 85 +#define BCExceptionOnlyEncodeDATAMATRIX 86 +#define BCExceptionCharactersOutsideISO88591Encoding 87 +#define BCExceptionIllegalDataCodewords 88 +#define BCExceptionCannotHandleThisNumberOfDataRegions 89 +#define BCExceptionIllegalStateUnexpectedCase 90 +#define BCExceptionIllegalStateCountMustNotExceed4 91 +#define BCExceptionIllegalStateMessageLengthInvalid 92 +#define BCExceptionIllegalArgumentNotGigits 93 +#define BCExceptionIllegalStateIllegalMode 94 +#define BCExceptionOnlyEncodePDF417 95 +#define BCExceptionNonEncodableCharacterDetected 96 +#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97 +#define BCExceptionNoRecommendationPossible 98 +#define BCExceptionIllegalArgumentnMustBeAbove0 99 +#define BCExceptionUnableToFitMessageInColumns 100 +#define BCExceptionEncodedMessageContainsTooManyCodeWords 101 +#define BCExceptionBitmapSizeError 102 +#define BCExceptionFormatInstance 102 +#define BCExceptionChecksumInstance 103 +#define BCExceptiontNotFoundInstance 104 +#define BCExceptionNotFoundInstance 105 +#define BCExceptionCannotMetadata 106 +#define TWO_DIGIT_DATA_LENGTH_SIZE 24 +#define THREE_DIGIT_DATA_LENGTH_SIZE 23 +#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57 +#define FOUR_DIGIT_DATA_LENGTH_SIZE 17 +#define BC_EXCEPTION_CHECK_ReturnVoid(e) if (e != BCExceptionNO) return; +#define BC_EXCEPTION_CHECK_ReturnValue(e, v) if (e != BCExceptionNO) return v; +#endif -- cgit v1.2.3