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