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;