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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 const SkRRect& rrect) const SK_OVERRID
E; | 52 const SkRRect& rrect) const SK_OVERRID
E; |
53 | 53 |
54 virtual bool filterMaskGPU(GrTexture* src, | 54 virtual bool filterMaskGPU(GrTexture* src, |
55 const SkMatrix& ctm, | 55 const SkMatrix& ctm, |
56 const SkRect& maskRect, | 56 const SkRect& maskRect, |
57 GrTexture** result, | 57 GrTexture** result, |
58 bool canOverwriteSrc) const SK_OVERRIDE; | 58 bool canOverwriteSrc) const SK_OVERRIDE; |
59 #endif | 59 #endif |
60 | 60 |
61 virtual void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE; | 61 virtual void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE; |
| 62 virtual bool asABlur(BlurRec*) const SK_OVERRIDE; |
62 | 63 |
63 SK_TO_STRING_OVERRIDE() | 64 SK_TO_STRING_OVERRIDE() |
64 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) | 65 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl) |
65 | 66 |
66 protected: | 67 protected: |
67 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, | 68 virtual FilterReturn filterRectsToNine(const SkRect[], int count, const SkMa
trix&, |
68 const SkIRect& clipBounds, | 69 const SkIRect& clipBounds, |
69 NinePatch*) const SK_OVERRIDE; | 70 NinePatch*) const SK_OVERRIDE; |
70 | 71 |
71 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, | 72 virtual FilterReturn filterRRectToNine(const SkRRect&, const SkMatrix&, |
72 const SkIRect& clipBounds, | 73 const SkIRect& clipBounds, |
73 NinePatch*) const SK_OVERRIDE; | 74 NinePatch*) const SK_OVERRIDE; |
74 | 75 |
75 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, | 76 bool filterRectMask(SkMask* dstM, const SkRect& r, const SkMatrix& matrix, |
76 SkIPoint* margin, SkMask::CreateMode createMode) const; | 77 SkIPoint* margin, SkMask::CreateMode createMode) const; |
77 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, | 78 bool filterRRectMask(SkMask* dstM, const SkRRect& r, const SkMatrix& matrix, |
78 SkIPoint* margin, SkMask::CreateMode createMode) const; | 79 SkIPoint* margin, SkMask::CreateMode createMode) const; |
79 | 80 |
80 private: | 81 private: |
81 // To avoid unseemly allocation requests (esp. for finite platforms like | 82 // To avoid unseemly allocation requests (esp. for finite platforms like |
82 // handset) we limit the radius so something manageable. (as opposed to | 83 // handset) we limit the radius so something manageable. (as opposed to |
83 // a request like 10,000) | 84 // a request like 10,000) |
84 static const SkScalar kMAX_BLUR_SIGMA; | 85 static const SkScalar kMAX_BLUR_SIGMA; |
85 | 86 |
86 SkScalar fSigma; | 87 SkScalar fSigma; |
87 SkBlurStyle fBlurStyle; | 88 SkBlurStyle fBlurStyle; |
88 uint32_t fBlurFlags; | 89 uint32_t fBlurFlags; |
89 | 90 |
| 91 SkBlurQuality getQuality() const { |
| 92 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 93 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 94 } |
| 95 |
90 SkBlurMaskFilterImpl(SkReadBuffer&); | 96 SkBlurMaskFilterImpl(SkReadBuffer&); |
91 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; | 97 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; |
92 | 98 |
93 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 99 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
94 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); | 100 bool ignoreTransform = SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTr
ansform_BlurFlag); |
95 | 101 |
96 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; | 102 SkScalar xformedSigma = ignoreTransform ? fSigma : ctm.mapRadius(fSigma)
; |
97 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 103 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
98 } | 104 } |
99 | 105 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 , fBlurFlags(flags) { | 144 , fBlurFlags(flags) { |
139 SkASSERT(fSigma > 0); | 145 SkASSERT(fSigma > 0); |
140 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); | 146 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); |
141 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); | 147 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
142 } | 148 } |
143 | 149 |
144 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { | 150 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { |
145 return SkMask::kA8_Format; | 151 return SkMask::kA8_Format; |
146 } | 152 } |
147 | 153 |
| 154 bool SkBlurMaskFilterImpl::asABlur(BlurRec* rec) const { |
| 155 if (fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag) { |
| 156 return false; |
| 157 } |
| 158 |
| 159 if (rec) { |
| 160 rec->fSigma = fSigma; |
| 161 rec->fStyle = fBlurStyle; |
| 162 rec->fQuality = this->getQuality(); |
| 163 } |
| 164 return true; |
| 165 } |
| 166 |
148 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, | 167 bool SkBlurMaskFilterImpl::filterMask(SkMask* dst, const SkMask& src, |
149 const SkMatrix& matrix, | 168 const SkMatrix& matrix, |
150 SkIPoint* margin) const{ | 169 SkIPoint* margin) const{ |
151 SkScalar sigma = this->computeXformedSigma(matrix); | 170 SkScalar sigma = this->computeXformedSigma(matrix); |
152 | 171 return SkBlurMask::BoxBlur(dst, src, sigma, fBlurStyle, this->getQuality(),
margin); |
153 SkBlurQuality blurQuality = | |
154 (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | |
155 kHigh_SkBlurQuality : kLow_SkBlurQuality; | |
156 | |
157 return SkBlurMask::BoxBlur(dst, src, sigma, fBlurStyle, blurQuality, margin)
; | |
158 } | 172 } |
159 | 173 |
160 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r, | 174 bool SkBlurMaskFilterImpl::filterRectMask(SkMask* dst, const SkRect& r, |
161 const SkMatrix& matrix, | 175 const SkMatrix& matrix, |
162 SkIPoint* margin, SkMask::CreateMode c
reateMode) const{ | 176 SkIPoint* margin, SkMask::CreateMode c
reateMode) const{ |
163 SkScalar sigma = computeXformedSigma(matrix); | 177 SkScalar sigma = computeXformedSigma(matrix); |
164 | 178 |
165 return SkBlurMask::BlurRect(sigma, dst, r, fBlurStyle, | 179 return SkBlurMask::BlurRect(sigma, dst, r, fBlurStyle, |
166 margin, createMode); | 180 margin, createMode); |
167 } | 181 } |
(...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1207 } else { | 1221 } else { |
1208 str->append("None"); | 1222 str->append("None"); |
1209 } | 1223 } |
1210 str->append("))"); | 1224 str->append("))"); |
1211 } | 1225 } |
1212 #endif | 1226 #endif |
1213 | 1227 |
1214 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1228 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
1215 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1229 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
1216 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1230 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |