| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBlurMaskFilter.h" | 8 #include "SkBlurMaskFilter.h" |
| 9 #include "SkBlurMask.h" | 9 #include "SkBlurMask.h" |
| 10 #include "SkGpuBlurUtils.h" | 10 #include "SkGpuBlurUtils.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 | 82 |
| 83 FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, | 83 FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, |
| 84 const SkIRect& clipBounds, | 84 const SkIRect& clipBounds, |
| 85 NinePatch*) const override; | 85 NinePatch*) const override; |
| 86 | 86 |
| 87 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, | 87 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, |
| 88 SkIPoint* margin, SkMask::CreateMode createMode) const; | 88 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 89 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, | 89 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, |
| 90 SkIPoint* margin, SkMask::CreateMode createMode) const; | 90 SkIPoint* margin, SkMask::CreateMode createMode) const; |
| 91 | 91 |
| 92 bool ignoreXform() const { |
| 93 return SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag
); |
| 94 } |
| 95 |
| 92 private: | 96 private: |
| 93 // To avoid unseemly allocation requests (esp. for finite platforms like | 97 // To avoid unseemly allocation requests (esp. for finite platforms like |
| 94 // handset) we limit the radius so something manageable. (as opposed to | 98 // handset) we limit the radius so something manageable. (as opposed to |
| 95 // a request like 10,000) | 99 // a request like 10,000) |
| 96 static const SkScalar kMAX_BLUR_SIGMA; | 100 static const SkScalar kMAX_BLUR_SIGMA; |
| 97 | 101 |
| 98 SkScalar fSigma; | 102 SkScalar fSigma; |
| 99 SkBlurStyle fBlurStyle; | 103 SkBlurStyle fBlurStyle; |
| 100 uint32_t fBlurFlags; | 104 uint32_t fBlurFlags; |
| 101 | 105 |
| 102 SkBlurQuality getQuality() const { | 106 SkBlurQuality getQuality() const { |
| 103 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | 107 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 104 kHigh_SkBlurQuality : kLow_SkBlurQuality; | 108 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 105 } | 109 } |
| 106 | 110 |
| 107 SkBlurMaskFilterImpl(SkReadBuffer&); | 111 SkBlurMaskFilterImpl(SkReadBuffer&); |
| 108 void flatten(SkWriteBuffer&) const override; | 112 void flatten(SkWriteBuffer&) const override; |
| 109 | 113 |
| 110 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 114 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
| 111 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); | 115 SkScalar xformedSigma = this->ignoreXform() ? fSigma : ctm.mapRadius(fSi
gma); |
| 112 | |
| 113 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; | |
| 114 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 116 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
| 115 } | 117 } |
| 116 | 118 |
| 117 friend class SkBlurMaskFilter; | 119 friend class SkBlurMaskFilter; |
| 118 | 120 |
| 119 typedef SkMaskFilter INHERITED; | 121 typedef SkMaskFilter INHERITED; |
| 120 }; | 122 }; |
| 121 | 123 |
| 122 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); | 124 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); |
| 123 | 125 |
| 124 sk_sp<SkMaskFilter> SkBlurMaskFilter::Make(SkBlurStyle style, SkScalar sigma, ui
nt32_t flags) { | 126 sk_sp<SkMaskFilter> SkBlurMaskFilter::Make(SkBlurStyle style, SkScalar sigma, ui
nt32_t flags) { |
| 125 if (!SkScalarIsFinite(sigma) || sigma <= 0) { | 127 if (!SkScalarIsFinite(sigma) || sigma <= 0) { |
| 126 return nullptr; | 128 return nullptr; |
| 127 } | 129 } |
| 128 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { | 130 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { |
| 129 return nullptr; | 131 return nullptr; |
| 130 } | 132 } |
| 131 if (flags > SkBlurMaskFilter::kAll_BlurFlag) { | 133 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
| 132 return nullptr; | 134 flags &= SkBlurMaskFilter::kAll_BlurFlag; |
| 133 } | 135 |
| 134 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, flags)); | 136 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, flags)); |
| 135 } | 137 } |
| 136 | 138 |
| 137 /////////////////////////////////////////////////////////////////////////////// | 139 /////////////////////////////////////////////////////////////////////////////// |
| 138 | 140 |
| 139 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, ui
nt32_t flags) | 141 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, ui
nt32_t flags) |
| 140 : fSigma(sigma) | 142 : fSigma(sigma) |
| 141 , fBlurStyle(style) | 143 , fBlurStyle(style) |
| 142 , fBlurFlags(flags) { | 144 , fBlurFlags(flags) { |
| 143 SkASSERT(fSigma > 0); | 145 SkASSERT(fSigma > 0); |
| 144 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); | 146 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); |
| 145 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); | 147 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
| 146 } | 148 } |
| 147 | 149 |
| 148 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { | 150 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { |
| 149 return SkMask::kA8_Format; | 151 return SkMask::kA8_Format; |
| 150 } | 152 } |
| 151 | 153 |
| 152 bool SkBlurMaskFilterImpl::asABlur(BlurRec* rec) const { | 154 bool SkBlurMaskFilterImpl::asABlur(BlurRec* rec) const { |
| 153 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { | 155 if (this->ignoreXform()) { |
| 154 return false; | 156 return false; |
| 155 } | 157 } |
| 156 | 158 |
| 157 if (rec) { | 159 if (rec) { |
| 158 rec->fSigma = fSigma; | 160 rec->fSigma = fSigma; |
| 159 rec->fStyle = fBlurStyle; | 161 rec->fStyle = fBlurStyle; |
| 160 rec->fQuality = this->getQuality(); | 162 rec->fQuality = this->getQuality(); |
| 161 } | 163 } |
| 162 return true; | 164 return true; |
| 163 } | 165 } |
| (...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1162 | 1164 |
| 1163 if (fBlurStyle != kNormal_SkBlurStyle) { | 1165 if (fBlurStyle != kNormal_SkBlurStyle) { |
| 1164 return false; | 1166 return false; |
| 1165 } | 1167 } |
| 1166 | 1168 |
| 1167 if (!strokeRec.isFillStyle()) { | 1169 if (!strokeRec.isFillStyle()) { |
| 1168 return false; | 1170 return false; |
| 1169 } | 1171 } |
| 1170 | 1172 |
| 1171 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); | 1173 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); |
| 1172 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); | |
| 1173 | |
| 1174 SkRect proxyRect = rrect.rect(); | |
| 1175 proxyRect.outset(extra, extra); | |
| 1176 | 1174 |
| 1177 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(texProvider, xformedSi
gma, rrect)); | 1175 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(texProvider, xformedSi
gma, rrect)); |
| 1178 if (!fp) { | 1176 if (!fp) { |
| 1179 return false; | 1177 return false; |
| 1180 } | 1178 } |
| 1181 | 1179 |
| 1182 grp->addCoverageFragmentProcessor(std::move(fp)); | 1180 grp->addCoverageFragmentProcessor(std::move(fp)); |
| 1183 | 1181 |
| 1184 SkMatrix inverse; | 1182 SkMatrix inverse; |
| 1185 if (!viewMatrix.invert(&inverse)) { | 1183 if (!viewMatrix.invert(&inverse)) { |
| 1186 return false; | 1184 return false; |
| 1187 } | 1185 } |
| 1188 | 1186 |
| 1187 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); |
| 1188 |
| 1189 SkRect proxyRect = rrect.rect(); |
| 1190 proxyRect.outset(extra, extra); |
| 1191 |
| 1189 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), proxyRect, i
nverse); | 1192 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), proxyRect, i
nverse); |
| 1190 return true; | 1193 return true; |
| 1191 } | 1194 } |
| 1192 | 1195 |
| 1193 bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRRect& devRRect, | 1196 bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRRect& devRRect, |
| 1194 const SkIRect& clipBounds, | 1197 const SkIRect& clipBounds, |
| 1195 const SkMatrix& ctm, | 1198 const SkMatrix& ctm, |
| 1196 SkRect* maskRect) const { | 1199 SkRect* maskRect) const { |
| 1197 SkScalar xformedSigma = this->computeXformedSigma(ctm); | 1200 SkScalar xformedSigma = this->computeXformedSigma(ctm); |
| 1198 if (xformedSigma <= 0) { | 1201 if (xformedSigma <= 0) { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 } else { | 1313 } else { |
| 1311 str->append("None"); | 1314 str->append("None"); |
| 1312 } | 1315 } |
| 1313 str->append("))"); | 1316 str->append("))"); |
| 1314 } | 1317 } |
| 1315 #endif | 1318 #endif |
| 1316 | 1319 |
| 1317 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1320 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1318 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1321 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1319 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1322 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |