1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 // Original code is licensed as follows: 7 /* 8 * Copyright 2008 ZXing authors 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 */ 22 23 #include "xfa/src/fxbarcode/barcode.h" 24 #include "xfa/src/fxbarcode/BC_Reader.h" 25 #include "xfa/src/fxbarcode/common/BC_CommonBitArray.h" 26 #include "BC_OneDReader.h" 27 #include "BC_OneDimReader.h" 28 #include "BC_OnedEAN8Reader.h" 29 CBC_OnedEAN8Reader::CBC_OnedEAN8Reader() {} 30 CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader() {} 31 int32_t CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray* row, 32 CFX_Int32Array* startRange, 33 CFX_ByteString& resultResult, 34 int32_t& e) { 35 CFX_Int32Array counters; 36 counters.Add(0); 37 counters.Add(0); 38 counters.Add(0); 39 counters.Add(0); 40 int32_t end = row->GetSize(); 41 int32_t rowOffset = (*startRange)[1]; 42 int32_t rowOffsetLeft = rowOffset; 43 for (int32_t x = 0; x < 4 && rowOffset < end; x++) { 44 int32_t bestMatch = 45 DecodeDigit(row, &counters, rowOffset, 46 &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); 47 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 48 resultResult += (FX_CHAR)('0' + bestMatch); 49 for (int32_t i = 0; i < counters.GetSize(); i++) { 50 rowOffset += counters[i]; 51 } 52 } 53 int32_t RowOffsetLen = (rowOffset - rowOffsetLeft) / 4; 54 CFX_Int32Array result; 55 result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]); 56 result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]); 57 result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]); 58 result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]); 59 result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]); 60 CFX_Int32Array* middleRange = 61 FindGuardPattern(row, rowOffset, TRUE, &result, e); 62 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 63 int32_t rowOffsetMid = rowOffset; 64 rowOffset = (*middleRange)[1]; 65 if ((rowOffset - rowOffsetMid) > RowOffsetLen) { 66 e = BCExceptionNotFound; 67 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 68 } 69 if (middleRange != NULL) { 70 delete middleRange; 71 middleRange = NULL; 72 } 73 for (int32_t y = 0; y < 4 && rowOffset < end; y++) { 74 int32_t bestMatch = 75 DecodeDigit(row, &counters, rowOffset, 76 &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e); 77 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 78 resultResult += (FX_CHAR)('0' + bestMatch); 79 for (int32_t i = 0; i < counters.GetSize(); i++) { 80 rowOffset += counters[i]; 81 } 82 } 83 return rowOffset; 84 } 85