1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef DMSrcSink_DEFINED 9cb93a386Sopenharmony_ci#define DMSrcSink_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "gm/gm.h" 12cb93a386Sopenharmony_ci#include "include/core/SkBBHFactory.h" 13cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 14cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 15cb93a386Sopenharmony_ci#include "include/core/SkData.h" 16cb93a386Sopenharmony_ci#include "include/core/SkPicture.h" 17cb93a386Sopenharmony_ci#include "src/utils/SkMultiPictureDocument.h" 18cb93a386Sopenharmony_ci#include "tools/flags/CommonFlagsConfig.h" 19cb93a386Sopenharmony_ci#include "tools/gpu/MemoryCache.h" 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci#include <functional> 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci//#define TEST_VIA_SVG 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cinamespace skiagm { 26cb93a386Sopenharmony_cinamespace verifiers { 27cb93a386Sopenharmony_ciclass VerifierList; 28cb93a386Sopenharmony_ci} // namespace verifiers 29cb93a386Sopenharmony_ci} // namespace skiagm 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_cinamespace DM { 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci// This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...). 34cb93a386Sopenharmony_cistruct ImplicitString : public SkString { 35cb93a386Sopenharmony_ci template <typename T> 36cb93a386Sopenharmony_ci ImplicitString(const T& s) : SkString(s) {} 37cb93a386Sopenharmony_ci ImplicitString() : SkString("") {} 38cb93a386Sopenharmony_ci}; 39cb93a386Sopenharmony_citypedef ImplicitString Name; 40cb93a386Sopenharmony_citypedef ImplicitString Path; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ciclass Result { 43cb93a386Sopenharmony_cipublic: 44cb93a386Sopenharmony_ci enum class Status : int { Ok, Fatal, Skip }; 45cb93a386Sopenharmony_ci Result(Status status, const SkString& s) : fMsg(s), fStatus(status) {} 46cb93a386Sopenharmony_ci Result(Status status, const char* s) : fMsg(s), fStatus(status) {} 47cb93a386Sopenharmony_ci template <typename... Args> Result (Status status, const char* s, Args... args) 48cb93a386Sopenharmony_ci : fMsg(SkStringPrintf(s, args...)), fStatus(status) {} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci Result(const Result&) = default; 51cb93a386Sopenharmony_ci Result& operator=(const Result&) = default; 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci static Result Ok() { return Result(Status::Ok, nullptr); } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci static Result Fatal(const SkString& s) { return Result(Status::Fatal, s); } 56cb93a386Sopenharmony_ci static Result Fatal(const char* s) { return Result(Status::Fatal, s); } 57cb93a386Sopenharmony_ci template <typename... Args> static Result Fatal(const char* s, Args... args) { 58cb93a386Sopenharmony_ci return Result(Status::Fatal, s, args...); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci static Result Skip(const SkString& s) { return Result(Status::Skip, s); } 62cb93a386Sopenharmony_ci static Result Skip(const char* s) { return Result(Status::Skip, s); } 63cb93a386Sopenharmony_ci template <typename... Args> static Result Skip(const char* s, Args... args) { 64cb93a386Sopenharmony_ci return Result(Status::Skip, s, args...); 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci bool isOk() { return fStatus == Status::Ok; } 68cb93a386Sopenharmony_ci bool isFatal() { return fStatus == Status::Fatal; } 69cb93a386Sopenharmony_ci bool isSkip() { return fStatus == Status::Skip; } 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci const char* c_str() const { return fMsg.c_str(); } 72cb93a386Sopenharmony_ci Status status() const { return fStatus; } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciprivate: 75cb93a386Sopenharmony_ci SkString fMsg; 76cb93a386Sopenharmony_ci Status fStatus; 77cb93a386Sopenharmony_ci}; 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_cistruct SinkFlags { 80cb93a386Sopenharmony_ci enum Type { kNull, kGPU, kVector, kRaster } type; 81cb93a386Sopenharmony_ci enum Approach { kDirect, kIndirect } approach; 82cb93a386Sopenharmony_ci enum Multisampled { kNotMultisampled, kMultisampled } multisampled; 83cb93a386Sopenharmony_ci SinkFlags(Type t, Approach a, Multisampled ms = kNotMultisampled) 84cb93a386Sopenharmony_ci : type(t), approach(a), multisampled(ms) {} 85cb93a386Sopenharmony_ci}; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_cistruct Src { 88cb93a386Sopenharmony_ci virtual ~Src() {} 89cb93a386Sopenharmony_ci virtual Result SK_WARN_UNUSED_RESULT draw(GrDirectContext* context, SkCanvas* canvas) const = 0; 90cb93a386Sopenharmony_ci virtual SkISize size() const = 0; 91cb93a386Sopenharmony_ci virtual Name name() const = 0; 92cb93a386Sopenharmony_ci virtual void modifyGrContextOptions(GrContextOptions* options) const {} 93cb93a386Sopenharmony_ci virtual bool veto(SinkFlags) const { return false; } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci virtual int pageCount() const { return 1; } 96cb93a386Sopenharmony_ci virtual Result SK_WARN_UNUSED_RESULT draw([[maybe_unused]] int page, GrDirectContext* context, 97cb93a386Sopenharmony_ci SkCanvas* canvas) const { 98cb93a386Sopenharmony_ci return this->draw(context, canvas); 99cb93a386Sopenharmony_ci } 100cb93a386Sopenharmony_ci virtual SkISize size([[maybe_unused]] int page) const { return this->size(); } 101cb93a386Sopenharmony_ci // Force Tasks using this Src to run on the main thread? 102cb93a386Sopenharmony_ci virtual bool serial() const { return false; } 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci /** Return a list of verifiers for the src, or null if no verifiers should be run .*/ 105cb93a386Sopenharmony_ci virtual std::unique_ptr<skiagm::verifiers::VerifierList> getVerifiers() const { 106cb93a386Sopenharmony_ci return nullptr; 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci}; 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_cistruct Sink { 111cb93a386Sopenharmony_ci virtual ~Sink() {} 112cb93a386Sopenharmony_ci // You may write to either the bitmap or stream. If you write to log, we'll print that out. 113cb93a386Sopenharmony_ci virtual Result SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log) 114cb93a386Sopenharmony_ci const = 0; 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci // Override the color space of this Sink, after creation 117cb93a386Sopenharmony_ci virtual void setColorSpace(sk_sp<SkColorSpace>) {} 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci // Force Tasks using this Sink to run on the main thread? 120cb93a386Sopenharmony_ci virtual bool serial() const { return false; } 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci // File extension for the content draw() outputs, e.g. "png", "pdf". 123cb93a386Sopenharmony_ci virtual const char* fileExtension() const = 0; 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci virtual SinkFlags flags() const = 0; 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci /** Returns the color type and space used by the sink. */ 128cb93a386Sopenharmony_ci virtual SkColorInfo colorInfo() const { return SkColorInfo(); } 129cb93a386Sopenharmony_ci}; 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ciclass GMSrc : public Src { 134cb93a386Sopenharmony_cipublic: 135cb93a386Sopenharmony_ci explicit GMSrc(skiagm::GMFactory); 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 138cb93a386Sopenharmony_ci SkISize size() const override; 139cb93a386Sopenharmony_ci Name name() const override; 140cb93a386Sopenharmony_ci void modifyGrContextOptions(GrContextOptions* options) const override; 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci std::unique_ptr<skiagm::verifiers::VerifierList> getVerifiers() const override; 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ciprivate: 145cb93a386Sopenharmony_ci skiagm::GMFactory fFactory; 146cb93a386Sopenharmony_ci}; 147cb93a386Sopenharmony_ci 148cb93a386Sopenharmony_ciclass CodecSrc : public Src { 149cb93a386Sopenharmony_cipublic: 150cb93a386Sopenharmony_ci enum Mode { 151cb93a386Sopenharmony_ci kCodec_Mode, 152cb93a386Sopenharmony_ci // We choose to test only one mode with zero initialized memory. 153cb93a386Sopenharmony_ci // This will exercise all of the interesting cases in SkSwizzler 154cb93a386Sopenharmony_ci // without doubling the size of our test suite. 155cb93a386Sopenharmony_ci kCodecZeroInit_Mode, 156cb93a386Sopenharmony_ci kScanline_Mode, 157cb93a386Sopenharmony_ci kStripe_Mode, // Tests the skipping of scanlines 158cb93a386Sopenharmony_ci kCroppedScanline_Mode, // Tests (jpeg) cropped scanline optimization 159cb93a386Sopenharmony_ci kSubset_Mode, // For codecs that support subsets directly. 160cb93a386Sopenharmony_ci kAnimated_Mode, // For codecs that support animation. 161cb93a386Sopenharmony_ci }; 162cb93a386Sopenharmony_ci enum DstColorType { 163cb93a386Sopenharmony_ci kGetFromCanvas_DstColorType, 164cb93a386Sopenharmony_ci kGrayscale_Always_DstColorType, 165cb93a386Sopenharmony_ci kNonNative8888_Always_DstColorType, 166cb93a386Sopenharmony_ci }; 167cb93a386Sopenharmony_ci CodecSrc(Path, Mode, DstColorType, SkAlphaType, float); 168cb93a386Sopenharmony_ci 169cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 170cb93a386Sopenharmony_ci SkISize size() const override; 171cb93a386Sopenharmony_ci Name name() const override; 172cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 173cb93a386Sopenharmony_ci bool serial() const override { return fRunSerially; } 174cb93a386Sopenharmony_ciprivate: 175cb93a386Sopenharmony_ci Path fPath; 176cb93a386Sopenharmony_ci Mode fMode; 177cb93a386Sopenharmony_ci DstColorType fDstColorType; 178cb93a386Sopenharmony_ci SkAlphaType fDstAlphaType; 179cb93a386Sopenharmony_ci float fScale; 180cb93a386Sopenharmony_ci bool fRunSerially; 181cb93a386Sopenharmony_ci}; 182cb93a386Sopenharmony_ci 183cb93a386Sopenharmony_ciclass AndroidCodecSrc : public Src { 184cb93a386Sopenharmony_cipublic: 185cb93a386Sopenharmony_ci AndroidCodecSrc(Path, CodecSrc::DstColorType, SkAlphaType, int sampleSize); 186cb93a386Sopenharmony_ci 187cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 188cb93a386Sopenharmony_ci SkISize size() const override; 189cb93a386Sopenharmony_ci Name name() const override; 190cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 191cb93a386Sopenharmony_ci bool serial() const override { return fRunSerially; } 192cb93a386Sopenharmony_ciprivate: 193cb93a386Sopenharmony_ci Path fPath; 194cb93a386Sopenharmony_ci CodecSrc::DstColorType fDstColorType; 195cb93a386Sopenharmony_ci SkAlphaType fDstAlphaType; 196cb93a386Sopenharmony_ci int fSampleSize; 197cb93a386Sopenharmony_ci bool fRunSerially; 198cb93a386Sopenharmony_ci}; 199cb93a386Sopenharmony_ci 200cb93a386Sopenharmony_ci#ifdef SK_ENABLE_ANDROID_UTILS 201cb93a386Sopenharmony_ci// Allows for testing of various implementations of Android's BitmapRegionDecoder 202cb93a386Sopenharmony_ciclass BRDSrc : public Src { 203cb93a386Sopenharmony_cipublic: 204cb93a386Sopenharmony_ci enum Mode { 205cb93a386Sopenharmony_ci // Decode the entire image as one region. 206cb93a386Sopenharmony_ci kFullImage_Mode, 207cb93a386Sopenharmony_ci // Splits the image into multiple regions using a divisor and decodes the regions 208cb93a386Sopenharmony_ci // separately. Also, this test adds a border of a few pixels to each of the regions 209cb93a386Sopenharmony_ci // that it is decoding. This tests the behavior when a client asks for a region that 210cb93a386Sopenharmony_ci // does not fully fit in the image. 211cb93a386Sopenharmony_ci kDivisor_Mode, 212cb93a386Sopenharmony_ci }; 213cb93a386Sopenharmony_ci 214cb93a386Sopenharmony_ci BRDSrc(Path, Mode, CodecSrc::DstColorType, uint32_t); 215cb93a386Sopenharmony_ci 216cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 217cb93a386Sopenharmony_ci SkISize size() const override; 218cb93a386Sopenharmony_ci Name name() const override; 219cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 220cb93a386Sopenharmony_ciprivate: 221cb93a386Sopenharmony_ci Path fPath; 222cb93a386Sopenharmony_ci Mode fMode; 223cb93a386Sopenharmony_ci CodecSrc::DstColorType fDstColorType; 224cb93a386Sopenharmony_ci uint32_t fSampleSize; 225cb93a386Sopenharmony_ci}; 226cb93a386Sopenharmony_ci#endif 227cb93a386Sopenharmony_ci 228cb93a386Sopenharmony_ciclass ImageGenSrc : public Src { 229cb93a386Sopenharmony_cipublic: 230cb93a386Sopenharmony_ci enum Mode { 231cb93a386Sopenharmony_ci kCodec_Mode, // Use CodecImageGenerator 232cb93a386Sopenharmony_ci kPlatform_Mode, // Uses CG or WIC 233cb93a386Sopenharmony_ci }; 234cb93a386Sopenharmony_ci ImageGenSrc(Path, Mode, SkAlphaType, bool); 235cb93a386Sopenharmony_ci 236cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 237cb93a386Sopenharmony_ci SkISize size() const override; 238cb93a386Sopenharmony_ci Name name() const override; 239cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 240cb93a386Sopenharmony_ci bool serial() const override { return fRunSerially; } 241cb93a386Sopenharmony_ciprivate: 242cb93a386Sopenharmony_ci Path fPath; 243cb93a386Sopenharmony_ci Mode fMode; 244cb93a386Sopenharmony_ci SkAlphaType fDstAlphaType; 245cb93a386Sopenharmony_ci bool fIsGpu; 246cb93a386Sopenharmony_ci bool fRunSerially; 247cb93a386Sopenharmony_ci}; 248cb93a386Sopenharmony_ci 249cb93a386Sopenharmony_ciclass ColorCodecSrc : public Src { 250cb93a386Sopenharmony_cipublic: 251cb93a386Sopenharmony_ci ColorCodecSrc(Path, bool decode_to_dst); 252cb93a386Sopenharmony_ci 253cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 254cb93a386Sopenharmony_ci SkISize size() const override; 255cb93a386Sopenharmony_ci Name name() const override; 256cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 257cb93a386Sopenharmony_ciprivate: 258cb93a386Sopenharmony_ci Path fPath; 259cb93a386Sopenharmony_ci bool fDecodeToDst; 260cb93a386Sopenharmony_ci}; 261cb93a386Sopenharmony_ci 262cb93a386Sopenharmony_ciclass SKPSrc : public Src { 263cb93a386Sopenharmony_cipublic: 264cb93a386Sopenharmony_ci explicit SKPSrc(Path path); 265cb93a386Sopenharmony_ci 266cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 267cb93a386Sopenharmony_ci SkISize size() const override; 268cb93a386Sopenharmony_ci Name name() const override; 269cb93a386Sopenharmony_ciprivate: 270cb93a386Sopenharmony_ci Path fPath; 271cb93a386Sopenharmony_ci}; 272cb93a386Sopenharmony_ci 273cb93a386Sopenharmony_ci// This class extracts all the paths from an SKP and then removes unwanted paths according to the 274cb93a386Sopenharmony_ci// provided l/r trail. It then just draws the remaining paths. (Non-path draws are thrown out.) It 275cb93a386Sopenharmony_ci// is useful for finding a reduced repo case for path drawing bugs. 276cb93a386Sopenharmony_ciclass BisectSrc : public SKPSrc { 277cb93a386Sopenharmony_cipublic: 278cb93a386Sopenharmony_ci explicit BisectSrc(Path path, const char* trail); 279cb93a386Sopenharmony_ci 280cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 281cb93a386Sopenharmony_ci 282cb93a386Sopenharmony_ciprivate: 283cb93a386Sopenharmony_ci SkString fTrail; 284cb93a386Sopenharmony_ci 285cb93a386Sopenharmony_ci using INHERITED = SKPSrc; 286cb93a386Sopenharmony_ci}; 287cb93a386Sopenharmony_ci 288cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SKOTTIE) 289cb93a386Sopenharmony_ciclass SkottieSrc final : public Src { 290cb93a386Sopenharmony_cipublic: 291cb93a386Sopenharmony_ci explicit SkottieSrc(Path path); 292cb93a386Sopenharmony_ci 293cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 294cb93a386Sopenharmony_ci SkISize size() const override; 295cb93a386Sopenharmony_ci Name name() const override; 296cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 297cb93a386Sopenharmony_ci 298cb93a386Sopenharmony_ciprivate: 299cb93a386Sopenharmony_ci // Generates a kTileCount x kTileCount filmstrip with evenly distributed frames. 300cb93a386Sopenharmony_ci inline static constexpr int kTileCount = 5; 301cb93a386Sopenharmony_ci 302cb93a386Sopenharmony_ci // Fit kTileCount x kTileCount frames to a 1000x1000 film strip. 303cb93a386Sopenharmony_ci inline static constexpr SkScalar kTargetSize = 1000; 304cb93a386Sopenharmony_ci inline static constexpr SkScalar kTileSize = kTargetSize / kTileCount; 305cb93a386Sopenharmony_ci 306cb93a386Sopenharmony_ci Path fPath; 307cb93a386Sopenharmony_ci}; 308cb93a386Sopenharmony_ci#endif 309cb93a386Sopenharmony_ci 310cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SKRIVE) 311cb93a386Sopenharmony_ciclass SkRiveSrc final : public Src { 312cb93a386Sopenharmony_cipublic: 313cb93a386Sopenharmony_ci explicit SkRiveSrc(Path path); 314cb93a386Sopenharmony_ci 315cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 316cb93a386Sopenharmony_ci SkISize size() const override; 317cb93a386Sopenharmony_ci Name name() const override; 318cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 319cb93a386Sopenharmony_ci 320cb93a386Sopenharmony_ciprivate: 321cb93a386Sopenharmony_ci // Generates a kTileCount x kTileCount filmstrip with evenly distributed frames. 322cb93a386Sopenharmony_ci inline static constexpr int kTileCount = 5; 323cb93a386Sopenharmony_ci 324cb93a386Sopenharmony_ci // Fit kTileCount x kTileCount frames to a 1000x1000 film strip. 325cb93a386Sopenharmony_ci inline static constexpr SkScalar kTargetSize = 1000; 326cb93a386Sopenharmony_ci inline static constexpr SkScalar kTileSize = kTargetSize / kTileCount; 327cb93a386Sopenharmony_ci 328cb93a386Sopenharmony_ci const Path fPath; 329cb93a386Sopenharmony_ci}; 330cb93a386Sopenharmony_ci#endif 331cb93a386Sopenharmony_ci 332cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SVG) 333cb93a386Sopenharmony_ci} // namespace DM 334cb93a386Sopenharmony_ci 335cb93a386Sopenharmony_ciclass SkSVGDOM; 336cb93a386Sopenharmony_ci 337cb93a386Sopenharmony_cinamespace DM { 338cb93a386Sopenharmony_ci 339cb93a386Sopenharmony_ciclass SVGSrc : public Src { 340cb93a386Sopenharmony_cipublic: 341cb93a386Sopenharmony_ci explicit SVGSrc(Path path); 342cb93a386Sopenharmony_ci 343cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas*) const override; 344cb93a386Sopenharmony_ci SkISize size() const override; 345cb93a386Sopenharmony_ci Name name() const override; 346cb93a386Sopenharmony_ci bool veto(SinkFlags) const override; 347cb93a386Sopenharmony_ci 348cb93a386Sopenharmony_ciprivate: 349cb93a386Sopenharmony_ci Name fName; 350cb93a386Sopenharmony_ci sk_sp<SkSVGDOM> fDom; 351cb93a386Sopenharmony_ci SkScalar fScale; 352cb93a386Sopenharmony_ci 353cb93a386Sopenharmony_ci using INHERITED = Src; 354cb93a386Sopenharmony_ci}; 355cb93a386Sopenharmony_ci#endif // SK_ENABLE_SVG 356cb93a386Sopenharmony_ci/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 357cb93a386Sopenharmony_ci 358cb93a386Sopenharmony_ciclass MSKPSrc : public Src { 359cb93a386Sopenharmony_cipublic: 360cb93a386Sopenharmony_ci explicit MSKPSrc(Path path); 361cb93a386Sopenharmony_ci 362cb93a386Sopenharmony_ci int pageCount() const override; 363cb93a386Sopenharmony_ci Result draw(GrDirectContext*, SkCanvas* c) const override; 364cb93a386Sopenharmony_ci Result draw(int, GrDirectContext*, SkCanvas*) const override; 365cb93a386Sopenharmony_ci SkISize size() const override; 366cb93a386Sopenharmony_ci SkISize size(int) const override; 367cb93a386Sopenharmony_ci Name name() const override; 368cb93a386Sopenharmony_ci 369cb93a386Sopenharmony_ciprivate: 370cb93a386Sopenharmony_ci Path fPath; 371cb93a386Sopenharmony_ci mutable SkTArray<SkDocumentPage> fPages; 372cb93a386Sopenharmony_ci}; 373cb93a386Sopenharmony_ci 374cb93a386Sopenharmony_ci/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 375cb93a386Sopenharmony_ci 376cb93a386Sopenharmony_ciclass NullSink : public Sink { 377cb93a386Sopenharmony_cipublic: 378cb93a386Sopenharmony_ci NullSink() {} 379cb93a386Sopenharmony_ci 380cb93a386Sopenharmony_ci Result draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override; 381cb93a386Sopenharmony_ci const char* fileExtension() const override { return ""; } 382cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kNull, SinkFlags::kDirect }; } 383cb93a386Sopenharmony_ci}; 384cb93a386Sopenharmony_ci 385cb93a386Sopenharmony_ciclass GPUSink : public Sink { 386cb93a386Sopenharmony_cipublic: 387cb93a386Sopenharmony_ci GPUSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 388cb93a386Sopenharmony_ci 389cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 390cb93a386Sopenharmony_ci Result onDraw(const Src&, SkBitmap*, SkWStream*, SkString*, 391cb93a386Sopenharmony_ci const GrContextOptions& baseOptions, 392cb93a386Sopenharmony_ci std::function<void(GrDirectContext*)> initContext = nullptr) const; 393cb93a386Sopenharmony_ci 394cb93a386Sopenharmony_ci sk_gpu_test::GrContextFactory::ContextType contextType() const { return fContextType; } 395cb93a386Sopenharmony_ci const sk_gpu_test::GrContextFactory::ContextOverrides& contextOverrides() const { 396cb93a386Sopenharmony_ci return fContextOverrides; 397cb93a386Sopenharmony_ci } 398cb93a386Sopenharmony_ci SkCommandLineConfigGpu::SurfType surfType() const { return fSurfType; } 399cb93a386Sopenharmony_ci bool serial() const override { return true; } 400cb93a386Sopenharmony_ci const char* fileExtension() const override { return "png"; } 401cb93a386Sopenharmony_ci SinkFlags flags() const override { 402cb93a386Sopenharmony_ci SinkFlags::Multisampled ms = fSampleCount > 1 ? SinkFlags::kMultisampled 403cb93a386Sopenharmony_ci : SinkFlags::kNotMultisampled; 404cb93a386Sopenharmony_ci return SinkFlags{ SinkFlags::kGPU, SinkFlags::kDirect, ms }; 405cb93a386Sopenharmony_ci } 406cb93a386Sopenharmony_ci const GrContextOptions& baseContextOptions() const { return fBaseContextOptions; } 407cb93a386Sopenharmony_ci void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { fColorSpace = colorSpace; } 408cb93a386Sopenharmony_ci SkColorInfo colorInfo() const override { 409cb93a386Sopenharmony_ci return SkColorInfo(fColorType, fAlphaType, fColorSpace); 410cb93a386Sopenharmony_ci } 411cb93a386Sopenharmony_ci 412cb93a386Sopenharmony_ciprotected: 413cb93a386Sopenharmony_ci sk_sp<SkSurface> createDstSurface(GrDirectContext*, SkISize size) const; 414cb93a386Sopenharmony_ci bool readBack(SkSurface*, SkBitmap* dst) const; 415cb93a386Sopenharmony_ci 416cb93a386Sopenharmony_ciprivate: 417cb93a386Sopenharmony_ci sk_gpu_test::GrContextFactory::ContextType fContextType; 418cb93a386Sopenharmony_ci sk_gpu_test::GrContextFactory::ContextOverrides fContextOverrides; 419cb93a386Sopenharmony_ci SkCommandLineConfigGpu::SurfType fSurfType; 420cb93a386Sopenharmony_ci int fSampleCount; 421cb93a386Sopenharmony_ci uint32_t fSurfaceFlags; 422cb93a386Sopenharmony_ci SkColorType fColorType; 423cb93a386Sopenharmony_ci SkAlphaType fAlphaType; 424cb93a386Sopenharmony_ci sk_sp<SkColorSpace> fColorSpace; 425cb93a386Sopenharmony_ci GrContextOptions fBaseContextOptions; 426cb93a386Sopenharmony_ci sk_gpu_test::MemoryCache fMemoryCache; 427cb93a386Sopenharmony_ci}; 428cb93a386Sopenharmony_ci 429cb93a386Sopenharmony_ciclass GPUThreadTestingSink : public GPUSink { 430cb93a386Sopenharmony_cipublic: 431cb93a386Sopenharmony_ci GPUThreadTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 432cb93a386Sopenharmony_ci 433cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 434cb93a386Sopenharmony_ci 435cb93a386Sopenharmony_ci const char* fileExtension() const override { 436cb93a386Sopenharmony_ci // Suppress writing out results from this config - we just want to do our matching test 437cb93a386Sopenharmony_ci return nullptr; 438cb93a386Sopenharmony_ci } 439cb93a386Sopenharmony_ci 440cb93a386Sopenharmony_ciprivate: 441cb93a386Sopenharmony_ci std::unique_ptr<SkExecutor> fExecutor; 442cb93a386Sopenharmony_ci 443cb93a386Sopenharmony_ci using INHERITED = GPUSink; 444cb93a386Sopenharmony_ci}; 445cb93a386Sopenharmony_ci 446cb93a386Sopenharmony_ciclass GPUPersistentCacheTestingSink : public GPUSink { 447cb93a386Sopenharmony_cipublic: 448cb93a386Sopenharmony_ci GPUPersistentCacheTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 449cb93a386Sopenharmony_ci 450cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 451cb93a386Sopenharmony_ci 452cb93a386Sopenharmony_ci const char* fileExtension() const override { 453cb93a386Sopenharmony_ci // Suppress writing out results from this config - we just want to do our matching test 454cb93a386Sopenharmony_ci return nullptr; 455cb93a386Sopenharmony_ci } 456cb93a386Sopenharmony_ci 457cb93a386Sopenharmony_ciprivate: 458cb93a386Sopenharmony_ci int fCacheType; 459cb93a386Sopenharmony_ci 460cb93a386Sopenharmony_ci using INHERITED = GPUSink; 461cb93a386Sopenharmony_ci}; 462cb93a386Sopenharmony_ci 463cb93a386Sopenharmony_ciclass GPUPrecompileTestingSink : public GPUSink { 464cb93a386Sopenharmony_cipublic: 465cb93a386Sopenharmony_ci GPUPrecompileTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 466cb93a386Sopenharmony_ci 467cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 468cb93a386Sopenharmony_ci 469cb93a386Sopenharmony_ci const char* fileExtension() const override { 470cb93a386Sopenharmony_ci // Suppress writing out results from this config - we just want to do our matching test 471cb93a386Sopenharmony_ci return nullptr; 472cb93a386Sopenharmony_ci } 473cb93a386Sopenharmony_ci 474cb93a386Sopenharmony_ciprivate: 475cb93a386Sopenharmony_ci using INHERITED = GPUSink; 476cb93a386Sopenharmony_ci}; 477cb93a386Sopenharmony_ci 478cb93a386Sopenharmony_ci// This sink attempts to emulate Chrome's OOP-R behavior. It: 479cb93a386Sopenharmony_ci// doesn't use promise images 480cb93a386Sopenharmony_ci// uses only a single thread for both DDL creation & drawing 481cb93a386Sopenharmony_ciclass GPUOOPRSink : public GPUSink { 482cb93a386Sopenharmony_cipublic: 483cb93a386Sopenharmony_ci GPUOOPRSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 484cb93a386Sopenharmony_ci 485cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 486cb93a386Sopenharmony_ci 487cb93a386Sopenharmony_ciprivate: 488cb93a386Sopenharmony_ci Result ooprDraw(const Src&, sk_sp<SkSurface> dstSurface, GrDirectContext*) const; 489cb93a386Sopenharmony_ci 490cb93a386Sopenharmony_ci using INHERITED = GPUSink; 491cb93a386Sopenharmony_ci}; 492cb93a386Sopenharmony_ci 493cb93a386Sopenharmony_ci// This sink attempts to better simulate the Chrome DDL use-case. It: 494cb93a386Sopenharmony_ci// creates the DDLs on separate recording threads 495cb93a386Sopenharmony_ci// performs all the GPU work on a separate GPU thread 496cb93a386Sopenharmony_ci// In the future this should be expanded to: 497cb93a386Sopenharmony_ci// upload on a utility thread w/ access to a shared context 498cb93a386Sopenharmony_ci// compile the programs on the utility thread 499cb93a386Sopenharmony_ci// perform fine grained scheduling of gpu tasks based on their image and program prerequisites 500cb93a386Sopenharmony_ci// create a single "compositing" DDL that is replayed last 501cb93a386Sopenharmony_ciclass GPUDDLSink : public GPUSink { 502cb93a386Sopenharmony_cipublic: 503cb93a386Sopenharmony_ci GPUDDLSink(const SkCommandLineConfigGpu*, const GrContextOptions&); 504cb93a386Sopenharmony_ci 505cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 506cb93a386Sopenharmony_ci 507cb93a386Sopenharmony_ciprivate: 508cb93a386Sopenharmony_ci Result ddlDraw(const Src&, 509cb93a386Sopenharmony_ci sk_sp<SkSurface> dstSurface, 510cb93a386Sopenharmony_ci SkTaskGroup* recordingTaskGroup, 511cb93a386Sopenharmony_ci SkTaskGroup* gpuTaskGroup, 512cb93a386Sopenharmony_ci sk_gpu_test::TestContext* gpuTestCtx, 513cb93a386Sopenharmony_ci GrDirectContext* gpuThreadCtx) const; 514cb93a386Sopenharmony_ci 515cb93a386Sopenharmony_ci std::unique_ptr<SkExecutor> fRecordingExecutor; 516cb93a386Sopenharmony_ci std::unique_ptr<SkExecutor> fGPUExecutor; 517cb93a386Sopenharmony_ci 518cb93a386Sopenharmony_ci using INHERITED = GPUSink; 519cb93a386Sopenharmony_ci}; 520cb93a386Sopenharmony_ci 521cb93a386Sopenharmony_ciclass PDFSink : public Sink { 522cb93a386Sopenharmony_cipublic: 523cb93a386Sopenharmony_ci PDFSink(bool pdfa, SkScalar rasterDpi) : fPDFA(pdfa), fRasterDpi(rasterDpi) {} 524cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 525cb93a386Sopenharmony_ci const char* fileExtension() const override { return "pdf"; } 526cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 527cb93a386Sopenharmony_ci bool fPDFA; 528cb93a386Sopenharmony_ci SkScalar fRasterDpi; 529cb93a386Sopenharmony_ci}; 530cb93a386Sopenharmony_ci 531cb93a386Sopenharmony_ciclass XPSSink : public Sink { 532cb93a386Sopenharmony_cipublic: 533cb93a386Sopenharmony_ci XPSSink(); 534cb93a386Sopenharmony_ci 535cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 536cb93a386Sopenharmony_ci const char* fileExtension() const override { return "xps"; } 537cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 538cb93a386Sopenharmony_ci}; 539cb93a386Sopenharmony_ci 540cb93a386Sopenharmony_ciclass RasterSink : public Sink { 541cb93a386Sopenharmony_cipublic: 542cb93a386Sopenharmony_ci explicit RasterSink(SkColorType); 543cb93a386Sopenharmony_ci 544cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 545cb93a386Sopenharmony_ci const char* fileExtension() const override { return "png"; } 546cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kRaster, SinkFlags::kDirect }; } 547cb93a386Sopenharmony_ci void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { fColorSpace = colorSpace; } 548cb93a386Sopenharmony_ci 549cb93a386Sopenharmony_ciprivate: 550cb93a386Sopenharmony_ci SkColorType fColorType; 551cb93a386Sopenharmony_ci sk_sp<SkColorSpace> fColorSpace; 552cb93a386Sopenharmony_ci}; 553cb93a386Sopenharmony_ci 554cb93a386Sopenharmony_ciclass SKPSink : public Sink { 555cb93a386Sopenharmony_cipublic: 556cb93a386Sopenharmony_ci SKPSink(); 557cb93a386Sopenharmony_ci 558cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 559cb93a386Sopenharmony_ci const char* fileExtension() const override { return "skp"; } 560cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 561cb93a386Sopenharmony_ci}; 562cb93a386Sopenharmony_ci 563cb93a386Sopenharmony_ciclass DebugSink : public Sink { 564cb93a386Sopenharmony_cipublic: 565cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 566cb93a386Sopenharmony_ci const char* fileExtension() const override { return "json"; } 567cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 568cb93a386Sopenharmony_ci}; 569cb93a386Sopenharmony_ci 570cb93a386Sopenharmony_ciclass SVGSink : public Sink { 571cb93a386Sopenharmony_cipublic: 572cb93a386Sopenharmony_ci SVGSink(int pageIndex = 0); 573cb93a386Sopenharmony_ci 574cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 575cb93a386Sopenharmony_ci const char* fileExtension() const override { return "svg"; } 576cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } 577cb93a386Sopenharmony_ci 578cb93a386Sopenharmony_ciprivate: 579cb93a386Sopenharmony_ci int fPageIndex; 580cb93a386Sopenharmony_ci}; 581cb93a386Sopenharmony_ci 582cb93a386Sopenharmony_ci#ifdef SK_GRAPHITE_ENABLED 583cb93a386Sopenharmony_ci 584cb93a386Sopenharmony_ciclass GraphiteSink : public Sink { 585cb93a386Sopenharmony_cipublic: 586cb93a386Sopenharmony_ci using ContextType = skiatest::graphite::ContextFactory::ContextType; 587cb93a386Sopenharmony_ci 588cb93a386Sopenharmony_ci GraphiteSink(const SkCommandLineConfigGraphite*); 589cb93a386Sopenharmony_ci 590cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 591cb93a386Sopenharmony_ci const char* fileExtension() const override { return "png"; } 592cb93a386Sopenharmony_ci SinkFlags flags() const override { return SinkFlags{ SinkFlags::kGPU, SinkFlags::kDirect }; } 593cb93a386Sopenharmony_ci 594cb93a386Sopenharmony_ciprivate: 595cb93a386Sopenharmony_ci ContextType fContextType; 596cb93a386Sopenharmony_ci SkColorType fColorType; 597cb93a386Sopenharmony_ci SkAlphaType fAlphaType; 598cb93a386Sopenharmony_ci bool fTestPrecompile; 599cb93a386Sopenharmony_ci}; 600cb93a386Sopenharmony_ci 601cb93a386Sopenharmony_ci#endif 602cb93a386Sopenharmony_ci 603cb93a386Sopenharmony_ci/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 604cb93a386Sopenharmony_ci 605cb93a386Sopenharmony_ciclass Via : public Sink { 606cb93a386Sopenharmony_cipublic: 607cb93a386Sopenharmony_ci explicit Via(Sink* sink) : fSink(sink) {} 608cb93a386Sopenharmony_ci const char* fileExtension() const override { return fSink->fileExtension(); } 609cb93a386Sopenharmony_ci bool serial() const override { return fSink->serial(); } 610cb93a386Sopenharmony_ci SinkFlags flags() const override { 611cb93a386Sopenharmony_ci SinkFlags flags = fSink->flags(); 612cb93a386Sopenharmony_ci flags.approach = SinkFlags::kIndirect; 613cb93a386Sopenharmony_ci return flags; 614cb93a386Sopenharmony_ci } 615cb93a386Sopenharmony_ci void setColorSpace(sk_sp<SkColorSpace> colorSpace) override { 616cb93a386Sopenharmony_ci fSink->setColorSpace(colorSpace); 617cb93a386Sopenharmony_ci } 618cb93a386Sopenharmony_ciprotected: 619cb93a386Sopenharmony_ci std::unique_ptr<Sink> fSink; 620cb93a386Sopenharmony_ci}; 621cb93a386Sopenharmony_ci 622cb93a386Sopenharmony_ciclass ViaMatrix : public Via { 623cb93a386Sopenharmony_cipublic: 624cb93a386Sopenharmony_ci ViaMatrix(SkMatrix, Sink*); 625cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 626cb93a386Sopenharmony_ciprivate: 627cb93a386Sopenharmony_ci const SkMatrix fMatrix; 628cb93a386Sopenharmony_ci}; 629cb93a386Sopenharmony_ci 630cb93a386Sopenharmony_ciclass ViaUpright : public Via { 631cb93a386Sopenharmony_cipublic: 632cb93a386Sopenharmony_ci ViaUpright(SkMatrix, Sink*); 633cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 634cb93a386Sopenharmony_ciprivate: 635cb93a386Sopenharmony_ci const SkMatrix fMatrix; 636cb93a386Sopenharmony_ci}; 637cb93a386Sopenharmony_ci 638cb93a386Sopenharmony_ciclass ViaSerialization : public Via { 639cb93a386Sopenharmony_cipublic: 640cb93a386Sopenharmony_ci explicit ViaSerialization(Sink* sink) : Via(sink) {} 641cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 642cb93a386Sopenharmony_ci}; 643cb93a386Sopenharmony_ci 644cb93a386Sopenharmony_ciclass ViaPicture : public Via { 645cb93a386Sopenharmony_cipublic: 646cb93a386Sopenharmony_ci explicit ViaPicture(Sink* sink) : Via(sink) {} 647cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 648cb93a386Sopenharmony_ci}; 649cb93a386Sopenharmony_ci 650cb93a386Sopenharmony_ciclass ViaRuntimeBlend : public Via { 651cb93a386Sopenharmony_cipublic: 652cb93a386Sopenharmony_ci explicit ViaRuntimeBlend(Sink* sink) : Via(sink) {} 653cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 654cb93a386Sopenharmony_ci}; 655cb93a386Sopenharmony_ci 656cb93a386Sopenharmony_ciclass ViaSVG : public Via { 657cb93a386Sopenharmony_cipublic: 658cb93a386Sopenharmony_ci explicit ViaSVG(Sink* sink) : Via(sink) {} 659cb93a386Sopenharmony_ci Result draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; 660cb93a386Sopenharmony_ci}; 661cb93a386Sopenharmony_ci 662cb93a386Sopenharmony_ci} // namespace DM 663cb93a386Sopenharmony_ci 664cb93a386Sopenharmony_ci#endif//DMSrcSink_DEFINED 665