From 65ec198696f6940f35587483c5a22020578dde78 Mon Sep 17 00:00:00 2001 From: John Stiles Date: Tue, 20 Jul 2021 12:53:54 -0400 Subject: [PATCH] Add dm via-option `rtblend-` to test using Runtime Blends. Change-Id: I46844754a86ae44b61747b7244edf6cc1fd73d61 Bug: skia:12080 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/429102 Auto-Submit: John Stiles Commit-Queue: John Stiles Reviewed-by: Brian Osman --- BUILD.gn | 2 ++ dm/DM.cpp | 1 + dm/DMSrcSink.cpp | 35 +++++++++++++++++++++++++++++++++-- dm/DMSrcSink.h | 6 ++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 8c83e41993..b8c1632fb1 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -2104,7 +2104,9 @@ if (skia_enable_tools) { "dm/DM.cpp", "dm/DMGpuTestProcs.cpp", "dm/DMJsonWriter.cpp", + "dm/DMJsonWriter.h", "dm/DMSrcSink.cpp", + "dm/DMSrcSink.h", ] deps = [ ":common_flags_aa", diff --git a/dm/DM.cpp b/dm/DM.cpp index 30b9adbb29..05c752831f 100644 --- a/dm/DM.cpp +++ b/dm/DM.cpp @@ -1032,6 +1032,7 @@ static Sink* create_via(const SkString& tag, Sink* wrapped) { #endif VIA("serialize", ViaSerialization, wrapped); VIA("pic", ViaPicture, wrapped); + VIA("rtblend", ViaRuntimeBlend, wrapped); if (FLAGS_matrix.count() == 4) { SkMatrix m; diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index a2fbce012a..bef4a59e4c 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -30,6 +30,7 @@ #include "include/private/SkTLogic.h" #include "include/third_party/skcms/skcms.h" #include "include/utils/SkNullCanvas.h" +#include "include/utils/SkPaintFilterCanvas.h" #include "include/utils/SkRandom.h" #include "modules/skottie/utils/SkottieUtils.h" #include "src/codec/SkCodecImageGenerator.h" @@ -50,6 +51,7 @@ #include "tools/DDLPromiseImageHelper.h" #include "tools/DDLTileHelper.h" #include "tools/Resources.h" +#include "tools/RuntimeBlendUtils.h" #include "tools/debugger/DebugCanvas.h" #include "tools/gpu/BackendSurfaceFactory.h" #include "tools/gpu/MemoryCache.h" @@ -1560,8 +1562,8 @@ Result GPUSink::onDraw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log, if (FLAGS_preAbandonGpuContext) { factory.abandonContexts(); } - SkCanvas* canvas = surface->getCanvas(); - Result result = src.draw(direct, canvas); + + Result result = src.draw(direct, surface->getCanvas()); if (!result.isOk()) { return result; } @@ -2265,6 +2267,35 @@ Result ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +Result ViaRuntimeBlend::draw(const Src& src, + SkBitmap* bitmap, + SkWStream* stream, + SkString* log) const { + class RuntimeBlendFilterCanvas : public SkPaintFilterCanvas { + public: + RuntimeBlendFilterCanvas(SkCanvas* canvas) : INHERITED(canvas) { } + + protected: + bool onFilter(SkPaint& paint) const override { + if (skstd::optional mode = paint.asBlendMode()) { + paint.setBlender(GetRuntimeBlendForBlendMode(*mode)); + } + return true; + } + + private: + using INHERITED = SkPaintFilterCanvas; + }; + + return draw_to_canvas(fSink.get(), bitmap, stream, log, src.size(), + [&](GrDirectContext* context, SkCanvas* canvas) { + RuntimeBlendFilterCanvas runtimeBlendCanvas{canvas}; + return src.draw(context, &runtimeBlendCanvas); + }); +} + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + #ifdef TEST_VIA_SVG #include "include/svg/SkSVGCanvas.h" #include "modules/svg/include/SkSVGDOM.h" diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index fbdbb6530a..3b85738307 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -625,6 +625,12 @@ public: Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; +class ViaRuntimeBlend : public Via { +public: + explicit ViaRuntimeBlend(Sink* sink) : Via(sink) {} + Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; +}; + class ViaSVG : public Via { public: explicit ViaSVG(Sink* sink) : Via(sink) {}