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