Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkBlurImageFilter.h" | 9 #include "SkBlurImageFilter.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 SkColor* p = src.getAddr32(bounds.fLeft + x, bounds.fTop); | 94 SkColor* p = src.getAddr32(bounds.fLeft + x, bounds.fTop); |
| 95 for (int i = 0; i < bottomBorder; ++i) { | 95 for (int i = 0; i < bottomBorder; ++i) { |
| 96 sumA += SkGetPackedA32(*p); | 96 sumA += SkGetPackedA32(*p); |
| 97 sumR += SkGetPackedR32(*p); | 97 sumR += SkGetPackedR32(*p); |
| 98 sumG += SkGetPackedG32(*p); | 98 sumG += SkGetPackedG32(*p); |
| 99 sumB += SkGetPackedB32(*p); | 99 sumB += SkGetPackedB32(*p); |
| 100 p += srcStride; | 100 p += srcStride; |
| 101 } | 101 } |
| 102 | 102 |
| 103 const SkColor* sptr = src.getAddr32(bounds.fLeft + x, bounds.fTop); | 103 const SkColor* sptr = src.getAddr32(bounds.fLeft + x, bounds.fTop); |
| 104 const SkColor* back = sptr - topOffset * srcStride; | |
| 105 const SkColor* front = sptr + (bottomOffset + 1) * srcStride; | |
| 104 SkColor* dptr = dst->getAddr32(x, 0); | 106 SkColor* dptr = dst->getAddr32(x, 0); |
| 105 for (int y = 0; y < height; ++y) { | 107 for (int y = 0; y < height; ++y) { |
| 106 *dptr = SkPackARGB32(sumA / kernelSize, | 108 *dptr = SkPackARGB32(sumA / kernelSize, |
| 107 sumR / kernelSize, | 109 sumR / kernelSize, |
| 108 sumG / kernelSize, | 110 sumG / kernelSize, |
| 109 sumB / kernelSize); | 111 sumB / kernelSize); |
| 110 if (y >= topOffset) { | 112 if (y >= topOffset) { |
| 111 SkColor l = *(sptr - topOffset * srcStride); | 113 SkColor l = *back; |
| 112 sumA -= SkGetPackedA32(l); | 114 sumA -= SkGetPackedA32(l); |
| 113 sumR -= SkGetPackedR32(l); | 115 sumR -= SkGetPackedR32(l); |
| 114 sumG -= SkGetPackedG32(l); | 116 sumG -= SkGetPackedG32(l); |
| 115 sumB -= SkGetPackedB32(l); | 117 sumB -= SkGetPackedB32(l); |
| 116 } | 118 } |
| 117 if (y + bottomOffset + 1 < height) { | 119 if (y + bottomOffset + 1 < height) { |
| 118 SkColor r = *(sptr + (bottomOffset + 1) * srcStride); | 120 SkColor r = *front; |
| 119 sumA += SkGetPackedA32(r); | 121 sumA += SkGetPackedA32(r); |
| 120 sumR += SkGetPackedR32(r); | 122 sumR += SkGetPackedR32(r); |
| 121 sumG += SkGetPackedG32(r); | 123 sumG += SkGetPackedG32(r); |
| 122 sumB += SkGetPackedB32(r); | 124 sumB += SkGetPackedB32(r); |
| 123 } | 125 } |
| 124 sptr += srcStride; | 126 front += srcStride; |
| 125 dptr += dstStride; | 127 SK_PREFETCH(front); // This step by srcStride seems to be hard to p redict. |
|
Stephen White
2013/11/04 16:24:17
I'm a little leery of prefetch instructions, due t
| |
| 128 back += srcStride; // back will probably still be cached, so no hi nt needed. | |
| 129 dptr += dstStride; | |
| 126 } | 130 } |
| 127 } | 131 } |
| 128 } | 132 } |
| 129 | 133 |
| 130 static void getBox3Params(SkScalar s, int *kernelSize, int* kernelSize3, int *lo wOffset, | 134 static void getBox3Params(SkScalar s, int *kernelSize, int* kernelSize3, int *lo wOffset, |
| 131 int *highOffset) | 135 int *highOffset) |
| 132 { | 136 { |
| 133 float pi = SkScalarToFloat(SK_ScalarPI); | 137 float pi = SkScalarToFloat(SK_ScalarPI); |
| 134 int d = static_cast<int>(floorf(SkScalarToFloat(s) * 3.0f * sqrtf(2.0f * pi) / 4.0f + 0.5f)); | 138 int d = static_cast<int>(floorf(SkScalarToFloat(s) * 3.0f * sqrtf(2.0f * pi) / 4.0f + 0.5f)); |
| 135 *kernelSize = d; | 139 *kernelSize = d; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 231 fSigma.width(), | 235 fSigma.width(), |
| 232 fSigma.height())); | 236 fSigma.height())); |
| 233 offset->fX += rect.fLeft; | 237 offset->fX += rect.fLeft; |
| 234 offset->fY += rect.fTop; | 238 offset->fY += rect.fTop; |
| 235 return SkImageFilterUtils::WrapTexture(tex, rect.width(), rect.height(), res ult); | 239 return SkImageFilterUtils::WrapTexture(tex, rect.width(), rect.height(), res ult); |
| 236 #else | 240 #else |
| 237 SkDEBUGFAIL("Should not call in GPU-less build"); | 241 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 238 return false; | 242 return false; |
| 239 #endif | 243 #endif |
| 240 } | 244 } |
| OLD | NEW |