| 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 "SkReadBuffer.h" | 11 #include "SkReadBuffer.h" |
| 12 #include "SkWriteBuffer.h" | 12 #include "SkWriteBuffer.h" |
| 13 #include "SkGpuBlurUtils.h" | 13 #include "SkGpuBlurUtils.h" |
| 14 #include "SkBlurImage_opts.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 #include "SkImageFilterUtils.h" | |
| 18 #endif | 17 #endif |
| 19 | 18 |
| 20 SkBlurImageFilter::SkBlurImageFilter(SkReadBuffer& buffer) | 19 SkBlurImageFilter::SkBlurImageFilter(SkReadBuffer& buffer) |
| 21 : INHERITED(1, buffer) { | 20 : INHERITED(1, buffer) { |
| 22 fSigma.fWidth = buffer.readScalar(); | 21 fSigma.fWidth = buffer.readScalar(); |
| 23 fSigma.fHeight = buffer.readScalar(); | 22 fSigma.fHeight = buffer.readScalar(); |
| 24 buffer.validate(SkScalarIsFinite(fSigma.fWidth) && | 23 buffer.validate(SkScalarIsFinite(fSigma.fWidth) && |
| 25 SkScalarIsFinite(fSigma.fHeight) && | 24 SkScalarIsFinite(fSigma.fHeight) && |
| 26 (fSigma.fWidth >= 0) && | 25 (fSigma.fWidth >= 0) && |
| 27 (fSigma.fHeight >= 0)); | 26 (fSigma.fHeight >= 0)); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 ctm.mapVectors(&sigma, &localSigma, 1); | 246 ctm.mapVectors(&sigma, &localSigma, 1); |
| 248 bounds.outset(SkScalarCeilToInt(SkScalarMul(sigma.x(), SkIntToScalar(3))), | 247 bounds.outset(SkScalarCeilToInt(SkScalarMul(sigma.x(), SkIntToScalar(3))), |
| 249 SkScalarCeilToInt(SkScalarMul(sigma.y(), SkIntToScalar(3)))); | 248 SkScalarCeilToInt(SkScalarMul(sigma.y(), SkIntToScalar(3)))); |
| 250 *dst = bounds; | 249 *dst = bounds; |
| 251 return true; | 250 return true; |
| 252 } | 251 } |
| 253 | 252 |
| 254 bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
SkMatrix& ctm, | 253 bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
SkMatrix& ctm, |
| 255 SkBitmap* result, SkIPoint* offset) const
{ | 254 SkBitmap* result, SkIPoint* offset) const
{ |
| 256 #if SK_SUPPORT_GPU | 255 #if SK_SUPPORT_GPU |
| 257 SkBitmap input; | 256 SkBitmap input = src; |
| 258 SkIPoint srcOffset = SkIPoint::Make(0, 0); | 257 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 259 if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &in
put, &srcOffset)) { | 258 if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctm, &input,
&srcOffset)) { |
| 260 return false; | 259 return false; |
| 261 } | 260 } |
| 262 GrTexture* source = input.getTexture(); | 261 GrTexture* source = input.getTexture(); |
| 263 SkIRect rect; | 262 SkIRect rect; |
| 264 src.getBounds(&rect); | 263 src.getBounds(&rect); |
| 265 rect.offset(srcOffset); | 264 rect.offset(srcOffset); |
| 266 if (!this->applyCropRect(&rect, ctm)) { | 265 if (!this->applyCropRect(&rect, ctm)) { |
| 267 return false; | 266 return false; |
| 268 } | 267 } |
| 269 SkVector sigma, localSigma = SkVector::Make(fSigma.width(), fSigma.height())
; | 268 SkVector sigma, localSigma = SkVector::Make(fSigma.width(), fSigma.height())
; |
| 270 ctm.mapVectors(&sigma, &localSigma, 1); | 269 ctm.mapVectors(&sigma, &localSigma, 1); |
| 271 offset->fX = rect.fLeft; | 270 offset->fX = rect.fLeft; |
| 272 offset->fY = rect.fTop; | 271 offset->fY = rect.fTop; |
| 273 rect.offset(-srcOffset); | 272 rect.offset(-srcOffset); |
| 274 SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(source->getContext(
), | 273 SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(source->getContext(
), |
| 275 source, | 274 source, |
| 276 false, | 275 false, |
| 277 SkRect::Make(rect), | 276 SkRect::Make(rect), |
| 278 true, | 277 true, |
| 279 sigma.x(), | 278 sigma.x(), |
| 280 sigma.y())); | 279 sigma.y())); |
| 281 return SkImageFilterUtils::WrapTexture(tex, rect.width(), rect.height(), res
ult); | 280 WrapTexture(tex, rect.width(), rect.height(), result); |
| 281 return true; |
| 282 #else | 282 #else |
| 283 SkDEBUGFAIL("Should not call in GPU-less build"); | 283 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 284 return false; | 284 return false; |
| 285 #endif | 285 #endif |
| 286 } | 286 } |
| OLD | NEW |