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,
     };
 
     /**