OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium 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 #include "SkConvolver.h" | 5 #include "SkConvolver.h" |
6 #include "SkSize.h" | 6 #include "SkSize.h" |
7 #include "SkTypes.h" | 7 #include "SkTypes.h" |
8 | 8 |
9 namespace { | 9 namespace { |
10 | 10 |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 // It is common for leading/trailing filter values to be zeros. In such | 276 // It is common for leading/trailing filter values to be zeros. In such |
277 // cases it is beneficial to only store the central factors. | 277 // cases it is beneficial to only store the central factors. |
278 // For a scaling to 1/4th in each dimension using a Lanczos-2 filter on | 278 // For a scaling to 1/4th in each dimension using a Lanczos-2 filter on |
279 // a 1080p image this optimization gives a ~10% speed improvement. | 279 // a 1080p image this optimization gives a ~10% speed improvement. |
280 int filterSize = filterLength; | 280 int filterSize = filterLength; |
281 int firstNonZero = 0; | 281 int firstNonZero = 0; |
282 while (firstNonZero < filterLength && filterValues[firstNonZero] == 0) { | 282 while (firstNonZero < filterLength && filterValues[firstNonZero] == 0) { |
283 firstNonZero++; | 283 firstNonZero++; |
284 } | 284 } |
285 | 285 |
| 286 int initialOffset = fFilterValues.count(); |
286 if (firstNonZero < filterLength) { | 287 if (firstNonZero < filterLength) { |
287 // Here we have at least one non-zero factor. | 288 // Here we have at least one non-zero factor. |
288 int lastNonZero = filterLength - 1; | 289 int lastNonZero = filterLength - 1; |
289 while (lastNonZero >= 0 && filterValues[lastNonZero] == 0) { | 290 while (lastNonZero >= 0 && filterValues[lastNonZero] == 0) { |
290 lastNonZero--; | 291 lastNonZero--; |
291 } | 292 } |
292 | 293 |
293 filterOffset += firstNonZero; | 294 filterOffset += firstNonZero; |
294 filterLength = lastNonZero + 1 - firstNonZero; | 295 filterLength = lastNonZero + 1 - firstNonZero; |
295 SkASSERT(filterLength > 0); | 296 SkASSERT(filterLength > 0); |
296 | 297 |
| 298 // Calling fFilterValues.reset(), or push_back() in a loop, are expensiv
e. |
| 299 // Over-allocate so we can do it once instead of iteratively. |
| 300 if (!initialOffset) fFilterValues.resize_back(filterLength * filterLengt
h); |
297 for (int i = firstNonZero; i <= lastNonZero; i++) { | 301 for (int i = firstNonZero; i <= lastNonZero; i++) { |
298 fFilterValues.push_back(filterValues[i]); | 302 fFilterValues[initialOffset + i - firstNonZero] = filterValues[i]; |
299 } | 303 } |
| 304 |
300 } else { | 305 } else { |
301 // Here all the factors were zeroes. | 306 // Here all the factors were zeroes. |
302 filterLength = 0; | 307 filterLength = 0; |
303 } | 308 } |
304 | 309 |
305 FilterInstance instance; | 310 FilterInstance instance; |
306 | 311 |
307 // We pushed filterLength elements onto fFilterValues | 312 // We pushed filterLength elements onto fFilterValues |
308 instance.fDataLocation = (static_cast<int>(fFilterValues.count()) - | 313 instance.fDataLocation = (static_cast<int>(fFilterValues.count()) - |
309 filterLength); | 314 filterLength); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 filterX.numValues(), curOutputRow
, | 457 filterX.numValues(), curOutputRow
, |
453 sourceHasAlpha); | 458 sourceHasAlpha); |
454 } else { | 459 } else { |
455 ConvolveVertically(filterValues, filterLength, | 460 ConvolveVertically(filterValues, filterLength, |
456 firstRowForFilter, | 461 firstRowForFilter, |
457 filterX.numValues(), curOutputRow, | 462 filterX.numValues(), curOutputRow, |
458 sourceHasAlpha); | 463 sourceHasAlpha); |
459 } | 464 } |
460 } | 465 } |
461 } | 466 } |
OLD | NEW |