Avoid OveridePaintFilterCanvas in Viewer when possible

Since:

https://skia-review.googlesource.com/c/skia/+/431539 (Feed all top-level GPU accessors through skgpu::BaseDevice (take 2))

The OveridePaintFilterCanvas now blocks access to the true SurfaceDrawContext that backs the top device of a GPU-backed SkCanvas. This is because the SkPaintFilterCanvas doesn't pass on SkCanvas::topDevice calls to the canvas it is wrapping so it always returns a SkNoPixelsDevice.

Given that accessing the top SDC is an incredibly specialized testing-only feature this CL keeps the feature working short-term w/o gumming up the public API.

Change-Id: I99012ba34c2800e0149251667156b412c4e8aa63
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/433362
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 8d7a7be..9cbfe0c 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -1270,11 +1270,18 @@
 
 class OveridePaintFilterCanvas : public SkPaintFilterCanvas {
 public:
-    OveridePaintFilterCanvas(SkCanvas* canvas, SkPaint* paint, Viewer::SkPaintFields* pfields,
-            SkFont* font, Viewer::SkFontFields* ffields)
-        : SkPaintFilterCanvas(canvas), fPaint(paint), fPaintOverrides(pfields), fFont(font), fFontOverrides(ffields)
-    { }
-    const SkTextBlob* filterTextBlob(const SkPaint& paint, const SkTextBlob* blob,
+    OveridePaintFilterCanvas(SkCanvas* canvas,
+                             SkPaint* paint, Viewer::SkPaintFields* pfields,
+                             SkFont* font, Viewer::SkFontFields* ffields)
+        : SkPaintFilterCanvas(canvas)
+        , fPaint(paint)
+        , fPaintOverrides(pfields)
+        , fFont(font)
+        , fFontOverrides(ffields) {
+    }
+
+    const SkTextBlob* filterTextBlob(const SkPaint& paint,
+                                     const SkTextBlob* blob,
                                      sk_sp<SkTextBlob>* cache) {
         bool blobWillChange = false;
         for (SkTextBlobRunIterator it(blob); !it.done(); it.next()) {
@@ -1341,6 +1348,9 @@
             this->filterTextBlob(paint, blob, &cache), x, y, paint);
     }
     bool filterFont(SkTCopyOnFirstWrite<SkFont>* font) const {
+        if (fFontOverrides->fTypeface) {
+            font->writable()->setTypeface(fFont->refTypeface());
+        }
         if (fFontOverrides->fSize) {
             font->writable()->setSize(fFont->getSize());
         }
@@ -1356,42 +1366,66 @@
         if (fFontOverrides->fEdging) {
             font->writable()->setEdging(fFont->getEdging());
         }
+        if (fFontOverrides->fSubpixel) {
+            font->writable()->setSubpixel(fFont->isSubpixel());
+        }
+        if (fFontOverrides->fForceAutoHinting) {
+            font->writable()->setForceAutoHinting(fFont->isForceAutoHinting());
+        }
+        if (fFontOverrides->fEmbeddedBitmaps) {
+            font->writable()->setEmbeddedBitmaps(fFont->isEmbeddedBitmaps());
+        }
+        if (fFontOverrides->fLinearMetrics) {
+            font->writable()->setLinearMetrics(fFont->isLinearMetrics());
+        }
         if (fFontOverrides->fEmbolden) {
             font->writable()->setEmbolden(fFont->isEmbolden());
         }
         if (fFontOverrides->fBaselineSnap) {
             font->writable()->setBaselineSnap(fFont->isBaselineSnap());
         }
-        if (fFontOverrides->fLinearMetrics) {
-            font->writable()->setLinearMetrics(fFont->isLinearMetrics());
-        }
-        if (fFontOverrides->fSubpixel) {
-            font->writable()->setSubpixel(fFont->isSubpixel());
-        }
-        if (fFontOverrides->fEmbeddedBitmaps) {
-            font->writable()->setEmbeddedBitmaps(fFont->isEmbeddedBitmaps());
-        }
-        if (fFontOverrides->fForceAutoHinting) {
-            font->writable()->setForceAutoHinting(fFont->isForceAutoHinting());
-        }
 
-        return true;
+        return true; // we, currently, never elide a draw
     }
+
     bool onFilter(SkPaint& paint) const override {
+        if (fPaintOverrides->fPathEffect) {
+            paint.setPathEffect(fPaint->refPathEffect());
+        }
+        if (fPaintOverrides->fShader) {
+            paint.setShader(fPaint->refShader());
+        }
+        if (fPaintOverrides->fMaskFilter) {
+            paint.setMaskFilter(fPaint->refMaskFilter());
+        }
+        if (fPaintOverrides->fColorFilter) {
+            paint.setColorFilter(fPaint->refColorFilter());
+        }
+        if (fPaintOverrides->fImageFilter) {
+            paint.setImageFilter(fPaint->refImageFilter());
+        }
+        if (fPaintOverrides->fColor) {
+            paint.setColor4f(fPaint->getColor4f());
+        }
+        if (fPaintOverrides->fStrokeWidth) {
+            paint.setStrokeWidth(fPaint->getStrokeWidth());
+        }
+        if (fPaintOverrides->fMiterLimit) {
+            paint.setStrokeMiter(fPaint->getStrokeMiter());
+        }
+        if (fPaintOverrides->fBlendMode) {
+            paint.setBlendMode(fPaint->getBlendMode_or(SkBlendMode::kSrc));
+        }
         if (fPaintOverrides->fAntiAlias) {
             paint.setAntiAlias(fPaint->isAntiAlias());
         }
         if (fPaintOverrides->fDither) {
             paint.setDither(fPaint->isDither());
         }
-        if (fPaintOverrides->fStyle) {
-            paint.setStyle(fPaint->getStyle());
-        }
-        if (fPaintOverrides->fWidth) {
-            paint.setStrokeWidth(fPaint->getStrokeWidth());
-        }
-        if (fPaintOverrides->fMiterLimit) {
-            paint.setStrokeMiter(fPaint->getStrokeMiter());
+        if (fPaintOverrides->fForceRuntimeBlend) {
+            if (skstd::optional<SkBlendMode> mode = paint.asBlendMode()) {
+                paint.setBlender(GetRuntimeBlendForBlendMode(*mode));
+            }
         }
         if (fPaintOverrides->fCapType) {
             paint.setStrokeCap(fPaint->getStrokeCap());
@@ -1399,12 +1433,10 @@
         if (fPaintOverrides->fJoinType) {
             paint.setStrokeJoin(fPaint->getStrokeJoin());
         }
-        if (fPaintOverrides->fForceRuntimeBlend) {
-            if (skstd::optional<SkBlendMode> mode = paint.asBlendMode()) {
-                paint.setBlender(GetRuntimeBlendForBlendMode(*mode));
-            }
+        if (fPaintOverrides->fStyle) {
+            paint.setStyle(fPaint->getStyle());
         }
-        return true;
+        return true; // we, currently, never elide a draw
     }
     SkPaint* fPaint;
     Viewer::SkPaintFields* fPaintOverrides;
@@ -1524,9 +1556,14 @@
         if (kPerspective_Real == fPerspectiveMode) {
             slideCanvas->clipRect(SkRect::MakeWH(fWindow->width(), fWindow->height()));
         }
-        OveridePaintFilterCanvas filterCanvas(slideCanvas, &fPaint, &fPaintOverrides,
-                                              &fFont, &fFontOverrides);
-        fSlides[fCurrentSlide]->draw(&filterCanvas);
+        if (fPaintOverrides.overridesSomething() || fFontOverrides.overridesSomething()) {
+            OveridePaintFilterCanvas filterCanvas(slideCanvas,
+                                                  &fPaint, &fPaintOverrides,
+                                                  &fFont, &fFontOverrides);
+            fSlides[fCurrentSlide]->draw(&filterCanvas);
+        } else {
+            fSlides[fCurrentSlide]->draw(slideCanvas);
+        }
     }
     fStatsLayer.endTiming(fPaintTimer);
     slideCanvas->restoreToCount(count);
@@ -2083,8 +2120,8 @@
 
                 ImGui::Checkbox("Force Runtime Blends", &fPaintOverrides.fForceRuntimeBlend);
 
-                ImGui::Checkbox("Override Stroke Width", &fPaintOverrides.fWidth);
-                if (fPaintOverrides.fWidth) {
+                ImGui::Checkbox("Override Stroke Width", &fPaintOverrides.fStrokeWidth);
+                if (fPaintOverrides.fStrokeWidth) {
                     float width = fPaint.getStrokeWidth();
                     if (ImGui::SliderFloat("Stroke Width", &width, 0, 20)) {
                         fPaint.setStrokeWidth(width);
diff --git a/tools/viewer/Viewer.h b/tools/viewer/Viewer.h
index c155c69..d93cbcc 100644
--- a/tools/viewer/Viewer.h
+++ b/tools/viewer/Viewer.h
@@ -49,6 +49,21 @@
     static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler();
 
     struct SkFontFields {
+        bool overridesSomething() const {
+            return fTypeface ||
+                   fSize ||
+                   fScaleX ||
+                   fSkewX ||
+                   fHinting ||
+                   fEdging ||
+                   fSubpixel ||
+                   fForceAutoHinting ||
+                   fEmbeddedBitmaps ||
+                   fLinearMetrics ||
+                   fEmbolden ||
+                   fBaselineSnap;
+        }
+
         bool fTypeface = false;
         bool fSize = false;
         SkScalar fSizeRange[2] = { 0, 20 };
@@ -64,15 +79,32 @@
         bool fBaselineSnap = false;
     };
     struct SkPaintFields {
+        bool overridesSomething() const {
+            return fPathEffect ||
+                   fShader ||
+                   fMaskFilter ||
+                   fColorFilter ||
+                   fImageFilter ||
+                   fColor ||
+                   fStrokeWidth ||
+                   fMiterLimit ||
+                   fBlendMode ||
+                   fAntiAlias ||
+                   fDither ||
+                   fForceRuntimeBlend ||
+                   fCapType ||
+                   fJoinType ||
+                   fStyle;
+        }
+
         bool fPathEffect = false;
         bool fShader = false;
         bool fMaskFilter = false;
         bool fColorFilter = false;
-        bool fDrawLooper = false;
         bool fImageFilter = false;
 
         bool fColor = false;
-        bool fWidth = false;
+        bool fStrokeWidth = false;
         bool fMiterLimit = false;
         bool fBlendMode = false;