Remove occluder feature from blur mask filter
AFAICT none of our clients are using this feature
This will change the occludedrrectblur GM.
Change-Id: I7e5b8fa67db0373dee11a1467d2b2b6a414a1574
Reviewed-on: https://skia-review.googlesource.com/147561
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp
index 80d3e81..9e56a3c 100644
--- a/fuzz/FuzzCanvas.cpp
+++ b/fuzz/FuzzCanvas.cpp
@@ -507,17 +507,8 @@
fuzz_enum_range(fuzz, &blurStyle, 0, kLastEnum_SkBlurStyle);
SkScalar sigma;
fuzz->next(&sigma);
- SkRect occluder{0.0f, 0.0f, 0.0f, 0.0f};
- bool useOccluder;
- fuzz->next(&useOccluder);
- if (useOccluder) {
- fuzz->next(&occluder);
- }
bool respectCTM;
fuzz->next(&respectCTM);
- if (useOccluder) {
- return SkMaskFilter::MakeBlur(blurStyle, sigma, occluder, respectCTM);
- }
return SkMaskFilter::MakeBlur(blurStyle, sigma, respectCTM);
}
default:
diff --git a/gm/drawregionmodes.cpp b/gm/drawregionmodes.cpp
index 1fd54f5..0a8a2ba 100644
--- a/gm/drawregionmodes.cpp
+++ b/gm/drawregionmodes.cpp
@@ -50,8 +50,7 @@
canvas->translate(-125.0f, 125.0f);
paint.setImageFilter(nullptr);
- SkRect occluder = SkRect::MakeEmpty();
- paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 5.0f, occluder));
+ paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 5.0f));
canvas->drawRegion(fRegion, paint);
canvas->translate(-125.0f, -125.0f);
diff --git a/gm/occludedrrectblur.cpp b/gm/occludedrrectblur.cpp
deleted file mode 100644
index 9b9b7db..0000000
--- a/gm/occludedrrectblur.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gm.h"
-#include "sk_tool_utils.h"
-#include "SkMaskFilter.h"
-#include "SkRRect.h"
-
-static SkRect offset_center_to(const SkIRect& src, SkScalar x, SkScalar y) {
- SkScalar halfW = 0.5f * src.width();
- SkScalar halfH = 0.5f * src.height();
-
- return SkRect::MakeLTRB(x - halfW, y - halfH, x + halfW, y + halfH);
-}
-
-static void draw_rrect(SkCanvas* canvas, const SkRRect& rr, const SkRRect& occRR) {
- const SkScalar kBlurSigma = 5.0f;
-
- SkRect occRect;
- SkColor strokeColor;
-
- {
- SkRect occRect1 = sk_tool_utils::compute_central_occluder(occRR);
- SkRect occRect2 = sk_tool_utils::compute_widest_occluder(occRR);
- SkRect occRect3 = sk_tool_utils::compute_tallest_occluder(occRR);
-
- SkScalar area1 = occRect1.width() * occRect1.height();
- SkScalar area2 = occRect2.width() * occRect2.height();
- SkScalar area3 = occRect3.width() * occRect3.height();
-
- if (area1 >= area2 && area1 >= area3) {
- strokeColor = SK_ColorRED;
- occRect = occRect1;
- } else if (area2 > area3) {
- strokeColor = SK_ColorYELLOW;
- occRect = occRect2;
- } else {
- strokeColor = SK_ColorCYAN;
- occRect = occRect3;
- }
- }
-
- // draw the blur
- SkPaint paint;
- paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, kBlurSigma, occRect));
- canvas->drawRRect(rr, paint);
-
- // draw the stroked geometry of the full occluder
- SkPaint stroke;
- stroke.setStyle(SkPaint::kStroke_Style);
- stroke.setColor(SK_ColorBLUE);
- canvas->drawRRect(occRR, stroke);
-
- // draw the geometry of the occluding rect
- stroke.setColor(strokeColor);
- canvas->drawRect(occRect, stroke);
-}
-
-static void draw_45(SkCanvas* canvas, SkRRect::Corner corner,
- SkScalar dist, const SkPoint& center) {
- SkRRect::Corner left = SkRRect::kUpperLeft_Corner, right = SkRRect::kUpperLeft_Corner;
- SkVector dir = { 0, 0 };
-
- constexpr SkScalar kSize = 64.0f / SK_ScalarSqrt2;
-
- switch (corner) {
- case SkRRect::kUpperLeft_Corner:
- left = SkRRect::kUpperRight_Corner;
- right = SkRRect::kLowerLeft_Corner;
-
- dir.set(-SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2);
- break;
- case SkRRect::kUpperRight_Corner:
- left = SkRRect::kUpperLeft_Corner;
- right = SkRRect::kLowerRight_Corner;
- dir.set(SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2);
- break;
- case SkRRect::kLowerRight_Corner:
- left = SkRRect::kLowerLeft_Corner;
- right = SkRRect::kUpperRight_Corner;
- dir.set(SK_ScalarRoot2Over2, SK_ScalarRoot2Over2);
- break;
- case SkRRect::kLowerLeft_Corner:
- left = SkRRect::kLowerRight_Corner;
- right = SkRRect::kUpperLeft_Corner;
- dir.set(-SK_ScalarRoot2Over2, SK_ScalarRoot2Over2);
- break;
- default:
- SK_ABORT("Invalid shape.");
- }
-
- SkRect r = SkRect::MakeWH(kSize, kSize);
- // UL, UR, LR, LL
- SkVector radii[4] = { { 0.0f, 0.0f }, { 0.0f, 0.0f }, { 0.0f, 0.0f }, { 0.0f, 0.0f } };
- radii[left] = SkVector::Make(kSize, kSize);
- radii[right] = SkVector::Make(kSize, kSize);
- SkRRect rr;
- rr.setRectRadii(
- offset_center_to(r.roundOut(), center.fX + dist*dir.fX, center.fY + dist*dir.fY),
- radii);
-
- SkRRect occRR;
- dist -= 10.0f;
- occRR.setRectRadii(
- offset_center_to(r.roundOut(), center.fX + dist*dir.fX, center.fY + dist*dir.fY),
- radii);
-
- draw_rrect(canvas, rr, occRR);
-}
-
-static void draw_45_simple(SkCanvas* canvas, const SkVector& v,
- SkScalar dist, const SkPoint& center) {
- SkIRect r = SkIRect::MakeWH(64, 64);
- SkRRect rr = SkRRect::MakeRectXY(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY),
- 8, 8);
-
- dist -= 10.0f;
- SkRRect occRR = SkRRect::MakeRectXY(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY),
- 8, 8);
-
- draw_rrect(canvas, rr, occRR);
-}
-
-static void draw_90(SkCanvas* canvas, const SkVector& v, SkScalar dist, const SkPoint& center) {
- constexpr int kWidth = 25;
-
- SkIRect r;
- if (fabs(v.fX) < fabs(v.fY)) {
- r = SkIRect::MakeWH(kWidth, 64);
- } else {
- r = SkIRect::MakeWH(64, kWidth);
- }
- SkRRect rr = SkRRect::MakeOval(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY));
-
- dist -= 10.0f;
- SkRRect occRR = SkRRect::MakeOval(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY));
-
- draw_rrect(canvas, rr, occRR);
-}
-
-static void draw_90_simple(SkCanvas* canvas, const SkVector& v,
- SkScalar dist, const SkPoint& center) {
- constexpr int kLength = 128;
- // The width needs to be larger than 2*3*blurRadii+2*cornerRadius for the analytic
- // RRect blur to kick in
- constexpr int kWidth = 47;
-
- SkIRect r;
- if (fabs(v.fX) < fabs(v.fY)) {
- r = SkIRect::MakeWH(kLength, kWidth);
- } else {
- r = SkIRect::MakeWH(kWidth, kLength);
- }
- SkRRect rr = SkRRect::MakeRectXY(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY),
- 8, 8);
-
- dist -= 10.0f;
- SkRRect occRR = SkRRect::MakeRectXY(
- offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY),
- 8, 8);
-
- draw_rrect(canvas, rr, occRR);
-}
-
-static void draw_30_60(SkCanvas* canvas, SkRRect::Corner corner, const SkVector& v,
- SkScalar dist, const SkPoint& center) {
- SkRRect::Corner left = SkRRect::kUpperLeft_Corner, right = SkRRect::kUpperLeft_Corner;
-
- constexpr int kLength = 64;
- constexpr int kWidth = 30;
-
- switch (corner) {
- case SkRRect::kUpperLeft_Corner:
- left = SkRRect::kUpperRight_Corner;
- right = SkRRect::kLowerLeft_Corner;
- break;
- case SkRRect::kUpperRight_Corner:
- left = SkRRect::kUpperLeft_Corner;
- right = SkRRect::kLowerRight_Corner;
- break;
- case SkRRect::kLowerRight_Corner:
- left = SkRRect::kLowerLeft_Corner;
- right = SkRRect::kUpperRight_Corner;
- break;
- case SkRRect::kLowerLeft_Corner:
- left = SkRRect::kLowerRight_Corner;
- right = SkRRect::kUpperLeft_Corner;
- break;
- default:
- SK_ABORT("Invalid shape.");
- }
-
- SkIRect r;
- if (fabs(v.fX) < fabs(v.fY)) {
- r = SkIRect::MakeWH(kLength, kWidth);
- } else {
- r = SkIRect::MakeWH(kWidth, kLength);
- }
- // UL, UR, LR, LL
- SkVector radii[4] = { { 0.0f, 0.0f }, { 0.0f, 0.0f }, { 0.0f, 0.0f }, { 0.0f, 0.0f } };
- radii[left] = SkVector::Make(SkIntToScalar(kWidth), SkIntToScalar(kWidth));
- radii[right] = SkVector::Make(SkIntToScalar(kWidth), SkIntToScalar(kWidth));
- SkRRect rr;
- rr.setRectRadii(offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY), radii);
-
- dist -= 10.0f;
- SkRRect occRR;
- occRR.setRectRadii(offset_center_to(r, center.fX + dist*v.fX, center.fY + dist*v.fY), radii);
- draw_rrect(canvas, rr, occRR);
-}
-
-namespace skiagm {
-
-class OccludedRRectBlurGM : public GM {
-public:
- OccludedRRectBlurGM() {
- this->setBGColor(0xFFCCCCCC);
- }
-
-protected:
-
- SkString onShortName() override {
- return SkString("occludedrrectblur");
- }
-
- SkISize onISize() override {
- return SkISize::Make(kWidth, kHeight);
- }
-
- void onDraw(SkCanvas* canvas) override {
- const SkPoint center = SkPoint::Make(kWidth/2, kHeight/2);
-
- // outer-most big RR
- {
- SkIRect r = SkIRect::MakeWH(420, 420);
- SkRRect rr = SkRRect::MakeRectXY(offset_center_to(r, center.fX, center.fY), 64, 64);
- draw_rrect(canvas, rr, rr);
-
-#if 1
- // TODO: remove this. Until we actually start skipping the middle draw we need this
- // to provide contrast
- SkPaint temp;
- temp.setColor(0xFFCCCCCC);
- r.inset(32, 32);
- canvas->drawRect(offset_center_to(r, center.fX, center.fY), temp);
-#endif
- }
-
- // center circle
- {
- SkIRect r = SkIRect::MakeWH(32, 32);
- SkRRect rr = SkRRect::MakeOval(offset_center_to(r, center.fX, center.fY));
- draw_rrect(canvas, rr, rr);
- }
-
- draw_45(canvas, SkRRect::kUpperLeft_Corner, 64, center);
- draw_45(canvas, SkRRect::kUpperRight_Corner, 64, center);
- draw_45(canvas, SkRRect::kLowerRight_Corner, 64, center);
- draw_45(canvas, SkRRect::kLowerLeft_Corner, 64, center);
-
- draw_90(canvas, SkVector::Make(-1.0f, 0.0f), 64, center);
- draw_90(canvas, SkVector::Make(0.0f, -1.0f), 64, center);
- draw_90(canvas, SkVector::Make(1.0f, 0.0f), 64, center);
- draw_90(canvas, SkVector::Make(0.0f, 1.0f), 64, center);
-
- constexpr SkScalar kRoot3Over2 = 0.8660254037844386f;
-
- draw_30_60(canvas, SkRRect::kLowerLeft_Corner,
- SkVector::Make(0.5f, kRoot3Over2), 120, center);
- draw_30_60(canvas, SkRRect::kUpperRight_Corner,
- SkVector::Make(kRoot3Over2, 0.5f), 120, center);
-
- draw_30_60(canvas, SkRRect::kUpperLeft_Corner,
- SkVector::Make(-0.5f, kRoot3Over2), 120, center);
- draw_30_60(canvas, SkRRect::kLowerRight_Corner,
- SkVector::Make(-kRoot3Over2, 0.5f), 120, center);
-
- draw_30_60(canvas, SkRRect::kLowerLeft_Corner,
- SkVector::Make(-0.5f, -kRoot3Over2), 120, center);
- draw_30_60(canvas, SkRRect::kUpperRight_Corner,
- SkVector::Make(-kRoot3Over2, -0.5f), 120, center);
-
- draw_30_60(canvas, SkRRect::kUpperLeft_Corner,
- SkVector::Make(0.5f, -kRoot3Over2), 120, center);
- draw_30_60(canvas, SkRRect::kLowerRight_Corner,
- SkVector::Make(kRoot3Over2, -0.5f), 120, center);
-
- draw_45_simple(canvas, SkVector::Make(-SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2),
- 210, center);
- draw_45_simple(canvas, SkVector::Make(SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2),
- 210, center);
- draw_45_simple(canvas, SkVector::Make(SK_ScalarRoot2Over2, SK_ScalarRoot2Over2),
- 210, center);
- draw_45_simple(canvas, SkVector::Make(-SK_ScalarRoot2Over2, SK_ScalarRoot2Over2),
- 210, center);
-
- draw_90_simple(canvas, SkVector::Make(-1.0f, 0.0f), 160, center);
- draw_90_simple(canvas, SkVector::Make(0.0f, -1.0f), 160, center);
- draw_90_simple(canvas, SkVector::Make(1.0f, 0.0f), 160, center);
- draw_90_simple(canvas, SkVector::Make(0.0f, 1.0f), 160, center);
- }
-
-private:
- static constexpr int kWidth = 440;
- static constexpr int kHeight = 440;
-
- typedef GM INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_GM(return new OccludedRRectBlurGM;)
-}
diff --git a/gn/gm.gni b/gn/gm.gni
index 304964d..7dcfe07 100644
--- a/gn/gm.gni
+++ b/gn/gm.gni
@@ -222,7 +222,6 @@
"$_gm/nested.cpp",
"$_gm/ninepatchstretch.cpp",
"$_gm/nonclosedpaths.cpp",
- "$_gm/occludedrrectblur.cpp",
"$_gm/offsetimagefilter.cpp",
"$_gm/orientation.cpp",
"$_gm/ovals.cpp",
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h
index fbcbc0f..404a3d3 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -33,8 +33,10 @@
* @param respectCTM if true the blur's sigma is modified by the CTM.
* @return The new blur maskfilter
*/
- static sk_sp<SkMaskFilter> MakeBlur(SkBlurStyle style, SkScalar sigma, const SkRect& occluder,
- bool respectCTM = true);
+ static sk_sp<SkMaskFilter> MakeBlur(SkBlurStyle style, SkScalar sigma, const SkRect&,
+ bool respectCTM = true) {
+ return MakeBlur(style, sigma, respectCTM);
+ }
static sk_sp<SkMaskFilter> MakeBlur(SkBlurStyle style, SkScalar sigma,
bool respectCTM = true);
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 72cd3f2..511999a 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -262,10 +262,11 @@
// V61: Change SkDrawPictureRec to take two colors rather than two alphas
// V62: Don't negate size of custom encoded images (don't write origin x,y either)
// V63: Store image bounds (including origin) instead of just width/height to support subsets
+ // V64: Remove occluder feature from blur maskFilter
// Only SKPs within the min/current picture version range (inclusive) can be read.
static const uint32_t MIN_PICTURE_VERSION = 56; // august 2017
- static const uint32_t CURRENT_PICTURE_VERSION = 63;
+ static const uint32_t CURRENT_PICTURE_VERSION = 64;
static_assert(MIN_PICTURE_VERSION <= 62, "Remove kFontAxes_bad from SkFontDescriptor.cpp");
diff --git a/src/core/SkBlurMF.cpp b/src/core/SkBlurMF.cpp
index f041049..4d4e250 100644
--- a/src/core/SkBlurMF.cpp
+++ b/src/core/SkBlurMF.cpp
@@ -41,7 +41,7 @@
class SkBlurMaskFilterImpl : public SkMaskFilterBase {
public:
- SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, const SkRect& occluder, bool respectCTM);
+ SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle, bool respectCTM);
// overrides from SkMaskFilter
SkMask::Format getFormat() const override;
@@ -103,7 +103,6 @@
SkScalar fSigma;
SkBlurStyle fBlurStyle;
- SkRect fOccluder;
bool fRespectCTM;
SkBlurMaskFilterImpl(SkReadBuffer&);
@@ -267,11 +266,9 @@
///////////////////////////////////////////////////////////////////////////////
-SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style,
- const SkRect& occluder, bool respectCTM)
+SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, bool respectCTM)
: fSigma(sigma)
, fBlurStyle(style)
- , fOccluder(occluder)
, fRespectCTM(respectCTM) {
SkASSERT(fSigma > 0);
SkASSERT((unsigned)style <= kLastEnum_SkBlurStyle);
@@ -714,17 +711,18 @@
uint32_t flags = buffer.read32LE(0x3); // historically we only recorded 2 bits
bool respectCTM = !(flags & 1); // historically we stored ignoreCTM in low bit
- SkRect occluder;
- buffer.readRect(&occluder);
+ if (buffer.isVersionLT(SkReadBuffer::kRemoveOccluderFromBlurMaskFilter)) {
+ SkRect unused;
+ buffer.readRect(&unused);
+ }
- return SkMaskFilter::MakeBlur((SkBlurStyle)style, sigma, occluder, respectCTM);
+ return SkMaskFilter::MakeBlur((SkBlurStyle)style, sigma, respectCTM);
}
void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const {
buffer.writeScalar(fSigma);
buffer.writeUInt(fBlurStyle);
buffer.writeUInt(!fRespectCTM); // historically we recorded ignoreCTM
- buffer.writeRect(fOccluder);
}
@@ -852,29 +850,12 @@
SkRect srcProxyRect = srcRRect.rect();
srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma);
- sk_sp<SkVertices> vertices = nullptr;
- SkRect temp = fOccluder;
+ SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, 4, 6, 0);
+ srcProxyRect.toQuad(builder.positions());
- if (!temp.isEmpty() && (srcProxyRect.contains(temp) || temp.intersect(srcProxyRect))) {
- SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, 8, 24, 0);
- srcProxyRect.toQuad(builder.positions());
- temp.toQuad(builder.positions() + 4);
-
- static const uint16_t ringI[24] = { 0, 1, 5, 5, 4, 0,
- 1, 2, 6, 6, 5, 1,
- 2, 3, 7, 7, 6, 2,
- 3, 0, 4, 4, 7, 3 };
- memcpy(builder.indices(), ringI, sizeof(ringI));
- vertices = builder.detach();
- } else {
- // full rect case
- SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, 4, 6, 0);
- srcProxyRect.toQuad(builder.positions());
-
- static const uint16_t fullI[6] = { 0, 1, 2, 0, 2, 3 };
- memcpy(builder.indices(), fullI, sizeof(fullI));
- vertices = builder.detach();
- }
+ static const uint16_t fullIndices[6] = { 0, 1, 2, 0, 2, 3 };
+ memcpy(builder.indices(), fullIndices, sizeof(fullIndices));
+ sk_sp<SkVertices> vertices = builder.detach();
paint.addCoverageFragmentProcessor(std::move(fp));
renderTargetContext->drawVertices(clip, std::move(paint), viewMatrix, std::move(vertices),
@@ -998,14 +979,9 @@
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
}
-sk_sp<SkMaskFilter> SkMaskFilter::MakeBlur(SkBlurStyle style, SkScalar sigma,
- const SkRect& occluder, bool respectCTM) {
+sk_sp<SkMaskFilter> SkMaskFilter::MakeBlur(SkBlurStyle style, SkScalar sigma, bool respectCTM) {
if (SkScalarIsFinite(sigma) && sigma > 0) {
- return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, occluder, respectCTM));
+ return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, respectCTM));
}
return nullptr;
}
-
-sk_sp<SkMaskFilter> SkMaskFilter::MakeBlur(SkBlurStyle style, SkScalar sigma, bool respectCTM) {
- return MakeBlur(style, sigma, SkRect::MakeEmpty(), respectCTM);
-}
diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h
index 1904cc8..4a0a263 100644
--- a/src/core/SkReadBuffer.h
+++ b/src/core/SkReadBuffer.h
@@ -79,6 +79,7 @@
kTwoColorDrawShadow_Version = 61,
kDontNegateImageSize_Version = 62,
kStoreImageBounds_Version = 63,
+ kRemoveOccluderFromBlurMaskFilter = 64,
};
/**