OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 // Original code is licensed as follows: | 6 // Original code is licensed as follows: |
7 /* | 7 /* |
8 * Copyright 2009 ZXing authors | 8 * Copyright 2009 ZXing authors |
9 * | 9 * |
10 * Licensed under the Apache License, Version 2.0 (the "License"); | 10 * Licensed under the Apache License, Version 2.0 (the "License"); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 if (vertices) { | 117 if (vertices) { |
118 delete (vertices); | 118 delete (vertices); |
119 } | 119 } |
120 break; | 120 break; |
121 } | 121 } |
122 foundBarcodeInRow = FALSE; | 122 foundBarcodeInRow = FALSE; |
123 column = 0; | 123 column = 0; |
124 for (int32_t i = 0; i < barcodeCoordinates->GetSize(); i++) { | 124 for (int32_t i = 0; i < barcodeCoordinates->GetSize(); i++) { |
125 CFX_PtrArray* barcodeCoordinate = | 125 CFX_PtrArray* barcodeCoordinate = |
126 (CFX_PtrArray*)barcodeCoordinates->GetAt(i); | 126 (CFX_PtrArray*)barcodeCoordinates->GetAt(i); |
127 if (barcodeCoordinate->GetAt(1) != NULL) { | 127 if (barcodeCoordinate->GetAt(1)) { |
128 row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY(); | 128 row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(1))->GetY(); |
129 } | 129 } |
130 if (barcodeCoordinate->GetAt(3) != NULL) { | 130 if (barcodeCoordinate->GetAt(3)) { |
131 row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY(); | 131 row = row > ((CBC_ResultPoint*)barcodeCoordinate->GetAt(3))->GetY(); |
132 } | 132 } |
133 } | 133 } |
134 row += ROW_STEP; | 134 row += ROW_STEP; |
135 if (vertices) { | 135 if (vertices) { |
136 delete (vertices); | 136 delete (vertices); |
137 } | 137 } |
138 continue; | 138 continue; |
139 } | 139 } |
140 foundBarcodeInRow = TRUE; | 140 foundBarcodeInRow = TRUE; |
141 barcodeCoordinates->Add(vertices); | 141 barcodeCoordinates->Add(vertices); |
142 if (!multiple) { | 142 if (!multiple) { |
143 break; | 143 break; |
144 } | 144 } |
145 if (vertices->GetAt(2) != NULL) { | 145 if (vertices->GetAt(2)) { |
146 column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetX(); | 146 column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetX(); |
147 row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetY(); | 147 row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(2))->GetY(); |
148 } else { | 148 } else { |
149 column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetX(); | 149 column = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetX(); |
150 row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetY(); | 150 row = (int32_t)((CBC_ResultPoint*)vertices->GetAt(4))->GetY(); |
151 } | 151 } |
152 } | 152 } |
153 return barcodeCoordinates; | 153 return barcodeCoordinates; |
154 } | 154 } |
155 CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix, | 155 CFX_PtrArray* CBC_Detector::findVertices(CBC_CommonBitMatrix* matrix, |
156 int32_t startRow, | 156 int32_t startRow, |
157 int32_t startColumn) { | 157 int32_t startColumn) { |
158 int32_t height = matrix->GetHeight(); | 158 int32_t height = matrix->GetHeight(); |
159 int32_t width = matrix->GetWidth(); | 159 int32_t width = matrix->GetWidth(); |
160 CFX_PtrArray* result = new CFX_PtrArray; | 160 CFX_PtrArray* result = new CFX_PtrArray; |
161 result->SetSize(8); | 161 result->SetSize(8); |
162 CFX_PtrArray* startptr = findRowsWithPattern( | 162 CFX_PtrArray* startptr = findRowsWithPattern( |
163 matrix, height, width, startRow, startColumn, START_PATTERN, | 163 matrix, height, width, startRow, startColumn, START_PATTERN, |
164 sizeof(START_PATTERN) / sizeof(START_PATTERN[0])); | 164 sizeof(START_PATTERN) / sizeof(START_PATTERN[0])); |
165 copyToResult( | 165 copyToResult( |
166 result, startptr, INDEXES_START_PATTERN, | 166 result, startptr, INDEXES_START_PATTERN, |
167 sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0])); | 167 sizeof(INDEXES_START_PATTERN) / sizeof(INDEXES_START_PATTERN[0])); |
168 startptr->RemoveAll(); | 168 startptr->RemoveAll(); |
169 delete startptr; | 169 delete startptr; |
170 if (result->GetAt(4) != NULL) { | 170 if (result->GetAt(4)) { |
171 startColumn = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetX(); | 171 startColumn = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetX(); |
172 startRow = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetY(); | 172 startRow = (int32_t)((CBC_ResultPoint*)result->GetAt(4))->GetY(); |
173 } | 173 } |
174 CFX_PtrArray* stopptr = findRowsWithPattern( | 174 CFX_PtrArray* stopptr = findRowsWithPattern( |
175 matrix, height, width, startRow, startColumn, STOP_PATTERN, | 175 matrix, height, width, startRow, startColumn, STOP_PATTERN, |
176 sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0])); | 176 sizeof(STOP_PATTERN) / sizeof(STOP_PATTERN[0])); |
177 copyToResult(result, stopptr, INDEXES_STOP_PATTERN, | 177 copyToResult(result, stopptr, INDEXES_STOP_PATTERN, |
178 sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0])); | 178 sizeof(INDEXES_STOP_PATTERN) / sizeof(INDEXES_STOP_PATTERN[0])); |
179 stopptr->RemoveAll(); | 179 stopptr->RemoveAll(); |
180 delete stopptr; | 180 delete stopptr; |
(...skipping 16 matching lines...) Expand all Loading... |
197 int32_t patternLength) { | 197 int32_t patternLength) { |
198 CFX_PtrArray* result = new CFX_PtrArray; | 198 CFX_PtrArray* result = new CFX_PtrArray; |
199 result->SetSize(4); | 199 result->SetSize(4); |
200 FX_BOOL found = FALSE; | 200 FX_BOOL found = FALSE; |
201 CFX_Int32Array counters; | 201 CFX_Int32Array counters; |
202 counters.SetSize(patternLength); | 202 counters.SetSize(patternLength); |
203 for (; startRow < height; startRow += ROW_STEP) { | 203 for (; startRow < height; startRow += ROW_STEP) { |
204 CFX_Int32Array* loc = | 204 CFX_Int32Array* loc = |
205 findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, | 205 findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, |
206 patternLength, counters); | 206 patternLength, counters); |
207 if (loc != NULL) { | 207 if (loc) { |
208 while (startRow > 0) { | 208 while (startRow > 0) { |
209 CFX_Int32Array* previousRowLoc = | 209 CFX_Int32Array* previousRowLoc = |
210 findGuardPattern(matrix, startColumn, --startRow, width, FALSE, | 210 findGuardPattern(matrix, startColumn, --startRow, width, FALSE, |
211 pattern, patternLength, counters); | 211 pattern, patternLength, counters); |
212 if (previousRowLoc != NULL) { | 212 if (previousRowLoc) { |
213 delete loc; | 213 delete loc; |
214 loc = previousRowLoc; | 214 loc = previousRowLoc; |
215 } else { | 215 } else { |
216 startRow++; | 216 startRow++; |
217 break; | 217 break; |
218 } | 218 } |
219 } | 219 } |
220 result->SetAt( | 220 result->SetAt( |
221 0, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); | 221 0, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); |
222 result->SetAt( | 222 result->SetAt( |
223 1, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); | 223 1, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); |
224 found = TRUE; | 224 found = TRUE; |
225 delete loc; | 225 delete loc; |
226 break; | 226 break; |
227 } | 227 } |
228 } | 228 } |
229 int32_t stopRow = startRow + 1; | 229 int32_t stopRow = startRow + 1; |
230 if (found) { | 230 if (found) { |
231 int32_t skippedRowCount = 0; | 231 int32_t skippedRowCount = 0; |
232 CFX_Int32Array previousRowLoc; | 232 CFX_Int32Array previousRowLoc; |
233 previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(0))->GetX()); | 233 previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(0))->GetX()); |
234 previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(1))->GetX()); | 234 previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(1))->GetX()); |
235 for (; stopRow < height; stopRow++) { | 235 for (; stopRow < height; stopRow++) { |
236 CFX_Int32Array* loc = | 236 CFX_Int32Array* loc = |
237 findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, | 237 findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, |
238 pattern, patternLength, counters); | 238 pattern, patternLength, counters); |
239 if (loc != NULL && | 239 if (loc && abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && |
240 abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && | |
241 abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { | 240 abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { |
242 previousRowLoc.Copy(*loc); | 241 previousRowLoc.Copy(*loc); |
243 skippedRowCount = 0; | 242 skippedRowCount = 0; |
244 } else { | 243 } else { |
245 if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { | 244 if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { |
246 delete loc; | 245 delete loc; |
247 break; | 246 break; |
248 } else { | 247 } else { |
249 skippedRowCount++; | 248 skippedRowCount++; |
250 } | 249 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 int32_t scaledPattern = pattern[x] * unitBarWidth; | 343 int32_t scaledPattern = pattern[x] * unitBarWidth; |
345 int32_t variance = counter > scaledPattern ? counter - scaledPattern | 344 int32_t variance = counter > scaledPattern ? counter - scaledPattern |
346 : scaledPattern - counter; | 345 : scaledPattern - counter; |
347 if (variance > maxIndividualVariance) { | 346 if (variance > maxIndividualVariance) { |
348 return INTEGER_MAX; | 347 return INTEGER_MAX; |
349 } | 348 } |
350 totalVariance += variance; | 349 totalVariance += variance; |
351 } | 350 } |
352 return totalVariance / total; | 351 return totalVariance / total; |
353 } | 352 } |
OLD | NEW |