Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / pdf417 / BC_PDF417BoundingBox.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 2013 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_ResultPoint.h"\r
25 #include "../common/BC_CommonBitMatrix.h"\r
26 #include "BC_PDF417BoundingBox.h"\r
27 CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight, int32_t &e)\r
28 {\r
29     if ((topLeft == NULL && topRight == NULL) ||\r
30             (bottomLeft == NULL && bottomRight == NULL) ||\r
31             (topLeft != NULL && bottomLeft == NULL) ||\r
32             (topRight != NULL && bottomRight == NULL)) {\r
33         e = BCExceptionNotFoundInstance;\r
34     }\r
35     init(image, topLeft, bottomLeft, topRight, bottomRight);\r
36 }\r
37 CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox)\r
38 {\r
39     init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft, boundingBox->m_topRight, boundingBox->m_bottomRight);\r
40 }\r
41 CBC_BoundingBox::~CBC_BoundingBox()\r
42 {\r
43     if (m_topLeft) {\r
44         delete m_topLeft;\r
45     }\r
46     if (m_bottomLeft) {\r
47         delete m_bottomLeft;\r
48     }\r
49     if (m_topRight) {\r
50         delete m_topRight;\r
51     }\r
52     if (m_bottomRight) {\r
53         delete m_bottomRight;\r
54     }\r
55 }\r
56 CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox, CBC_BoundingBox* rightBox, int32_t &e)\r
57 {\r
58     CBC_BoundingBox* boundingBox = NULL;\r
59     if (leftBox == NULL) {\r
60         boundingBox = FX_NEW CBC_BoundingBox(rightBox);\r
61         return boundingBox;\r
62     }\r
63     if (rightBox == NULL) {\r
64         boundingBox = FX_NEW CBC_BoundingBox(leftBox);\r
65         return boundingBox;\r
66     }\r
67     boundingBox = FX_NEW CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft, leftBox->m_bottomLeft, rightBox->m_topRight, rightBox->m_bottomRight, e);\r
68     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
69     return boundingBox;\r
70 }\r
71 CBC_BoundingBox* CBC_BoundingBox::addMissingRows(int32_t missingStartRows, int32_t missingEndRows, FX_BOOL isLeft, int32_t &e)\r
72 {\r
73     CBC_ResultPoint* newTopLeft = m_topLeft;\r
74     CBC_ResultPoint* newBottomLeft = m_bottomLeft;\r
75     CBC_ResultPoint* newTopRight = m_topRight;\r
76     CBC_ResultPoint* newBottomRight = m_bottomRight;\r
77     CBC_ResultPoint* newTop = NULL;\r
78     CBC_ResultPoint* newBottom = NULL;\r
79     if (missingStartRows > 0) {\r
80         CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight;\r
81         int32_t newMinY = (int32_t) top->GetY() - missingStartRows;\r
82         if (newMinY < 0) {\r
83             newMinY = 0;\r
84         }\r
85         newTop = FX_NEW CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY);\r
86         if (isLeft) {\r
87             newTopLeft = newTop;\r
88         } else {\r
89             newTopRight = newTop;\r
90         }\r
91     }\r
92     if (missingEndRows > 0) {\r
93         CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight;\r
94         int32_t newMaxY = (int32_t) bottom->GetY() + missingEndRows;\r
95         if (newMaxY >= m_image->GetHeight()) {\r
96             newMaxY = m_image->GetHeight() - 1;\r
97         }\r
98         newBottom = FX_NEW CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY);\r
99         if (isLeft) {\r
100             newBottomLeft = newBottom;\r
101         } else {\r
102             newBottomRight = newBottom;\r
103         }\r
104     }\r
105     calculateMinMaxValues();\r
106     CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e);\r
107     delete newTop;\r
108     delete newBottom;\r
109     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
110     return boundingBox;\r
111 }\r
112 void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight)\r
113 {\r
114     if (m_topRight) {\r
115         delete m_topRight;\r
116     }\r
117     m_topRight = FX_NEW CBC_ResultPoint(topRight.GetX(), topRight.GetY());\r
118     calculateMinMaxValues();\r
119 }\r
120 void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight)\r
121 {\r
122     if (m_bottomRight) {\r
123         delete m_bottomRight;\r
124     }\r
125     m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY());\r
126     calculateMinMaxValues();\r
127 }\r
128 int32_t CBC_BoundingBox::getMinX()\r
129 {\r
130     return m_minX;\r
131 }\r
132 int32_t CBC_BoundingBox::getMaxX()\r
133 {\r
134     return m_maxX;\r
135 }\r
136 int32_t CBC_BoundingBox::getMinY()\r
137 {\r
138     return m_minY;\r
139 }\r
140 int32_t CBC_BoundingBox::getMaxY()\r
141 {\r
142     return m_maxY;\r
143 }\r
144 CBC_ResultPoint* CBC_BoundingBox::getTopLeft()\r
145 {\r
146     return m_topLeft;\r
147 }\r
148 CBC_ResultPoint* CBC_BoundingBox::getTopRight()\r
149 {\r
150     return m_topRight;\r
151 }\r
152 CBC_ResultPoint* CBC_BoundingBox::getBottomLeft()\r
153 {\r
154     return m_bottomLeft;\r
155 }\r
156 CBC_ResultPoint* CBC_BoundingBox::getBottomRight()\r
157 {\r
158     return m_bottomRight;\r
159 }\r
160 void CBC_BoundingBox::init(CBC_CommonBitMatrix* image, CBC_ResultPoint* topLeft, CBC_ResultPoint* bottomLeft, CBC_ResultPoint* topRight, CBC_ResultPoint* bottomRight)\r
161 {\r
162     m_topLeft = NULL;\r
163     m_bottomLeft = NULL;\r
164     m_topRight = NULL;\r
165     m_bottomRight = NULL;\r
166     m_image = image;\r
167     if (topLeft) {\r
168         m_topLeft = FX_NEW CBC_ResultPoint(topLeft->GetX(), topLeft->GetY());\r
169     }\r
170     if (bottomLeft) {\r
171         m_bottomLeft = FX_NEW CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY());\r
172     }\r
173     if (topRight) {\r
174         m_topRight = FX_NEW CBC_ResultPoint(topRight->GetX(), topRight->GetY());\r
175     }\r
176     if (bottomRight) {\r
177         m_bottomRight = FX_NEW CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY());\r
178     }\r
179     calculateMinMaxValues();\r
180 }\r
181 void CBC_BoundingBox::calculateMinMaxValues()\r
182 {\r
183     if (m_topLeft == NULL) {\r
184         m_topLeft = FX_NEW CBC_ResultPoint(0, m_topRight->GetY());\r
185         m_bottomLeft = FX_NEW CBC_ResultPoint(0, m_bottomRight->GetY());\r
186     } else if (m_topRight == NULL) {\r
187         m_topRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_topLeft->GetY());\r
188         m_bottomRight = FX_NEW CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, (FX_FLOAT)m_bottomLeft->GetY());\r
189     }\r
190     m_minX = (int32_t) (m_topLeft->GetX() < m_bottomLeft->GetX() ? m_topLeft->GetX() : m_bottomLeft->GetX());\r
191     m_maxX = (int32_t) (m_topRight->GetX() > m_bottomRight->GetX() ? m_topRight->GetX() : m_bottomRight->GetX());\r
192     m_minY = (int32_t) (m_topLeft->GetY() <  m_topRight->GetY() ? m_topLeft->GetY() : m_topRight->GetY());\r
193     m_maxY = (int32_t) (m_bottomLeft->GetY() >  m_bottomRight->GetY() ? m_bottomLeft->GetY() : m_bottomRight->GetY());\r
194 }\r