Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / common / reedsolomon / BC_ReedSolomon.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 2007 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_ReedSolomonGF256.h"\r
25 #include "BC_ReedSolomonGF256Poly.h"\r
26 #include "BC_ReedSolomon.h"\r
27 CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field)\r
28 {\r
29     m_field = field;\r
30 }\r
31 void CBC_ReedSolomonEncoder::Init()\r
32 {\r
33     m_cachedGenerators.Add(FX_NEW CBC_ReedSolomonGF256Poly(m_field, 1));\r
34 }\r
35 CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator(int32_t degree, int32_t &e)\r
36 {\r
37     if(degree >= m_cachedGenerators.GetSize()) {\r
38         CBC_ReedSolomonGF256Poly* lastGenerator = (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[m_cachedGenerators.GetSize() - 1]);\r
39         for(int32_t d = m_cachedGenerators.GetSize(); d <= degree; d++) {\r
40             CFX_Int32Array temp;\r
41             temp.Add(1);\r
42             temp.Add(m_field->Exp(d - 1));\r
43             CBC_ReedSolomonGF256Poly temp_poly;\r
44             temp_poly.Init(m_field, &temp, e);\r
45             BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
46             CBC_ReedSolomonGF256Poly* nextGenerator = lastGenerator->Multiply(&temp_poly, e);\r
47             BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
48             m_cachedGenerators.Add(nextGenerator);\r
49             lastGenerator = nextGenerator;\r
50         }\r
51     }\r
52     return (CBC_ReedSolomonGF256Poly*)(m_cachedGenerators[degree]);\r
53 }\r
54 void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array *toEncode, int32_t ecBytes, int32_t &e)\r
55 {\r
56     if(ecBytes == 0) {\r
57         e = BCExceptionNoCorrectionBytes;\r
58         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
59     }\r
60     int32_t dataBytes = toEncode->GetSize() - ecBytes;\r
61     if(dataBytes <= 0) {\r
62         e = BCExceptionNoDataBytesProvided;\r
63         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
64     }\r
65     CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e);\r
66     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
67     CFX_Int32Array infoCoefficients;\r
68     infoCoefficients.SetSize(dataBytes);\r
69     for(int32_t x = 0; x < dataBytes; x++) {\r
70         infoCoefficients[x] = toEncode->operator [](x);\r
71     }\r
72     CBC_ReedSolomonGF256Poly info;\r
73     info.Init(m_field, &infoCoefficients, e);\r
74     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
75     CBC_ReedSolomonGF256Poly* rsg = info.MultiplyByMonomial(ecBytes, 1, e);\r
76     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
77     CBC_AutoPtr<CBC_ReedSolomonGF256Poly> infoTemp(rsg);\r
78     CFX_PtrArray *pa = infoTemp->Divide(generator, e);\r
79     BC_EXCEPTION_CHECK_ReturnVoid(e);\r
80     CBC_AutoPtr<CFX_PtrArray > temp(pa);\r
81     CBC_ReedSolomonGF256Poly* remainder = (CBC_ReedSolomonGF256Poly*)(temp->operator [](1));\r
82     CFX_Int32Array* coefficients = remainder->GetCoefficients();\r
83     int32_t numZeroCoefficients = ecBytes - coefficients->GetSize();\r
84     for(int32_t i = 0; i < numZeroCoefficients; i++) {\r
85         (*toEncode)[dataBytes + i] = 0;\r
86     }\r
87     for(int32_t y = 0; y < coefficients->GetSize(); y++) {\r
88         (*toEncode)[dataBytes + numZeroCoefficients + y] =\r
89             coefficients->operator [](y);\r
90     }\r
91     for (int32_t k = 0; k < temp->GetSize(); k++) {\r
92         delete (CBC_ReedSolomonGF256Poly*)(*temp)[k];\r
93     }\r
94 }\r
95 CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder()\r
96 {\r
97     for (int32_t i = 0; i < m_cachedGenerators.GetSize(); i++) {\r
98         delete (CBC_ReedSolomonGF256Poly*)m_cachedGenerators[i];\r
99     }\r
100 }\r