Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/effects/SkBlurMaskFilter.cpp

Issue 17035007: Fix quickReject computation for blurs (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: cleaned up more Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/effects/SkBlurMask.cpp ('k') | src/gpu/SkGpuDevice.cpp » ('j') | src/gpu/SkGpuDevice.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698