OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkBlurMaskFilter.h" | 9 #include "SkBlurMaskFilter.h" |
10 #include "SkBlurMask.h" | 10 #include "SkBlurMask.h" |
11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
12 #include "SkMaskFilter.h" | 12 #include "SkMaskFilter.h" |
13 #include "SkBounder.h" | 13 #include "SkBounder.h" |
14 #include "SkRasterClip.h" | 14 #include "SkRasterClip.h" |
15 #include "SkRTConf.h" | 15 #include "SkRTConf.h" |
16 #include "SkStringUtils.h" | 16 #include "SkStringUtils.h" |
17 | 17 |
| 18 const SkScalar SkBlurMaskFilter::kBLUR_SIGMA_SCALE = SkFloatToScalar(0.6f); |
| 19 const SkScalar SkBlurMaskFilter::kBlurRadiusFudgeFactor = SkFloatToScalar(.57735
f); |
| 20 |
18 class SkBlurMaskFilterImpl : public SkMaskFilter { | 21 class SkBlurMaskFilterImpl : public SkMaskFilter { |
19 public: | 22 public: |
20 SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle, | 23 SkBlurMaskFilterImpl(SkScalar radius, SkBlurMaskFilter::BlurStyle, |
21 uint32_t flags); | 24 uint32_t flags); |
22 | 25 |
23 // overrides from SkMaskFilter | 26 // overrides from SkMaskFilter |
24 virtual SkMask::Format getFormat() const SK_OVERRIDE; | 27 virtual SkMask::Format getFormat() const SK_OVERRIDE; |
25 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, | 28 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, |
26 SkIPoint* margin) const SK_OVERRIDE; | 29 SkIPoint* margin) const SK_OVERRIDE; |
27 | 30 |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 } | 296 } |
294 } | 297 } |
295 patch->fMask.fBounds.offsetTo(0, 0); | 298 patch->fMask.fBounds.offsetTo(0, 0); |
296 patch->fOuterRect = dstM.fBounds; | 299 patch->fOuterRect = dstM.fBounds; |
297 patch->fCenter = center; | 300 patch->fCenter = center; |
298 return kTrue_FilterReturn; | 301 return kTrue_FilterReturn; |
299 } | 302 } |
300 | 303 |
301 void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, | 304 void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, |
302 SkRect* dst) const { | 305 SkRect* dst) const { |
303 dst->set(src.fLeft - fRadius, src.fTop - fRadius, | 306 SkScalar gpuPad, rasterPad; |
304 src.fRight + fRadius, src.fBottom + fRadius); | 307 |
| 308 { |
| 309 // GPU path |
| 310 SkScalar sigma = SkScalarMul(fRadius, SkBlurMaskFilter::kBLUR_SIGMA_SCAL
E); |
| 311 gpuPad = sigma * 3.0f; |
| 312 } |
| 313 |
| 314 { |
| 315 // raster path |
| 316 SkScalar radius = SkScalarMul(fRadius, SkBlurMaskFilter::kBlurRadiusFudg
eFactor); |
| 317 |
| 318 radius = (radius + .5f) * 2.f; |
| 319 |
| 320 rasterPad = SkIntToScalar(SkScalarRoundToInt(radius * 3)/2); |
| 321 } |
| 322 |
| 323 SkScalar pad = SkMaxScalar(gpuPad, rasterPad); |
| 324 |
| 325 dst->set(src.fLeft - pad, src.fTop - pad, |
| 326 src.fRight + pad, src.fBottom + pad); |
305 } | 327 } |
306 | 328 |
307 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) | 329 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) |
308 : SkMaskFilter(buffer) { | 330 : SkMaskFilter(buffer) { |
309 fRadius = buffer.readScalar(); | 331 fRadius = buffer.readScalar(); |
310 fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readInt(); | 332 fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readInt(); |
311 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag; | 333 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag; |
312 SkASSERT(fRadius >= 0); | 334 SkASSERT(fRadius >= 0); |
313 SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); | 335 SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); |
314 } | 336 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 } else { | 383 } else { |
362 str->append("None"); | 384 str->append("None"); |
363 } | 385 } |
364 str->append("))"); | 386 str->append("))"); |
365 } | 387 } |
366 #endif | 388 #endif |
367 | 389 |
368 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 390 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
369 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 391 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
370 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 392 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |