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

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: New version based on in-person reviews 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
« no previous file with comments | « src/effects/SkBlurMask.cpp ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, 90 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src,
91 const SkMatrix& matrix, 91 const SkMatrix& matrix,
92 SkIPoint* margin) const{ 92 SkIPoint* margin) const{
93 SkScalar radius; 93 SkScalar radius;
94 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { 94 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) {
95 radius = fRadius; 95 radius = fRadius;
96 } else { 96 } else {
97 radius = matrix.mapRadius(fRadius); 97 radius = matrix.mapRadius(fRadius);
98 } 98 }
99 99
100 // To avoid unseemly allocation requests (esp. for finite platforms like 100 radius = SkMinScalar(radius, SkBlurMask::kMAX_BLUR_RADIUS);
101 // handset) we limit the radius so something manageable. (as opposed to
102 // a request like 10,000)
103 static const SkScalar MAX_RADIUS = SkIntToScalar(128);
104 radius = SkMinScalar(radius, MAX_RADIUS);
105 SkBlurMask::Quality blurQuality = 101 SkBlurMask::Quality blurQuality =
106 (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? 102 (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ?
107 SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality; 103 SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality;
108 104
109 return SkBlurMask::Blur(dst, src, radius, (SkBlurMask::Style)fBlurStyle, 105 return SkBlurMask::Blur(dst, src, radius, (SkBlurMask::Style)fBlurStyle,
110 blurQuality, margin); 106 blurQuality, margin);
111 } 107 }
112 108
113 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r, 109 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r,
114 const SkMatrix& matrix, 110 const SkMatrix& matrix,
115 SkIPoint* margin, SkMask::CreateMode c reateMode) const{ 111 SkIPoint* margin, SkMask::CreateMode c reateMode) const{
116 SkScalar radius; 112 SkScalar radius;
117 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { 113 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) {
118 radius = fRadius; 114 radius = fRadius;
119 } else { 115 } else {
120 radius = matrix.mapRadius(fRadius); 116 radius = matrix.mapRadius(fRadius);
121 } 117 }
122 118
123 // To avoid unseemly allocation requests (esp. for finite platforms like 119 radius = SkMinScalar(radius, SkBlurMask::kMAX_BLUR_RADIUS);
124 // handset) we limit the radius so something manageable. (as opposed to
125 // a request like 10,000)
126 static const SkScalar MAX_RADIUS = SkIntToScalar(128);
127 radius = SkMinScalar(radius, MAX_RADIUS);
128 120
129 return SkBlurMask::BlurRect(dst, r, radius, (SkBlurMask::Style)fBlurStyle, 121 return SkBlurMask::BlurRect(dst, r, radius, (SkBlurMask::Style)fBlurStyle,
130 margin, createMode); 122 margin, createMode);
131 } 123 }
132 124
133 #include "SkCanvas.h" 125 #include "SkCanvas.h"
134 126
135 static bool drawRectsIntoMask(const SkRect rects[], int count, SkMask* mask) { 127 static bool drawRectsIntoMask(const SkRect rects[], int count, SkMask* mask) {
136 rects[0].roundOut(&mask->fBounds); 128 rects[0].roundOut(&mask->fBounds);
137 mask->fRowBytes = SkAlign4(mask->fBounds.width()); 129 mask->fRowBytes = SkAlign4(mask->fBounds.width());
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 } 285 }
294 } 286 }
295 patch->fMask.fBounds.offsetTo(0, 0); 287 patch->fMask.fBounds.offsetTo(0, 0);
296 patch->fOuterRect = dstM.fBounds; 288 patch->fOuterRect = dstM.fBounds;
297 patch->fCenter = center; 289 patch->fCenter = center;
298 return kTrue_FilterReturn; 290 return kTrue_FilterReturn;
299 } 291 }
300 292
301 void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, 293 void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src,
302 SkRect* dst) const { 294 SkRect* dst) const {
303 dst->set(src.fLeft - fRadius, src.fTop - fRadius, 295 SkScalar gpuPad, rasterPad;
304 src.fRight + fRadius, src.fBottom + fRadius); 296
297 {
298 // GPU path
Stephen White 2013/06/14 19:37:38 I guess there's no way to pass the device down her
299 SkScalar sigma = SkScalarMul(fRadius, SkBlurMask::kBLUR_SIGMA_SCALE);
300 gpuPad = sigma * 3.0f;
301 }
302
303 {
304 // raster path
305 SkScalar radius = SkScalarMul(fRadius, SkBlurMask::kBlurRadiusFudgeFacto r);
306
307 radius = (radius + .5f) * 2.f;
308
309 rasterPad = SkIntToScalar(SkScalarRoundToInt(radius * 3)/2);
310 }
311
312 SkScalar pad = SkMaxScalar(gpuPad, rasterPad);
313
314 dst->set(src.fLeft - pad, src.fTop - pad,
315 src.fRight + pad, src.fBottom + pad);
305 } 316 }
306 317
307 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer) 318 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkFlattenableReadBuffer& buffer)
308 : SkMaskFilter(buffer) { 319 : SkMaskFilter(buffer) {
309 fRadius = buffer.readScalar(); 320 fRadius = buffer.readScalar();
310 fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readInt(); 321 fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readInt();
311 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag; 322 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag;
312 SkASSERT(fRadius >= 0); 323 SkASSERT(fRadius >= 0);
313 SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); 324 SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount);
314 } 325 }
(...skipping 10 matching lines...) Expand all
325 SkMaskFilter::kSolid_BlurType, 336 SkMaskFilter::kSolid_BlurType,
326 SkMaskFilter::kOuter_BlurType, 337 SkMaskFilter::kOuter_BlurType,
327 SkMaskFilter::kInner_BlurType, 338 SkMaskFilter::kInner_BlurType,
328 }; 339 };
329 340
330 SkMaskFilter::BlurType SkBlurMaskFilterImpl::asABlur(BlurInfo* info) const { 341 SkMaskFilter::BlurType SkBlurMaskFilterImpl::asABlur(BlurInfo* info) const {
331 if (info) { 342 if (info) {
332 info->fRadius = fRadius; 343 info->fRadius = fRadius;
333 info->fIgnoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnore Transform_BlurFlag); 344 info->fIgnoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnore Transform_BlurFlag);
334 info->fHighQuality = SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQualit y_BlurFlag); 345 info->fHighQuality = SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQualit y_BlurFlag);
346
347 info->fSigmaFraction = SkBlurMask::kBLUR_SIGMA_SCALE;
348 info->fMaxRadius = SkBlurMask::kMAX_BLUR_RADIUS;
335 } 349 }
336 return gBlurStyle2BlurType[fBlurStyle]; 350 return gBlurStyle2BlurType[fBlurStyle];
337 } 351 }
338 352
339 #ifdef SK_DEVELOPER 353 #ifdef SK_DEVELOPER
340 void SkBlurMaskFilterImpl::toString(SkString* str) const { 354 void SkBlurMaskFilterImpl::toString(SkString* str) const {
341 str->append("SkBlurMaskFilterImpl: ("); 355 str->append("SkBlurMaskFilterImpl: (");
342 356
343 str->append("radius: "); 357 str->append("radius: ");
344 str->appendScalar(fRadius); 358 str->appendScalar(fRadius);
(...skipping 16 matching lines...) Expand all
361 } else { 375 } else {
362 str->append("None"); 376 str->append("None");
363 } 377 }
364 str->append("))"); 378 str->append("))");
365 } 379 }
366 #endif 380 #endif
367 381
368 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 382 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
369 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 383 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
370 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 384 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/effects/SkBlurMask.cpp ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698