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 11 matching lines...) Expand all Loading... | |
| 22 #include "GrTexture.h" | 22 #include "GrTexture.h" |
| 23 #include "GrEffect.h" | 23 #include "GrEffect.h" |
| 24 #include "gl/GrGLEffect.h" | 24 #include "gl/GrGLEffect.h" |
| 25 #include "effects/GrSimpleTextureEffect.h" | 25 #include "effects/GrSimpleTextureEffect.h" |
| 26 #include "GrTBackendEffectFactory.h" | 26 #include "GrTBackendEffectFactory.h" |
| 27 #include "SkGrPixelRef.h" | 27 #include "SkGrPixelRef.h" |
| 28 #endif | 28 #endif |
| 29 | 29 |
| 30 class SkBlurMaskFilterImpl : public SkMaskFilter { | 30 class SkBlurMaskFilterImpl : public SkMaskFilter { |
| 31 public: | 31 public: |
| 32 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurMaskFilter::BlurStyle, uint32_t f lags); | 32 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); |
| 33 | 33 |
| 34 // overrides from SkMaskFilter | 34 // overrides from SkMaskFilter |
| 35 virtual SkMask::Format getFormat() const SK_OVERRIDE; | 35 virtual SkMask::Format getFormat() const SK_OVERRIDE; |
| 36 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, | 36 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, |
| 37 SkIPoint* margin) const SK_OVERRIDE; | 37 SkIPoint* margin) const SK_OVERRIDE; |
| 38 | 38 |
| 39 #if SK_SUPPORT_GPU | 39 #if SK_SUPPORT_GPU |
| 40 virtual bool canFilterMaskGPU(const SkRect& devBounds, | 40 virtual bool canFilterMaskGPU(const SkRect& devBounds, |
| 41 const SkIRect& clipBounds, | 41 const SkIRect& clipBounds, |
| 42 const SkMatrix& ctm, | 42 const SkMatrix& ctm, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 SkIPoint* margin, SkMask::CreateMode createMode) const; | 75 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 76 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, | 76 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, |
| 77 SkIPoint* margin, SkMask::CreateMode createMode) const; | 77 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 78 | 78 |
| 79 private: | 79 private: |
| 80 // To avoid unseemly allocation requests (esp. for finite platforms like | 80 // To avoid unseemly allocation requests (esp. for finite platforms like |
| 81 // handset) we limit the radius so something manageable. (as opposed to | 81 // handset) we limit the radius so something manageable. (as opposed to |
| 82 // a request like 10,000) | 82 // a request like 10,000) |
| 83 static const SkScalar kMAX_BLUR_SIGMA; | 83 static const SkScalar kMAX_BLUR_SIGMA; |
| 84 | 84 |
| 85 SkScalar fSigma; | 85 SkScalar fSigma; |
| 86 SkBlurMaskFilter::BlurStyle fBlurStyle; | 86 SkBlurStyle fBlurStyle; |
| 87 uint32_t fBlurFlags; | 87 uint32_t fBlurFlags; |
| 88 | 88 |
| 89 SkBlurMaskFilterImpl(SkReadBuffer&); | 89 SkBlurMaskFilterImpl(SkReadBuffer&); |
| 90 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; | 90 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; |
| 91 | 91 |
| 92 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 92 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
| 93 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr ansform_BlurFlag); | 93 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr ansform_BlurFlag); |
| 94 | 94 |
| 95 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma) ; | 95 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma) ; |
| 96 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 96 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
| 97 } | 97 } |
| 98 | 98 |
| 99 typedef SkMaskFilter INHERITED; | 99 typedef SkMaskFilter INHERITED; |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); | 102 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); |
| 103 | 103 |
| 104 SkMaskFilter* SkBlurMaskFilter::Create(SkBlurStyle style, SkScalar sigma, uint32 _t flags) { | |
| 105 if (!(sigma > 0)) { | |
|
scroggo
2014/04/28 15:47:45
Can you add the comment (removed down below) about
| |
| 106 return NULL; | |
| 107 } | |
| 108 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { | |
| 109 return NULL; | |
| 110 } | |
| 111 if (flags > SkBlurMaskFilter::kAll_BlurFlag) { | |
| 112 return NULL; | |
| 113 } | |
| 114 return SkNEW_ARGS(SkBlurMaskFilterImpl, (sigma, style, flags)); | |
| 115 } | |
| 116 | |
| 117 #ifdef SK_SUPPORT_LEGACY_BLURMASKFILTER_STYLE | |
| 104 SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, | 118 SkMaskFilter* SkBlurMaskFilter::Create(SkScalar radius, |
| 105 SkBlurMaskFilter::BlurStyle style, | 119 SkBlurMaskFilter::BlurStyle style, |
| 106 uint32_t flags) { | 120 uint32_t flags) { |
| 107 // use !(radius > 0) instead of radius <= 0 to reject NaN values | |
| 108 if (!(radius > 0) || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount | |
| 109 || flags > SkBlurMaskFilter::kAll_BlurFlag) { | |
| 110 return NULL; | |
| 111 } | |
| 112 | |
| 113 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius); | 121 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius); |
| 114 | 122 return Create((SkBlurStyle)style, sigma, flags); |
| 115 return SkNEW_ARGS(SkBlurMaskFilterImpl, (sigma, style, flags)); | |
| 116 } | 123 } |
| 117 | 124 |
| 118 SkMaskFilter* SkBlurMaskFilter::Create(SkBlurMaskFilter::BlurStyle style, | 125 SkMaskFilter* SkBlurMaskFilter::Create(SkBlurMaskFilter::BlurStyle style, |
| 119 SkScalar sigma, | 126 SkScalar sigma, |
| 120 uint32_t flags) { | 127 uint32_t flags) { |
| 121 // use !(sigma > 0) instead of sigma <= 0 to reject NaN values | 128 return Create((SkBlurStyle)style, sigma, flags); |
| 122 if (!(sigma > 0) || (unsigned)style >= SkBlurMaskFilter::kBlurStyleCount | |
| 123 || flags > SkBlurMaskFilter::kAll_BlurFlag) { | |
| 124 return NULL; | |
| 125 } | |
| 126 | |
| 127 return SkNEW_ARGS(SkBlurMaskFilterImpl, (sigma, style, flags)); | |
| 128 } | 129 } |
| 130 #endif | |
| 129 | 131 |
| 130 /////////////////////////////////////////////////////////////////////////////// | 132 /////////////////////////////////////////////////////////////////////////////// |
| 131 | 133 |
| 132 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, | 134 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, ui nt32_t flags) |
| 133 SkBlurMaskFilter::BlurStyle style, | 135 : fSigma(sigma) |
| 134 uint32_t flags) | 136 , fBlurStyle(style) |
| 135 : fSigma(sigma), fBlurStyle(style), fBlurFlags(flags) { | 137 , fBlurFlags(flags) { |
| 136 #if 0 | 138 SkASSERT(fSigma > 0); |
| 137 fGamma = NULL; | 139 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); |
| 138 if (gammaScale) { | |
| 139 fGamma = new U8[256]; | |
| 140 if (gammaScale > 0) | |
| 141 SkBlurMask::BuildSqrGamma(fGamma, gammaScale); | |
| 142 else | |
| 143 SkBlurMask::BuildSqrtGamma(fGamma, -gammaScale); | |
| 144 } | |
| 145 #endif | |
| 146 SkASSERT(fSigma >= 0); | |
| 147 SkASSERT((unsigned)style < SkBlurMaskFilter::kBlurStyleCount); | |
| 148 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); | 140 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
| 149 } | 141 } |
| 150 | 142 |
| 151 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { | 143 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { |
| 152 return SkMask::kA8_Format; | 144 return SkMask::kA8_Format; |
| 153 } | 145 } |
| 154 | 146 |
| 155 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, | 147 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, |
| 156 const SkMatrix& matrix, | 148 const SkMatrix& matrix, |
| 157 SkIPoint* margin) const{ | 149 SkIPoint* margin) const{ |
| 158 SkScalar sigma = this->computeXformedSigma(matrix); | 150 SkScalar sigma = this->computeXformedSigma(matrix); |
| 159 | 151 |
| 160 SkBlurMask::Quality blurQuality = | 152 SkBlurQuality blurQuality = |
| 161 (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | 153 (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 162 SkBlurMask::kHigh_Quality : SkBlurMask::kLow_Quality; | 154 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 163 | 155 |
| 164 return SkBlurMask::BoxBlur(dst, src, sigma, (SkBlurMask::Style)fBlurStyle, | 156 return SkBlurMask::BoxBlur(dst, src, sigma, fBlurStyle, blurQuality, margin) ; |
| 165 blurQuality, margin); | |
| 166 } | 157 } |
| 167 | 158 |
| 168 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r, | 159 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r, |
| 169 const SkMatrix& matrix, | 160 const SkMatrix& matrix, |
| 170 SkIPoint* margin, SkMask::CreateMode c reateMode) const{ | 161 SkIPoint* margin, SkMask::CreateMode c reateMode) const{ |
| 171 SkScalar sigma = computeXformedSigma(matrix); | 162 SkScalar sigma = computeXformedSigma(matrix); |
| 172 | 163 |
| 173 return SkBlurMask::BlurRect(sigma, dst, r, (SkBlurMask::Style)fBlurStyle, | 164 return SkBlurMask::BlurRect(sigma, dst, r, fBlurStyle, |
| 174 margin, createMode); | 165 margin, createMode); |
| 175 } | 166 } |
| 176 | 167 |
| 177 bool SkBlurMaskFilterImpl::filterRRectMask(SkMask* dst, const SkRRect& r, | 168 bool SkBlurMaskFilterImpl::filterRRectMask(SkMask* dst, const SkRRect& r, |
| 178 const SkMatrix& matrix, | 169 const SkMatrix& matrix, |
| 179 SkIPoint* margin, SkMask::CreateMode c reateMode) const{ | 170 SkIPoint* margin, SkMask::CreateMode c reateMode) const{ |
| 180 SkScalar sigma = computeXformedSigma(matrix); | 171 SkScalar sigma = computeXformedSigma(matrix); |
| 181 | 172 |
| 182 return SkBlurMask::BlurRRect(sigma, dst, r, (SkBlurMask::Style)fBlurStyle, | 173 return SkBlurMask::BlurRRect(sigma, dst, r, fBlurStyle, |
| 183 margin, createMode); | 174 margin, createMode); |
| 184 } | 175 } |
| 185 | 176 |
| 186 #include "SkCanvas.h" | 177 #include "SkCanvas.h" |
| 187 | 178 |
| 188 static bool prepare_to_draw_into_mask(const SkRect& bounds, SkMask* mask) { | 179 static bool prepare_to_draw_into_mask(const SkRect& bounds, SkMask* mask) { |
| 189 SkASSERT(mask != NULL); | 180 SkASSERT(mask != NULL); |
| 190 | 181 |
| 191 bounds.roundOut(&mask->fBounds); | 182 bounds.roundOut(&mask->fBounds); |
| 192 mask->fRowBytes = SkAlign4(mask->fBounds.width()); | 183 mask->fRowBytes = SkAlign4(mask->fBounds.width()); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 | 281 |
| 291 // These three can take advantage of this fast path. | 282 // These three can take advantage of this fast path. |
| 292 case SkRRect::kSimple_Type: | 283 case SkRRect::kSimple_Type: |
| 293 case SkRRect::kNinePatch_Type: | 284 case SkRRect::kNinePatch_Type: |
| 294 case SkRRect::kComplex_Type: | 285 case SkRRect::kComplex_Type: |
| 295 break; | 286 break; |
| 296 } | 287 } |
| 297 | 288 |
| 298 // TODO: report correct metrics for innerstyle, where we do not grow the | 289 // TODO: report correct metrics for innerstyle, where we do not grow the |
| 299 // total bounds, but we do need an inset the size of our blur-radius | 290 // total bounds, but we do need an inset the size of our blur-radius |
| 300 if (SkBlurMaskFilter::kInner_BlurStyle == fBlurStyle) { | 291 if (kInner_SkBlurStyle == fBlurStyle) { |
| 301 return kUnimplemented_FilterReturn; | 292 return kUnimplemented_FilterReturn; |
| 302 } | 293 } |
| 303 | 294 |
| 304 // TODO: take clipBounds into account to limit our coordinates up front | 295 // TODO: take clipBounds into account to limit our coordinates up front |
| 305 // for now, just skip too-large src rects (to take the old code path). | 296 // for now, just skip too-large src rects (to take the old code path). |
| 306 if (rect_exceeds(rrect.rect(), SkIntToScalar(32767))) { | 297 if (rect_exceeds(rrect.rect(), SkIntToScalar(32767))) { |
| 307 return kUnimplemented_FilterReturn; | 298 return kUnimplemented_FilterReturn; |
| 308 } | 299 } |
| 309 | 300 |
| 310 SkIPoint margin; | 301 SkIPoint margin; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 402 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, | 393 SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, |
| 403 const SkMatrix& matrix, | 394 const SkMatrix& matrix, |
| 404 const SkIRect& clipBounds, | 395 const SkIRect& clipBounds, |
| 405 NinePatch* patch) const { | 396 NinePatch* patch) const { |
| 406 if (count < 1 || count > 2) { | 397 if (count < 1 || count > 2) { |
| 407 return kUnimplemented_FilterReturn; | 398 return kUnimplemented_FilterReturn; |
| 408 } | 399 } |
| 409 | 400 |
| 410 // TODO: report correct metrics for innerstyle, where we do not grow the | 401 // TODO: report correct metrics for innerstyle, where we do not grow the |
| 411 // total bounds, but we do need an inset the size of our blur-radius | 402 // total bounds, but we do need an inset the size of our blur-radius |
| 412 if (SkBlurMaskFilter::kInner_BlurStyle == fBlurStyle || | 403 if (kInner_SkBlurStyle == fBlurStyle || kOuter_SkBlurStyle == fBlurStyle) { |
| 413 SkBlurMaskFilter::kOuter_BlurStyle == fBlurStyle) { | |
| 414 return kUnimplemented_FilterReturn; | 404 return kUnimplemented_FilterReturn; |
| 415 } | 405 } |
| 416 | 406 |
| 417 // TODO: take clipBounds into account to limit our coordinates up front | 407 // TODO: take clipBounds into account to limit our coordinates up front |
| 418 // for now, just skip too-large src rects (to take the old code path). | 408 // for now, just skip too-large src rects (to take the old code path). |
| 419 if (rect_exceeds(rects[0], SkIntToScalar(32767))) { | 409 if (rect_exceeds(rects[0], SkIntToScalar(32767))) { |
| 420 return kUnimplemented_FilterReturn; | 410 return kUnimplemented_FilterReturn; |
| 421 } | 411 } |
| 422 | 412 |
| 423 SkIPoint margin; | 413 SkIPoint margin; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 523 SkRect* dst) const { | 513 SkRect* dst) const { |
| 524 SkScalar pad = 3.0f * fSigma; | 514 SkScalar pad = 3.0f * fSigma; |
| 525 | 515 |
| 526 dst->set(src.fLeft - pad, src.fTop - pad, | 516 dst->set(src.fLeft - pad, src.fTop - pad, |
| 527 src.fRight + pad, src.fBottom + pad); | 517 src.fRight + pad, src.fBottom + pad); |
| 528 } | 518 } |
| 529 | 519 |
| 530 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkReadBuffer& buffer) | 520 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkReadBuffer& buffer) |
| 531 : SkMaskFilter(buffer) { | 521 : SkMaskFilter(buffer) { |
| 532 fSigma = buffer.readScalar(); | 522 fSigma = buffer.readScalar(); |
| 533 fBlurStyle = (SkBlurMaskFilter::BlurStyle)buffer.readInt(); | 523 fBlurStyle = (SkBlurStyle)buffer.readInt(); |
| 534 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag; | 524 fBlurFlags = buffer.readUInt() & SkBlurMaskFilter::kAll_BlurFlag; |
| 535 SkASSERT(fSigma >= 0); | 525 SkASSERT(fSigma > 0); |
| 536 SkASSERT((unsigned)fBlurStyle < SkBlurMaskFilter::kBlurStyleCount); | 526 SkASSERT((unsigned)fBlurStyle <= kLastEnum_SkBlurStyle); |
| 537 } | 527 } |
| 538 | 528 |
| 539 void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const { | 529 void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const { |
| 540 this->INHERITED::flatten(buffer); | 530 this->INHERITED::flatten(buffer); |
| 541 buffer.writeScalar(fSigma); | 531 buffer.writeScalar(fSigma); |
| 542 buffer.writeInt(fBlurStyle); | 532 buffer.writeInt(fBlurStyle); |
| 543 buffer.writeUInt(fBlurFlags); | 533 buffer.writeUInt(fBlurFlags); |
| 544 } | 534 } |
| 545 | 535 |
| 546 #if SK_SUPPORT_GPU | 536 #if SK_SUPPORT_GPU |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 777 float width = random->nextRangeF(200,300); | 767 float width = random->nextRangeF(200,300); |
| 778 float height = random->nextRangeF(200,300); | 768 float height = random->nextRangeF(200,300); |
| 779 return GrRectBlurEffect::Create(context, SkRect::MakeWH(width, height), sigm a); | 769 return GrRectBlurEffect::Create(context, SkRect::MakeWH(width, height), sigm a); |
| 780 } | 770 } |
| 781 | 771 |
| 782 | 772 |
| 783 bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, | 773 bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context, |
| 784 GrPaint* grp, | 774 GrPaint* grp, |
| 785 const SkStrokeRec& strokeRec, | 775 const SkStrokeRec& strokeRec, |
| 786 const SkPath& path) const { | 776 const SkPath& path) const { |
| 787 if (fBlurStyle != SkBlurMaskFilter::kNormal_BlurStyle) { | 777 if (fBlurStyle != kNormal_SkBlurStyle) { |
| 788 return false; | 778 return false; |
| 789 } | 779 } |
| 790 | 780 |
| 791 SkRect rect; | 781 SkRect rect; |
| 792 if (!path.isRect(&rect)) { | 782 if (!path.isRect(&rect)) { |
| 793 return false; | 783 return false; |
| 794 } | 784 } |
| 795 | 785 |
| 796 if (!strokeRec.isFillStyle()) { | 786 if (!strokeRec.isFillStyle()) { |
| 797 return false; | 787 return false; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 | 862 |
| 873 GrContext* context = src->getContext(); | 863 GrContext* context = src->getContext(); |
| 874 | 864 |
| 875 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); | 865 GrContext::AutoWideOpenIdentityDraw awo(context, NULL); |
| 876 | 866 |
| 877 SkScalar xformedSigma = this->computeXformedSigma(ctm); | 867 SkScalar xformedSigma = this->computeXformedSigma(ctm); |
| 878 SkASSERT(xformedSigma > 0); | 868 SkASSERT(xformedSigma > 0); |
| 879 | 869 |
| 880 // If we're doing a normal blur, we can clobber the pathTexture in the | 870 // If we're doing a normal blur, we can clobber the pathTexture in the |
| 881 // gaussianBlur. Otherwise, we need to save it for later compositing. | 871 // gaussianBlur. Otherwise, we need to save it for later compositing. |
| 882 bool isNormalBlur = (SkBlurMaskFilter::kNormal_BlurStyle == fBlurStyle); | 872 bool isNormalBlur = (kNormal_SkBlurStyle == fBlurStyle); |
| 883 *result = SkGpuBlurUtils::GaussianBlur(context, src, isNormalBlur && canOver writeSrc, | 873 *result = SkGpuBlurUtils::GaussianBlur(context, src, isNormalBlur && canOver writeSrc, |
| 884 clipRect, false, xformedSigma, xforme dSigma); | 874 clipRect, false, xformedSigma, xforme dSigma); |
| 885 if (NULL == *result) { | 875 if (NULL == *result) { |
| 886 return false; | 876 return false; |
| 887 } | 877 } |
| 888 | 878 |
| 889 if (!isNormalBlur) { | 879 if (!isNormalBlur) { |
| 890 context->setIdentityMatrix(); | 880 context->setIdentityMatrix(); |
| 891 GrPaint paint; | 881 GrPaint paint; |
| 892 SkMatrix matrix; | 882 SkMatrix matrix; |
| 893 matrix.setIDiv(src->width(), src->height()); | 883 matrix.setIDiv(src->width(), src->height()); |
| 894 // Blend pathTexture over blurTexture. | 884 // Blend pathTexture over blurTexture. |
| 895 GrContext::AutoRenderTarget art(context, (*result)->asRenderTarget()); | 885 GrContext::AutoRenderTarget art(context, (*result)->asRenderTarget()); |
| 896 paint.addColorEffect(GrSimpleTextureEffect::Create(src, matrix))->unref( ); | 886 paint.addColorEffect(GrSimpleTextureEffect::Create(src, matrix))->unref( ); |
| 897 if (SkBlurMaskFilter::kInner_BlurStyle == fBlurStyle) { | 887 if (kInner_SkBlurStyle == fBlurStyle) { |
| 898 // inner: dst = dst * src | 888 // inner: dst = dst * src |
| 899 paint.setBlendFunc(kDC_GrBlendCoeff, kZero_GrBlendCoeff); | 889 paint.setBlendFunc(kDC_GrBlendCoeff, kZero_GrBlendCoeff); |
| 900 } else if (SkBlurMaskFilter::kSolid_BlurStyle == fBlurStyle) { | 890 } else if (kSolid_SkBlurStyle == fBlurStyle) { |
| 901 // solid: dst = src + dst - src * dst | 891 // solid: dst = src + dst - src * dst |
| 902 // = (1 - dst) * src + 1 * dst | 892 // = (1 - dst) * src + 1 * dst |
| 903 paint.setBlendFunc(kIDC_GrBlendCoeff, kOne_GrBlendCoeff); | 893 paint.setBlendFunc(kIDC_GrBlendCoeff, kOne_GrBlendCoeff); |
| 904 } else if (SkBlurMaskFilter::kOuter_BlurStyle == fBlurStyle) { | 894 } else if (kOuter_SkBlurStyle == fBlurStyle) { |
| 905 // outer: dst = dst * (1 - src) | 895 // outer: dst = dst * (1 - src) |
| 906 // = 0 * src + (1 - src) * dst | 896 // = 0 * src + (1 - src) * dst |
| 907 paint.setBlendFunc(kZero_GrBlendCoeff, kISC_GrBlendCoeff); | 897 paint.setBlendFunc(kZero_GrBlendCoeff, kISC_GrBlendCoeff); |
| 908 } | 898 } |
| 909 context->drawRect(paint, clipRect); | 899 context->drawRect(paint, clipRect); |
| 910 } | 900 } |
| 911 | 901 |
| 912 return true; | 902 return true; |
| 913 } | 903 } |
| 914 | 904 |
| 915 #endif // SK_SUPPORT_GPU | 905 #endif // SK_SUPPORT_GPU |
| 916 | 906 |
| 917 | 907 |
| 918 #ifndef SK_IGNORE_TO_STRING | 908 #ifndef SK_IGNORE_TO_STRING |
| 919 void SkBlurMaskFilterImpl::toString(SkString* str) const { | 909 void SkBlurMaskFilterImpl::toString(SkString* str) const { |
| 920 str->append("SkBlurMaskFilterImpl: ("); | 910 str->append("SkBlurMaskFilterImpl: ("); |
| 921 | 911 |
| 922 str->append("sigma: "); | 912 str->append("sigma: "); |
| 923 str->appendScalar(fSigma); | 913 str->appendScalar(fSigma); |
| 924 str->append(" "); | 914 str->append(" "); |
| 925 | 915 |
| 926 static const char* gStyleName[SkBlurMaskFilter::kBlurStyleCount] = { | 916 static const char* gStyleName[kLastEnum_SkBlurStyle + 1] = { |
| 927 "normal", "solid", "outer", "inner" | 917 "normal", "solid", "outer", "inner" |
| 928 }; | 918 }; |
| 929 | 919 |
| 930 str->appendf("style: %s ", gStyleName[fBlurStyle]); | 920 str->appendf("style: %s ", gStyleName[fBlurStyle]); |
| 931 str->append("flags: ("); | 921 str->append("flags: ("); |
| 932 if (fBlurFlags) { | 922 if (fBlurFlags) { |
| 933 bool needSeparator = false; | 923 bool needSeparator = false; |
| 934 SkAddFlagToString(str, | 924 SkAddFlagToString(str, |
| 935 SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransfo rm_BlurFlag), | 925 SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransfo rm_BlurFlag), |
| 936 "IgnoreXform", &needSeparator); | 926 "IgnoreXform", &needSeparator); |
| 937 SkAddFlagToString(str, | 927 SkAddFlagToString(str, |
| 938 SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_B lurFlag), | 928 SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_B lurFlag), |
| 939 "HighQuality", &needSeparator); | 929 "HighQuality", &needSeparator); |
| 940 } else { | 930 } else { |
| 941 str->append("None"); | 931 str->append("None"); |
| 942 } | 932 } |
| 943 str->append("))"); | 933 str->append("))"); |
| 944 } | 934 } |
| 945 #endif | 935 #endif |
| 946 | 936 |
| 947 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 937 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 938 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 949 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 939 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |