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