Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_OnedEAN8Reader.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_Reader.h"\r
9 #include "include/BC_OneDReader.h"\r
10 #include "include/BC_OneDimReader.h"\r
11 #include "include/BC_CommonBitArray.h"\r
12 #include "include/BC_OnedEAN8Reader.h"\r
13 CBC_OnedEAN8Reader::CBC_OnedEAN8Reader()\r
14 {\r
15 }\r
16 CBC_OnedEAN8Reader::~CBC_OnedEAN8Reader()\r
17 {\r
18 }\r
19 FX_INT32 CBC_OnedEAN8Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultResult, FX_INT32 &e)\r
20 {\r
21     CFX_Int32Array counters;\r
22     counters.Add(0);\r
23     counters.Add(0);\r
24     counters.Add(0);\r
25     counters.Add(0);\r
26     FX_INT32 end = row->GetSize();\r
27     FX_INT32 rowOffset = (*startRange)[1];\r
28     FX_INT32 rowOffsetLeft = rowOffset;\r
29     for (FX_INT32 x = 0; x < 4 && rowOffset < end; x++) {\r
30         FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);\r
31         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
32         resultResult += (FX_CHAR) ('0' + bestMatch);\r
33         for (FX_INT32 i = 0; i < counters.GetSize(); i++) {\r
34             rowOffset += counters[i];\r
35         }\r
36     }\r
37     FX_INT32 RowOffsetLen = (rowOffset - rowOffsetLeft) / 4;\r
38     CFX_Int32Array result;\r
39     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);\r
40     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);\r
41     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);\r
42     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);\r
43     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);\r
44     CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e);\r
45     BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
46     FX_INT32 rowOffsetMid = rowOffset;\r
47     rowOffset = (*middleRange)[1];\r
48     if((rowOffset - rowOffsetMid) > RowOffsetLen) {\r
49         e = BCExceptionNotFound;\r
50         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
51     }\r
52     if(middleRange != NULL) {\r
53         delete middleRange;\r
54         middleRange = NULL;\r
55     }\r
56     for (FX_INT32 y = 0; y < 4 && rowOffset < end; y++) {\r
57         FX_INT32 bestMatch = DecodeDigit(row, & counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);\r
58         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
59         resultResult += (FX_CHAR) ('0' + bestMatch);\r
60         for (FX_INT32 i = 0; i < counters.GetSize(); i++) {\r
61             rowOffset += counters[i];\r
62         }\r
63     }\r
64     return rowOffset;\r
65 }\r