Chromium Code Reviews| 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 19 matching lines...) Expand all Loading... | |
| 30 #include "glsl/GrGLSLSampler.h" | 30 #include "glsl/GrGLSLSampler.h" |
| 31 #include "glsl/GrGLSLUniformHandler.h" | 31 #include "glsl/GrGLSLUniformHandler.h" |
| 32 #endif | 32 #endif |
| 33 | 33 |
| 34 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { | 34 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { |
| 35 return SkBlurMask::ConvertRadiusToSigma(radius); | 35 return SkBlurMask::ConvertRadiusToSigma(radius); |
| 36 } | 36 } |
| 37 | 37 |
| 38 class SkBlurMaskFilterImpl : public SkMaskFilter { | 38 class SkBlurMaskFilterImpl : public SkMaskFilter { |
| 39 public: | 39 public: |
| 40 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, uint32_t flags); | 40 SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, const SkRect& occluder, ui nt32_t flags); |
| 41 | 41 |
| 42 // overrides from SkMaskFilter | 42 // overrides from SkMaskFilter |
| 43 SkMask::Format getFormat() const override; | 43 SkMask::Format getFormat() const override; |
| 44 bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, | 44 bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, |
| 45 SkIPoint* margin) const override; | 45 SkIPoint* margin) const override; |
| 46 | 46 |
| 47 #if SK_SUPPORT_GPU | 47 #if SK_SUPPORT_GPU |
| 48 bool canFilterMaskGPU(const SkRRect& devRRect, | 48 bool canFilterMaskGPU(const SkRRect& devRRect, |
| 49 const SkIRect& clipBounds, | 49 const SkIRect& clipBounds, |
| 50 const SkMatrix& ctm, | 50 const SkMatrix& ctm, |
| 51 SkRect* maskRect) const override; | 51 SkRect* maskRect) const override; |
| 52 bool directFilterMaskGPU(GrTextureProvider* texProvider, | 52 bool directFilterMaskGPU(GrTextureProvider* texProvider, |
| 53 GrDrawContext* drawContext, | 53 GrDrawContext* drawContext, |
| 54 GrPaint* grp, | 54 GrPaint* grp, |
| 55 const GrClip&, | 55 const GrClip&, |
| 56 const SkMatrix& viewMatrix, | 56 const SkMatrix& viewMatrix, |
| 57 const SkStrokeRec& strokeRec, | 57 const SkStrokeRec& strokeRec, |
| 58 const SkPath& path) const override; | 58 const SkPath& path) const override; |
| 59 bool directFilterRRectMaskGPU(GrTextureProvider* texProvider, | 59 bool directFilterRRectMaskGPU(GrTextureProvider* texProvider, |
| 60 GrDrawContext* drawContext, | 60 GrDrawContext* drawContext, |
| 61 GrPaint* grp, | 61 GrPaint* grp, |
| 62 const GrClip&, | 62 const GrClip&, |
| 63 const SkMatrix& viewMatrix, | 63 const SkMatrix& viewMatrix, |
| 64 const SkStrokeRec& strokeRec, | 64 const SkStrokeRec& strokeRec, |
| 65 const SkRRect& rrect) const override; | 65 const SkRRect& rrect, |
| 66 const SkRRect& devRRect) const override; | |
| 66 bool filterMaskGPU(GrTexture* src, | 67 bool filterMaskGPU(GrTexture* src, |
| 67 const SkMatrix& ctm, | 68 const SkMatrix& ctm, |
| 68 const SkIRect& maskRect, | 69 const SkIRect& maskRect, |
| 69 GrTexture** result) const override; | 70 GrTexture** result) const override; |
| 70 #endif | 71 #endif |
| 71 | 72 |
| 72 void computeFastBounds(const SkRect&, SkRect*) const override; | 73 void computeFastBounds(const SkRect&, SkRect*) const override; |
| 73 bool asABlur(BlurRec*) const override; | 74 bool asABlur(BlurRec*) const override; |
| 74 | 75 |
| 75 SK_TO_STRING_OVERRIDE() | 76 SK_TO_STRING_OVERRIDE() |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 92 bool ignoreXform() const { | 93 bool ignoreXform() const { |
| 93 return SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag ); | 94 return SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag ); |
| 94 } | 95 } |
| 95 | 96 |
| 96 private: | 97 private: |
| 97 // To avoid unseemly allocation requests (esp. for finite platforms like | 98 // To avoid unseemly allocation requests (esp. for finite platforms like |
| 98 // handset) we limit the radius so something manageable. (as opposed to | 99 // handset) we limit the radius so something manageable. (as opposed to |
| 99 // a request like 10,000) | 100 // a request like 10,000) |
| 100 static const SkScalar kMAX_BLUR_SIGMA; | 101 static const SkScalar kMAX_BLUR_SIGMA; |
| 101 | 102 |
| 103 // This flag should never escape from serialization | |
| 104 static const int kInternalFlag_HasOccluder = 0x08; | |
| 105 | |
| 102 SkScalar fSigma; | 106 SkScalar fSigma; |
| 103 SkBlurStyle fBlurStyle; | 107 SkBlurStyle fBlurStyle; |
| 108 SkRect fOccluder; | |
| 104 uint32_t fBlurFlags; | 109 uint32_t fBlurFlags; |
| 105 | 110 |
| 106 SkBlurQuality getQuality() const { | 111 SkBlurQuality getQuality() const { |
| 107 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? | 112 return (fBlurFlags & SkBlurMaskFilter::kHighQuality_BlurFlag) ? |
| 108 kHigh_SkBlurQuality : kLow_SkBlurQuality; | 113 kHigh_SkBlurQuality : kLow_SkBlurQuality; |
| 109 } | 114 } |
| 110 | 115 |
| 111 SkBlurMaskFilterImpl(SkReadBuffer&); | 116 SkBlurMaskFilterImpl(SkReadBuffer&); |
| 112 void flatten(SkWriteBuffer&) const override; | 117 void flatten(SkWriteBuffer&) const override; |
| 113 | 118 |
| 114 SkScalar computeXformedSigma(const SkMatrix& ctm) const { | 119 SkScalar computeXformedSigma(const SkMatrix& ctm) const { |
| 115 SkScalar xformedSigma = this->ignoreXform() ? fSigma : ctm.mapRadius(fSi gma); | 120 SkScalar xformedSigma = this->ignoreXform() ? fSigma : ctm.mapRadius(fSi gma); |
| 116 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); | 121 return SkMinScalar(xformedSigma, kMAX_BLUR_SIGMA); |
| 117 } | 122 } |
| 118 | 123 |
| 119 friend class SkBlurMaskFilter; | 124 friend class SkBlurMaskFilter; |
| 120 | 125 |
| 121 typedef SkMaskFilter INHERITED; | 126 typedef SkMaskFilter INHERITED; |
| 122 }; | 127 }; |
| 123 | 128 |
| 124 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); | 129 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128); |
| 125 | 130 |
| 126 sk_sp<SkMaskFilter> SkBlurMaskFilter::Make(SkBlurStyle style, SkScalar sigma, ui nt32_t flags) { | 131 sk_sp<SkMaskFilter> SkBlurMaskFilter::Make(SkBlurStyle style, SkScalar sigma, |
| 132 const SkRect& occluder, uint32_t flag s) { | |
| 127 if (!SkScalarIsFinite(sigma) || sigma <= 0) { | 133 if (!SkScalarIsFinite(sigma) || sigma <= 0) { |
| 128 return nullptr; | 134 return nullptr; |
| 129 } | 135 } |
| 130 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { | 136 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { |
| 131 return nullptr; | 137 return nullptr; |
| 132 } | 138 } |
| 133 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); | 139 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
| 134 flags &= SkBlurMaskFilter::kAll_BlurFlag; | 140 flags &= SkBlurMaskFilter::kAll_BlurFlag; |
| 135 | 141 |
| 136 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, flags)); | 142 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, occluder, flags)); |
| 137 } | 143 } |
| 138 | 144 |
| 139 /////////////////////////////////////////////////////////////////////////////// | 145 /////////////////////////////////////////////////////////////////////////////// |
| 140 | 146 |
| 141 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, ui nt32_t flags) | 147 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, |
| 148 const SkRect& occluder, uint32_t flag s) | |
| 142 : fSigma(sigma) | 149 : fSigma(sigma) |
| 143 , fBlurStyle(style) | 150 , fBlurStyle(style) |
| 151 , fOccluder(occluder) | |
| 144 , fBlurFlags(flags) { | 152 , fBlurFlags(flags) { |
| 145 SkASSERT(fSigma > 0); | 153 SkASSERT(fSigma > 0); |
| 146 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); | 154 SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle); |
| 155 fOccluder.sort(); | |
|
reed1
2016/08/09 14:04:54
Lets do this (or reject it) in the factory, rather
robertphillips
2016/08/09 14:46:35
Done. If the user passes in an inverted rect it wi
| |
| 147 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); | 156 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); |
| 148 } | 157 } |
| 149 | 158 |
| 150 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { | 159 SkMask::Format SkBlurMaskFilterImpl::getFormat() const { |
| 151 return SkMask::kA8_Format; | 160 return SkMask::kA8_Format; |
| 152 } | 161 } |
| 153 | 162 |
| 154 bool SkBlurMaskFilterImpl::asABlur(BlurRec* rec) const { | 163 bool SkBlurMaskFilterImpl::asABlur(BlurRec* rec) const { |
| 155 if (this->ignoreXform()) { | 164 if (this->ignoreXform()) { |
| 156 return false; | 165 return false; |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 580 SkScalar pad = 3.0f * fSigma; | 589 SkScalar pad = 3.0f * fSigma; |
| 581 | 590 |
| 582 dst->set(src.fLeft - pad, src.fTop - pad, | 591 dst->set(src.fLeft - pad, src.fTop - pad, |
| 583 src.fRight + pad, src.fBottom + pad); | 592 src.fRight + pad, src.fBottom + pad); |
| 584 } | 593 } |
| 585 | 594 |
| 586 sk_sp<SkFlattenable> SkBlurMaskFilterImpl::CreateProc(SkReadBuffer& buffer) { | 595 sk_sp<SkFlattenable> SkBlurMaskFilterImpl::CreateProc(SkReadBuffer& buffer) { |
| 587 const SkScalar sigma = buffer.readScalar(); | 596 const SkScalar sigma = buffer.readScalar(); |
| 588 const unsigned style = buffer.readUInt(); | 597 const unsigned style = buffer.readUInt(); |
| 589 const unsigned flags = buffer.readUInt(); | 598 const unsigned flags = buffer.readUInt(); |
| 599 | |
| 600 SkRect occluder; | |
| 601 if (flags & kInternalFlag_HasOccluder) { | |
| 602 buffer.readRect(&occluder); | |
| 603 } else { | |
| 604 occluder.setEmpty(); | |
| 605 } | |
| 606 | |
| 590 if (style <= kLastEnum_SkBlurStyle) { | 607 if (style <= kLastEnum_SkBlurStyle) { |
| 591 return SkBlurMaskFilter::Make((SkBlurStyle)style, sigma, flags); | 608 return SkBlurMaskFilter::Make((SkBlurStyle)style, sigma, occluder, |
| 609 flags & ~kInternalFlag_HasOccluder); | |
| 592 } | 610 } |
| 593 return nullptr; | 611 return nullptr; |
| 594 } | 612 } |
| 595 | 613 |
| 596 void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const { | 614 void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const { |
| 597 buffer.writeScalar(fSigma); | 615 buffer.writeScalar(fSigma); |
| 598 buffer.writeUInt(fBlurStyle); | 616 buffer.writeUInt(fBlurStyle); |
| 599 buffer.writeUInt(fBlurFlags); | 617 |
| 618 SkASSERT(!(fBlurFlags & kInternalFlag_HasOccluder)); | |
| 619 buffer.writeUInt(fBlurFlags | kInternalFlag_HasOccluder); | |
| 620 | |
| 621 buffer.writeRect(fOccluder); | |
| 600 } | 622 } |
| 601 | 623 |
| 602 #if SK_SUPPORT_GPU | 624 #if SK_SUPPORT_GPU |
| 603 | 625 |
| 604 class GrGLRectBlurEffect; | 626 class GrGLRectBlurEffect; |
| 605 | 627 |
| 606 class GrRectBlurEffect : public GrFragmentProcessor { | 628 class GrRectBlurEffect : public GrFragmentProcessor { |
| 607 public: | 629 public: |
| 608 ~GrRectBlurEffect() override { } | 630 ~GrRectBlurEffect() override { } |
| 609 | 631 |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1146 | 1168 |
| 1147 void GrRRectBlurEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 1169 void GrRRectBlurEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
| 1148 GrProcessorKeyBuilder* b) const { | 1170 GrProcessorKeyBuilder* b) const { |
| 1149 GrGLRRectBlurEffect::GenKey(*this, caps, b); | 1171 GrGLRRectBlurEffect::GenKey(*this, caps, b); |
| 1150 } | 1172 } |
| 1151 | 1173 |
| 1152 GrGLSLFragmentProcessor* GrRRectBlurEffect::onCreateGLSLInstance() const { | 1174 GrGLSLFragmentProcessor* GrRRectBlurEffect::onCreateGLSLInstance() const { |
| 1153 return new GrGLRRectBlurEffect; | 1175 return new GrGLRRectBlurEffect; |
| 1154 } | 1176 } |
| 1155 | 1177 |
| 1178 static void to_points(const SkRect& r, SkPoint* points) { | |
|
bsalomon
2016/08/09 14:05:56
SkRect::toQuad?
robertphillips
2016/08/09 14:46:35
Done.
| |
| 1179 points[0] = SkPoint::Make(r.fLeft, r.fTop); | |
| 1180 points[1] = SkPoint::Make(r.fRight, r.fTop); | |
| 1181 points[2] = SkPoint::Make(r.fRight, r.fBottom); | |
| 1182 points[3] = SkPoint::Make(r.fLeft, r.fBottom); | |
| 1183 } | |
| 1184 | |
| 1156 bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrTextureProvider* texProvid er, | 1185 bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrTextureProvider* texProvid er, |
| 1157 GrDrawContext* drawContext, | 1186 GrDrawContext* drawContext, |
| 1158 GrPaint* grp, | 1187 GrPaint* grp, |
| 1159 const GrClip& clip, | 1188 const GrClip& clip, |
| 1160 const SkMatrix& viewMatrix, | 1189 const SkMatrix& viewMatrix, |
| 1161 const SkStrokeRec& strokeRec , | 1190 const SkStrokeRec& strokeRec , |
| 1162 const SkRRect& rrect) const { | 1191 const SkRRect& srcRRect, |
| 1192 const SkRRect& devRRect) con st { | |
| 1163 SkASSERT(drawContext); | 1193 SkASSERT(drawContext); |
| 1164 | 1194 |
| 1165 if (fBlurStyle != kNormal_SkBlurStyle) { | 1195 if (fBlurStyle != kNormal_SkBlurStyle) { |
| 1166 return false; | 1196 return false; |
| 1167 } | 1197 } |
| 1168 | 1198 |
| 1169 if (!strokeRec.isFillStyle()) { | 1199 if (!strokeRec.isFillStyle()) { |
| 1170 return false; | 1200 return false; |
| 1171 } | 1201 } |
| 1172 | 1202 |
| 1173 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); | 1203 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); |
| 1174 | 1204 |
| 1175 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(texProvider, xformedSi gma, rrect)); | 1205 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(texProvider, xformedSi gma, devRRect)); |
| 1176 if (!fp) { | 1206 if (!fp) { |
| 1177 return false; | 1207 return false; |
| 1178 } | 1208 } |
| 1179 | 1209 |
| 1180 grp->addCoverageFragmentProcessor(std::move(fp)); | 1210 grp->addCoverageFragmentProcessor(std::move(fp)); |
| 1181 | 1211 |
| 1182 SkMatrix inverse; | 1212 SkMatrix inverse; |
| 1183 if (!viewMatrix.invert(&inverse)) { | 1213 if (!viewMatrix.invert(&inverse)) { |
| 1184 return false; | 1214 return false; |
| 1185 } | 1215 } |
| 1186 | 1216 |
| 1187 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); | 1217 if (!this->ignoreXform()) { |
| 1218 SkRect srcProxyRect = srcRRect.rect(); | |
| 1219 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); | |
| 1188 | 1220 |
| 1189 SkRect proxyRect = rrect.rect(); | 1221 SkPoint points[8]; |
| 1190 proxyRect.outset(extra, extra); | 1222 uint16_t indices[24]; |
| 1223 int numPoints, numIndices; | |
| 1191 | 1224 |
| 1192 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), proxyRect, i nverse); | 1225 SkRect temp = fOccluder; |
| 1226 | |
| 1227 if (!temp.isEmpty() && (srcProxyRect.contains(temp) || temp.intersect(sr cProxyRect))) { | |
| 1228 to_points(srcProxyRect, &points[0]); | |
| 1229 to_points(temp, &points[4]); | |
| 1230 numPoints = 8; | |
| 1231 | |
| 1232 static const uint16_t ringI[24] = { 0, 1, 5, 5, 4, 0, | |
| 1233 1, 2, 6, 6, 5, 1, | |
| 1234 2, 3, 7, 7, 6, 2, | |
| 1235 3, 0, 4, 4, 7, 3 }; | |
| 1236 memcpy(indices, ringI, sizeof(ringI)); | |
| 1237 numIndices = 24; | |
| 1238 } else { | |
| 1239 // full rect case | |
| 1240 to_points(srcProxyRect, &points[0]); | |
| 1241 numPoints = 4; | |
| 1242 | |
| 1243 static const uint16_t fullI[6] = { 0, 1, 2, 0, 2, 3 }; | |
| 1244 memcpy(indices, fullI, sizeof(fullI)); | |
| 1245 numIndices = 6; | |
| 1246 } | |
| 1247 | |
| 1248 drawContext->drawVertices(clip, *grp, viewMatrix, kTriangles_GrPrimitive Type, | |
| 1249 numPoints, points, nullptr, nullptr, indices , numIndices); | |
| 1250 | |
| 1251 } else { | |
| 1252 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); | |
| 1253 SkRect proxyRect = devRRect.rect(); | |
| 1254 proxyRect.outset(extra, extra); | |
| 1255 | |
| 1256 | |
| 1257 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), proxyRec t, inverse); | |
| 1258 } | |
| 1259 | |
| 1193 return true; | 1260 return true; |
| 1194 } | 1261 } |
| 1195 | 1262 |
| 1196 bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRRect& devRRect, | 1263 bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRRect& devRRect, |
| 1197 const SkIRect& clipBounds, | 1264 const SkIRect& clipBounds, |
| 1198 const SkMatrix& ctm, | 1265 const SkMatrix& ctm, |
| 1199 SkRect* maskRect) const { | 1266 SkRect* maskRect) const { |
| 1200 SkScalar xformedSigma = this->computeXformedSigma(ctm); | 1267 SkScalar xformedSigma = this->computeXformedSigma(ctm); |
| 1201 if (xformedSigma <= 0) { | 1268 if (xformedSigma <= 0) { |
| 1202 return false; | 1269 return false; |
| 1203 } | 1270 } |
| 1204 | 1271 |
| 1205 // We always do circles on the GPU | 1272 // We always do circles on the GPU |
| 1206 if (!devRRect.isCircle()) { | 1273 if (!devRRect.isCircle()) { |
| 1207 static const SkScalar kMIN_GPU_BLUR_SIZE = SkIntToScalar(64); | 1274 static const SkScalar kMIN_GPU_BLUR_SIZE = SkIntToScalar(64); |
| 1208 static const SkScalar kMIN_GPU_BLUR_SIGMA = SkIntToScalar(32); | 1275 static const SkScalar kMIN_GPU_BLUR_SIGMA = SkIntToScalar(32); |
| 1209 | 1276 |
| 1210 if (devRRect.width() <= kMIN_GPU_BLUR_SIZE && | 1277 if (!devRRect.allCornersCircular() && |
| 1278 devRRect.width() <= kMIN_GPU_BLUR_SIZE && | |
| 1211 devRRect.height() <= kMIN_GPU_BLUR_SIZE && | 1279 devRRect.height() <= kMIN_GPU_BLUR_SIZE && |
| 1212 xformedSigma <= kMIN_GPU_BLUR_SIGMA) { | 1280 xformedSigma <= kMIN_GPU_BLUR_SIGMA) { |
| 1213 // We prefer to blur small rects with small radii on the CPU. | 1281 // We prefer to blur small rects with small radii on the CPU. |
| 1214 return false; | 1282 return false; |
| 1215 } | 1283 } |
| 1216 } | 1284 } |
| 1217 | 1285 |
| 1218 if (nullptr == maskRect) { | 1286 if (nullptr == maskRect) { |
| 1219 // don't need to compute maskRect | 1287 // don't need to compute maskRect |
| 1220 return true; | 1288 return true; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1297 str->append(" "); | 1365 str->append(" "); |
| 1298 | 1366 |
| 1299 static const char* gStyleName[kLastEnum_SkBlurStyle + 1] = { | 1367 static const char* gStyleName[kLastEnum_SkBlurStyle + 1] = { |
| 1300 "normal", "solid", "outer", "inner" | 1368 "normal", "solid", "outer", "inner" |
| 1301 }; | 1369 }; |
| 1302 | 1370 |
| 1303 str->appendf("style: %s ", gStyleName[fBlurStyle]); | 1371 str->appendf("style: %s ", gStyleName[fBlurStyle]); |
| 1304 str->append("flags: ("); | 1372 str->append("flags: ("); |
| 1305 if (fBlurFlags) { | 1373 if (fBlurFlags) { |
| 1306 bool needSeparator = false; | 1374 bool needSeparator = false; |
| 1307 SkAddFlagToString(str, | 1375 SkAddFlagToString(str, this->ignoreXform(), "IgnoreXform", &needSeparato r); |
| 1308 SkToBool(fBlurFlags & SkBlurMaskFilter::kIgnoreTransfo rm_BlurFlag), | |
| 1309 "IgnoreXform", &needSeparator); | |
| 1310 SkAddFlagToString(str, | 1376 SkAddFlagToString(str, |
| 1311 SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_B lurFlag), | 1377 SkToBool(fBlurFlags & SkBlurMaskFilter::kHighQuality_B lurFlag), |
| 1312 "HighQuality", &needSeparator); | 1378 "HighQuality", &needSeparator); |
| 1313 } else { | 1379 } else { |
| 1314 str->append("None"); | 1380 str->append("None"); |
| 1315 } | 1381 } |
| 1316 str->append("))"); | 1382 str->append("))"); |
| 1317 } | 1383 } |
| 1318 #endif | 1384 #endif |
| 1319 | 1385 |
| 1320 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1386 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
| 1321 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1387 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
| 1322 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1388 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |