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 |