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" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |