Chromium Code Reviews| 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 |