Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / 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 \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_OnedEAN13Reader.h"\r
13 const FX_INT32 CBC_OnedEAN13Reader::FIRST_DIGIT_ENCODINGS[10] = {\r
14     0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A\r
15 };\r
16 CBC_OnedEAN13Reader::CBC_OnedEAN13Reader()\r
17 {\r
18 }\r
19 CBC_OnedEAN13Reader::~CBC_OnedEAN13Reader()\r
20 {\r
21 }\r
22 void CBC_OnedEAN13Reader::DetermineFirstDigit(CFX_ByteString &result, FX_INT32 lgPatternFound, FX_INT32 &e)\r
23 {\r
24     for (FX_INT32 d = 0; d < 10; d++) {\r
25         if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {\r
26             result.Insert(0, (FX_CHAR) ('0' + d));\r
27             return;\r
28         }\r
29     }\r
30     e = BCExceptionNotFound;\r
31     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
32 }\r
33 FX_INT32 CBC_OnedEAN13Reader::DecodeMiddle(CBC_CommonBitArray *row, CFX_Int32Array *startRange, CFX_ByteString &resultString, FX_INT32 &e)\r
34 {\r
35     CFX_Int32Array counters;\r
36     counters.Add(0);\r
37     counters.Add(0);\r
38     counters.Add(0);\r
39     counters.Add(0);\r
40     FX_INT32 end = row->GetSize();\r
41     FX_INT32 rowOffset = (*startRange)[1];\r
42     FX_INT32 lgPatternFound = 0;\r
43     for (FX_INT32 x = 0; x < 6 && rowOffset < end; x++) {\r
44         FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_AND_G_PATTERNS[0][0]), 20, e);\r
45         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
46         resultString += (FX_CHAR) ('0' + bestMatch % 10);\r
47         for (FX_INT32 i = 0; i < counters.GetSize(); i++) {\r
48             rowOffset += counters[i];\r
49         }\r
50         if (bestMatch >= 10) {\r
51             lgPatternFound |= 1 << (5 - x);\r
52         }\r
53     }\r
54     DetermineFirstDigit(resultString, lgPatternFound, e);\r
55     BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
56     CFX_Int32Array result;\r
57     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[0]);\r
58     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[1]);\r
59     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[2]);\r
60     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[3]);\r
61     result.Add(CBC_OneDimReader::MIDDLE_PATTERN[4]);\r
62     CFX_Int32Array *middleRange = FindGuardPattern(row, rowOffset, TRUE, &result, e);\r
63     BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
64     rowOffset = (*middleRange)[1];\r
65     if(middleRange != NULL) {\r
66         delete middleRange;\r
67         middleRange = NULL;\r
68     }\r
69     for (FX_INT32 Y = 0; Y < 6 && rowOffset < end; Y++) {\r
70         FX_INT32 bestMatch = DecodeDigit(row, &counters, rowOffset, &(CBC_OneDimReader::L_PATTERNS[0][0]), 10, e);\r
71         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
72         resultString += (FX_CHAR) ('0' + bestMatch);\r
73         for (FX_INT32 k = 0; k < counters.GetSize(); k++) {\r
74             rowOffset += counters[k];\r
75         }\r
76     }\r
77     return rowOffset;\r
78 }\r