| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 // Original code is licensed as follows: | |
| 7 /* | |
| 8 * Copyright 2013 ZXing authors | |
| 9 * | |
| 10 * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 11 * you may not use this file except in compliance with the License. | |
| 12 * You may obtain a copy of the License at | |
| 13 * | |
| 14 * http://www.apache.org/licenses/LICENSE-2.0 | |
| 15 * | |
| 16 * Unless required by applicable law or agreed to in writing, software | |
| 17 * distributed under the License is distributed on an "AS IS" BASIS, | |
| 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 19 * See the License for the specific language governing permissions and | |
| 20 * limitations under the License. | |
| 21 */ | |
| 22 | |
| 23 #include "xfa/src/fxbarcode/BC_ResultPoint.h" | |
| 24 #include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" | |
| 25 #include "xfa/src/fxbarcode/pdf417/BC_PDF417BoundingBox.h" | |
| 26 #include "xfa/src/fxbarcode/utils.h" | |
| 27 | |
| 28 CBC_BoundingBox::CBC_BoundingBox(CBC_CommonBitMatrix* image, | |
| 29 CBC_ResultPoint* topLeft, | |
| 30 CBC_ResultPoint* bottomLeft, | |
| 31 CBC_ResultPoint* topRight, | |
| 32 CBC_ResultPoint* bottomRight, | |
| 33 int32_t& e) { | |
| 34 if ((topLeft == NULL && topRight == NULL) || | |
| 35 (bottomLeft == NULL && bottomRight == NULL) || | |
| 36 (topLeft && bottomLeft == NULL) || (topRight && bottomRight == NULL)) { | |
| 37 e = BCExceptionNotFoundInstance; | |
| 38 } | |
| 39 init(image, topLeft, bottomLeft, topRight, bottomRight); | |
| 40 } | |
| 41 CBC_BoundingBox::CBC_BoundingBox(CBC_BoundingBox* boundingBox) { | |
| 42 init(boundingBox->m_image, boundingBox->m_topLeft, boundingBox->m_bottomLeft, | |
| 43 boundingBox->m_topRight, boundingBox->m_bottomRight); | |
| 44 } | |
| 45 CBC_BoundingBox::~CBC_BoundingBox() { | |
| 46 if (m_topLeft) { | |
| 47 delete m_topLeft; | |
| 48 } | |
| 49 if (m_bottomLeft) { | |
| 50 delete m_bottomLeft; | |
| 51 } | |
| 52 if (m_topRight) { | |
| 53 delete m_topRight; | |
| 54 } | |
| 55 if (m_bottomRight) { | |
| 56 delete m_bottomRight; | |
| 57 } | |
| 58 } | |
| 59 CBC_BoundingBox* CBC_BoundingBox::merge(CBC_BoundingBox* leftBox, | |
| 60 CBC_BoundingBox* rightBox, | |
| 61 int32_t& e) { | |
| 62 CBC_BoundingBox* boundingBox = NULL; | |
| 63 if (leftBox == NULL) { | |
| 64 boundingBox = new CBC_BoundingBox(rightBox); | |
| 65 return boundingBox; | |
| 66 } | |
| 67 if (rightBox == NULL) { | |
| 68 boundingBox = new CBC_BoundingBox(leftBox); | |
| 69 return boundingBox; | |
| 70 } | |
| 71 boundingBox = new CBC_BoundingBox(leftBox->m_image, leftBox->m_topLeft, | |
| 72 leftBox->m_bottomLeft, rightBox->m_topRight, | |
| 73 rightBox->m_bottomRight, e); | |
| 74 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
| 75 return boundingBox; | |
| 76 } | |
| 77 CBC_BoundingBox* CBC_BoundingBox::addMissingRows(int32_t missingStartRows, | |
| 78 int32_t missingEndRows, | |
| 79 FX_BOOL isLeft, | |
| 80 int32_t& e) { | |
| 81 CBC_ResultPoint* newTopLeft = m_topLeft; | |
| 82 CBC_ResultPoint* newBottomLeft = m_bottomLeft; | |
| 83 CBC_ResultPoint* newTopRight = m_topRight; | |
| 84 CBC_ResultPoint* newBottomRight = m_bottomRight; | |
| 85 CBC_ResultPoint* newTop = NULL; | |
| 86 CBC_ResultPoint* newBottom = NULL; | |
| 87 if (missingStartRows > 0) { | |
| 88 CBC_ResultPoint* top = isLeft ? m_topLeft : m_topRight; | |
| 89 int32_t newMinY = (int32_t)top->GetY() - missingStartRows; | |
| 90 if (newMinY < 0) { | |
| 91 newMinY = 0; | |
| 92 } | |
| 93 newTop = new CBC_ResultPoint((FX_FLOAT)top->GetX(), (FX_FLOAT)newMinY); | |
| 94 if (isLeft) { | |
| 95 newTopLeft = newTop; | |
| 96 } else { | |
| 97 newTopRight = newTop; | |
| 98 } | |
| 99 } | |
| 100 if (missingEndRows > 0) { | |
| 101 CBC_ResultPoint* bottom = isLeft ? m_bottomLeft : m_bottomRight; | |
| 102 int32_t newMaxY = (int32_t)bottom->GetY() + missingEndRows; | |
| 103 if (newMaxY >= m_image->GetHeight()) { | |
| 104 newMaxY = m_image->GetHeight() - 1; | |
| 105 } | |
| 106 newBottom = | |
| 107 new CBC_ResultPoint((FX_FLOAT)bottom->GetX(), (FX_FLOAT)newMaxY); | |
| 108 if (isLeft) { | |
| 109 newBottomLeft = newBottom; | |
| 110 } else { | |
| 111 newBottomRight = newBottom; | |
| 112 } | |
| 113 } | |
| 114 calculateMinMaxValues(); | |
| 115 CBC_BoundingBox* boundingBox = new CBC_BoundingBox( | |
| 116 m_image, newTopLeft, newBottomLeft, newTopRight, newBottomRight, e); | |
| 117 delete newTop; | |
| 118 delete newBottom; | |
| 119 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
| 120 return boundingBox; | |
| 121 } | |
| 122 void CBC_BoundingBox::setTopRight(CBC_ResultPoint topRight) { | |
| 123 if (m_topRight) { | |
| 124 delete m_topRight; | |
| 125 } | |
| 126 m_topRight = new CBC_ResultPoint(topRight.GetX(), topRight.GetY()); | |
| 127 calculateMinMaxValues(); | |
| 128 } | |
| 129 void CBC_BoundingBox::setBottomRight(CBC_ResultPoint bottomRight) { | |
| 130 if (m_bottomRight) { | |
| 131 delete m_bottomRight; | |
| 132 } | |
| 133 m_bottomRight = new CBC_ResultPoint(bottomRight.GetX(), bottomRight.GetY()); | |
| 134 calculateMinMaxValues(); | |
| 135 } | |
| 136 int32_t CBC_BoundingBox::getMinX() { | |
| 137 return m_minX; | |
| 138 } | |
| 139 int32_t CBC_BoundingBox::getMaxX() { | |
| 140 return m_maxX; | |
| 141 } | |
| 142 int32_t CBC_BoundingBox::getMinY() { | |
| 143 return m_minY; | |
| 144 } | |
| 145 int32_t CBC_BoundingBox::getMaxY() { | |
| 146 return m_maxY; | |
| 147 } | |
| 148 CBC_ResultPoint* CBC_BoundingBox::getTopLeft() { | |
| 149 return m_topLeft; | |
| 150 } | |
| 151 CBC_ResultPoint* CBC_BoundingBox::getTopRight() { | |
| 152 return m_topRight; | |
| 153 } | |
| 154 CBC_ResultPoint* CBC_BoundingBox::getBottomLeft() { | |
| 155 return m_bottomLeft; | |
| 156 } | |
| 157 CBC_ResultPoint* CBC_BoundingBox::getBottomRight() { | |
| 158 return m_bottomRight; | |
| 159 } | |
| 160 void CBC_BoundingBox::init(CBC_CommonBitMatrix* image, | |
| 161 CBC_ResultPoint* topLeft, | |
| 162 CBC_ResultPoint* bottomLeft, | |
| 163 CBC_ResultPoint* topRight, | |
| 164 CBC_ResultPoint* bottomRight) { | |
| 165 m_topLeft = NULL; | |
| 166 m_bottomLeft = NULL; | |
| 167 m_topRight = NULL; | |
| 168 m_bottomRight = NULL; | |
| 169 m_image = image; | |
| 170 if (topLeft) { | |
| 171 m_topLeft = new CBC_ResultPoint(topLeft->GetX(), topLeft->GetY()); | |
| 172 } | |
| 173 if (bottomLeft) { | |
| 174 m_bottomLeft = new CBC_ResultPoint(bottomLeft->GetX(), bottomLeft->GetY()); | |
| 175 } | |
| 176 if (topRight) { | |
| 177 m_topRight = new CBC_ResultPoint(topRight->GetX(), topRight->GetY()); | |
| 178 } | |
| 179 if (bottomRight) { | |
| 180 m_bottomRight = | |
| 181 new CBC_ResultPoint(bottomRight->GetX(), bottomRight->GetY()); | |
| 182 } | |
| 183 calculateMinMaxValues(); | |
| 184 } | |
| 185 void CBC_BoundingBox::calculateMinMaxValues() { | |
| 186 if (m_topLeft == NULL) { | |
| 187 m_topLeft = new CBC_ResultPoint(0, m_topRight->GetY()); | |
| 188 m_bottomLeft = new CBC_ResultPoint(0, m_bottomRight->GetY()); | |
| 189 } else if (m_topRight == NULL) { | |
| 190 m_topRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, | |
| 191 (FX_FLOAT)m_topLeft->GetY()); | |
| 192 m_bottomRight = new CBC_ResultPoint((FX_FLOAT)m_image->GetWidth() - 1, | |
| 193 (FX_FLOAT)m_bottomLeft->GetY()); | |
| 194 } | |
| 195 m_minX = (int32_t)(m_topLeft->GetX() < m_bottomLeft->GetX() | |
| 196 ? m_topLeft->GetX() | |
| 197 : m_bottomLeft->GetX()); | |
| 198 m_maxX = (int32_t)(m_topRight->GetX() > m_bottomRight->GetX() | |
| 199 ? m_topRight->GetX() | |
| 200 : m_bottomRight->GetX()); | |
| 201 m_minY = | |
| 202 (int32_t)(m_topLeft->GetY() < m_topRight->GetY() ? m_topLeft->GetY() | |
| 203 : m_topRight->GetY()); | |
| 204 m_maxY = (int32_t)(m_bottomLeft->GetY() > m_bottomRight->GetY() | |
| 205 ? m_bottomLeft->GetY() | |
| 206 : m_bottomRight->GetY()); | |
| 207 } | |
| OLD | NEW |