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" |
| 11 #include "SkGpuBlurUtils.h" | |
| 12 #include "SkOpts.h" | |
| 11 #include "SkReadBuffer.h" | 13 #include "SkReadBuffer.h" |
| 12 #include "SkWriteBuffer.h" | 14 #include "SkWriteBuffer.h" |
| 13 #include "SkGpuBlurUtils.h" | |
| 14 #include "SkBlurImage_opts.h" | |
| 15 #if SK_SUPPORT_GPU | 15 #if SK_SUPPORT_GPU |
| 16 #include "GrContext.h" | 16 #include "GrContext.h" |
| 17 #endif | 17 #endif |
| 18 | 18 |
| 19 // This rather arbitrary-looking value results in a maximum box blur kernel size | 19 // This rather arbitrary-looking value results in a maximum box blur kernel size |
| 20 // of 1000 pixels on the raster path, which matches the WebKit and Firefox | 20 // of 1000 pixels on the raster path, which matches the WebKit and Firefox |
| 21 // implementations. Since the GPU path does not compute a box blur, putting | 21 // implementations. Since the GPU path does not compute a box blur, putting |
| 22 // the limit on sigma ensures consistent behaviour between the GPU and | 22 // the limit on sigma ensures consistent behaviour between the GPU and |
| 23 // raster paths. | 23 // raster paths. |
| 24 #define MAX_SIGMA SkIntToScalar(532) | 24 #define MAX_SIGMA SkIntToScalar(532) |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 197 } | 197 } |
| 198 | 198 |
| 199 offset->fX = srcBounds.fLeft; | 199 offset->fX = srcBounds.fLeft; |
| 200 offset->fY = srcBounds.fTop; | 200 offset->fY = srcBounds.fTop; |
| 201 srcBounds.offset(-srcOffset); | 201 srcBounds.offset(-srcOffset); |
| 202 const SkPMColor* s = src.getAddr32(srcBounds.left(), srcBounds.top()); | 202 const SkPMColor* s = src.getAddr32(srcBounds.left(), srcBounds.top()); |
| 203 SkPMColor* t = temp.getAddr32(0, 0); | 203 SkPMColor* t = temp.getAddr32(0, 0); |
| 204 SkPMColor* d = dst->getAddr32(0, 0); | 204 SkPMColor* d = dst->getAddr32(0, 0); |
| 205 int w = dstBounds.width(), h = dstBounds.height(); | 205 int w = dstBounds.width(), h = dstBounds.height(); |
| 206 int sw = src.rowBytesAsPixels(); | 206 int sw = src.rowBytesAsPixels(); |
| 207 SkBoxBlurProc boxBlurX, boxBlurXY, boxBlurYX; | 207 |
| 208 if (!SkBoxBlurGetPlatformProcs(&boxBlurX, &boxBlurXY, &boxBlurYX)) { | 208 auto boxBlurX = SkOpts::box_blur_xx, |
|
djsollen
2015/08/04 14:39:56
instead of Auto would it be more clear if we used
mtklein
2015/08/04 14:46:44
Both seem fine to me. Do you prefer SkOpts::BoxBl
djsollen
2015/08/04 14:56:17
Yeah, I find it more clear as a reader.
| |
| 209 boxBlurX = boxBlur<kX, kX>; | 209 boxBlurXY = SkOpts::box_blur_xy, |
| 210 boxBlurXY = boxBlur<kX, kY>; | 210 boxBlurYX = SkOpts::box_blur_yx; |
| 211 boxBlurYX = boxBlur<kY, kX>; | 211 if (!boxBlurX ) { boxBlurX = boxBlur<kX, kX>; } |
| 212 } | 212 if (!boxBlurXY) { boxBlurXY = boxBlur<kX, kY>; } |
| 213 if (!boxBlurYX) { boxBlurYX = boxBlur<kY, kX>; } | |
| 213 | 214 |
| 214 if (kernelSizeX > 0 && kernelSizeY > 0) { | 215 if (kernelSizeX > 0 && kernelSizeY > 0) { |
| 215 boxBlurX(s, sw, t, kernelSizeX, lowOffsetX, highOffsetX, w, h); | 216 boxBlurX(s, sw, t, kernelSizeX, lowOffsetX, highOffsetX, w, h); |
| 216 boxBlurX(t, w, d, kernelSizeX, highOffsetX, lowOffsetX, w, h); | 217 boxBlurX(t, w, d, kernelSizeX, highOffsetX, lowOffsetX, w, h); |
| 217 boxBlurXY(d, w, t, kernelSizeX3, highOffsetX, highOffsetX, w, h); | 218 boxBlurXY(d, w, t, kernelSizeX3, highOffsetX, highOffsetX, w, h); |
| 218 boxBlurX(t, h, d, kernelSizeY, lowOffsetY, highOffsetY, h, w); | 219 boxBlurX(t, h, d, kernelSizeY, lowOffsetY, highOffsetY, h, w); |
| 219 boxBlurX(d, h, t, kernelSizeY, highOffsetY, lowOffsetY, h, w); | 220 boxBlurX(d, h, t, kernelSizeY, highOffsetY, lowOffsetY, h, w); |
| 220 boxBlurXY(t, h, d, kernelSizeY3, highOffsetY, highOffsetY, h, w); | 221 boxBlurXY(t, h, d, kernelSizeY3, highOffsetY, highOffsetY, h, w); |
| 221 } else if (kernelSizeX > 0) { | 222 } else if (kernelSizeX > 0) { |
| 222 boxBlurX(s, sw, d, kernelSizeX, lowOffsetX, highOffsetX, w, h); | 223 boxBlurX(s, sw, d, kernelSizeX, lowOffsetX, highOffsetX, w, h); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 253 } | 254 } |
| 254 *dst = bounds; | 255 *dst = bounds; |
| 255 return true; | 256 return true; |
| 256 } | 257 } |
| 257 | 258 |
| 258 bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, | 259 bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, |
| 259 SkBitmap* result, SkIPoint* offset) const { | 260 SkBitmap* result, SkIPoint* offset) const { |
| 260 #if SK_SUPPORT_GPU | 261 #if SK_SUPPORT_GPU |
| 261 SkBitmap input = src; | 262 SkBitmap input = src; |
| 262 SkIPoint srcOffset = SkIPoint::Make(0, 0); | 263 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 263 if (this->getInput(0) && | 264 if (this->getInput(0) && |
| 264 !this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffse t)) { | 265 !this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffse t)) { |
| 265 return false; | 266 return false; |
| 266 } | 267 } |
| 267 SkIRect rect; | 268 SkIRect rect; |
| 268 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &rect, &input)) { | 269 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &rect, &input)) { |
| 269 return false; | 270 return false; |
| 270 } | 271 } |
| 271 GrTexture* source = input.getTexture(); | 272 GrTexture* source = input.getTexture(); |
| 272 SkVector sigma = mapSigma(fSigma, ctx.ctm()); | 273 SkVector sigma = mapSigma(fSigma, ctx.ctm()); |
| 273 offset->fX = rect.fLeft; | 274 offset->fX = rect.fLeft; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 296 str->appendf("SkBlurImageFilter: ("); | 297 str->appendf("SkBlurImageFilter: ("); |
| 297 str->appendf("sigma: (%f, %f) input (", fSigma.fWidth, fSigma.fHeight); | 298 str->appendf("sigma: (%f, %f) input (", fSigma.fWidth, fSigma.fHeight); |
| 298 | 299 |
| 299 if (this->getInput(0)) { | 300 if (this->getInput(0)) { |
| 300 this->getInput(0)->toString(str); | 301 this->getInput(0)->toString(str); |
| 301 } | 302 } |
| 302 | 303 |
| 303 str->append("))"); | 304 str->append("))"); |
| 304 } | 305 } |
| 305 #endif | 306 #endif |
| OLD | NEW |