Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / oned / BC_OnedEAN13Reader.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 // Original code is licensed as follows:\r
7 /*\r
8  * Copyright 2008 ZXing authors\r
9  *\r
10  * Licensed under the Apache License, Version 2.0 (the "License");\r
11  * you may not use this file except in compliance with the License.\r
12  * You may obtain a copy of the License at\r
13  *\r
14  *      http://www.apache.org/licenses/LICENSE-2.0\r
15  *\r
16  * Unless required by applicable law or agreed to in writing, software\r
17  * distributed under the License is distributed on an "AS IS" BASIS,\r
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
19  * See the License for the specific language governing permissions and\r
20  * limitations under the License.\r
21  */\r
22 \r
23 #include "../barcode.h"\r
24 #include "../BC_Reader.h"\r
25 #include "../common/BC_CommonBitArray.h"\r
26 #include "BC_OneDReader.h"\r
27 #include "BC_OneDimReader.h"\r
28 #include "BC_OnedEAN13Reader.h"\r
29 const int32_t CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = {\r
30     0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A\r
31 };\r
32 CBC_OnedEAN13Reader::CBC_OnedEAN13Reader()\r
33 {\r
34 }\r
35 CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader()\r
36 {\r
37 }\r
38 void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString &result, int32_t lgPatternFound, int32_t &e)\r
39 {\r
40     for (int32_t d = 0; d < 10; d++) {\r
41         if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {\r
42             result.Insert(0, (FX_CHAR) ('0' + d));\r
43             return;\r
44         }\r
45     }\r
46     e = BCExceptionNotFound;\r
47     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
48 }\r
49 int32_t CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, int32_t &e)\r
50 {\r
51     CFX_Int32Array counters;\r
52     counters.Add(0);\r
53     counters.Add(0);\r
54     counters.Add(0);\r
55     counters.Add(0);\r
56     int32_t end = row->GetSize();\r
57     int32_t rowOffset = (*startRange)[1];\r
58     int32_t lgPatternFound = 0;\r
59     for (int32_t x = 0; x < 6 && rowOffset < end; x++) {\r
60         int32_t bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e);\r
61         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
62         resultString += (FX_CHAR) ('0' + bestMatch % 10);\r
63         for (int32_t i = 0; i < counters.GetSize(); i++) {\r
64             rowOffset += counters[i];\r
65         }\r
66         if (bestMatch >= 10) {\r
67             lgPatternFound |= 1 << (5 - x);\r
68         }\r
69     }\r
70     DetermineFirstDigit(resultString, lgPatternFound, e);\r
71     BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
72     CFX_Int32Array result;\r
73     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);\r
74     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);\r
75     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);\r
76     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);\r
77     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);\r
78     CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e);\r
79     BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
80     rowOffset = (*middleRange)[1];\r
81     if(middleRange != NULL) {\r
82         delete middleRange;\r
83         middleRange = NULL;\r
84     }\r
85     for (int32_t Y = 0; Y < 6 && rowOffset < end; Y++) {\r
86         int32_t bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);\r
87         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
88         resultString += (FX_CHAR) ('0' + bestMatch);\r
89         for (int32_t k = 0; k < counters.GetSize(); k++) {\r
90             rowOffset += counters[k];\r
91         }\r
92     }\r
93     return rowOffset;\r
94 }\r