blob: e163a24253f88e4ed58b2ca956588b0b16c96c24 [file] [log] [blame]
mtklein748ca3b2015-01-15 10:56:12 -08001#ifndef DMSrcSink_DEFINED
2#define DMSrcSink_DEFINED
3
4#include "DMGpuSupport.h"
5#include "SkBBHFactory.h"
6#include "SkBBoxHierarchy.h"
7#include "SkBitmap.h"
8#include "SkCanvas.h"
9#include "SkData.h"
10#include "SkGPipe.h"
11#include "SkPicture.h"
mtklein748ca3b2015-01-15 10:56:12 -080012#include "gm.h"
13
14namespace DM {
15
16// This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...).
17struct ImplicitString : public SkString {
18 template <typename T>
19 ImplicitString(const T& s) : SkString(s) {}
20};
21typedef ImplicitString Error;
22typedef ImplicitString Name;
23
24struct Src {
25 // All Srcs must be thread safe.
26 virtual ~Src() {}
27 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
28 virtual SkISize size() const = 0;
29 virtual Name name() const = 0;
30};
31
32struct Sink {
33 virtual ~Sink() {}
34 // You may write to either the bitmap or stream.
35 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*) const
36 = 0;
37 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
38 virtual int enclave() const = 0;
39
40 // File extension for the content draw() outputs, e.g. "png", "pdf".
41 virtual const char* fileExtension() const = 0;
42};
43
mtklein55e88b22015-01-21 15:50:13 -080044enum { kAnyThread_Enclave, kGPU_Enclave, kPDFSink_Enclave };
mtklein748ca3b2015-01-15 10:56:12 -080045static const int kNumEnclaves = kPDFSink_Enclave + 1;
46
47/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
48
mtklein748ca3b2015-01-15 10:56:12 -080049class GMSrc : public Src {
50public:
51 explicit GMSrc(skiagm::GMRegistry::Factory);
52
53 Error draw(SkCanvas*) const SK_OVERRIDE;
54 SkISize size() const SK_OVERRIDE;
55 Name name() const SK_OVERRIDE;
56private:
57 skiagm::GMRegistry::Factory fFactory;
58};
59
60class ImageSrc : public Src {
61public:
62 explicit ImageSrc(SkString path, int subsets = 0);
63
64 Error draw(SkCanvas*) const SK_OVERRIDE;
65 SkISize size() const SK_OVERRIDE;
66 Name name() const SK_OVERRIDE;
67private:
68 SkString fPath;
69 int fSubsets;
mtklein748ca3b2015-01-15 10:56:12 -080070};
71
72class SKPSrc : public Src {
73public:
74 explicit SKPSrc(SkString path);
75
76 Error draw(SkCanvas*) const SK_OVERRIDE;
77 SkISize size() const SK_OVERRIDE;
78 Name name() const SK_OVERRIDE;
79private:
80 SkString fPath;
mtklein748ca3b2015-01-15 10:56:12 -080081};
82
83/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
84
85class GPUSink : public Sink {
86public:
mtklein82d28432015-01-15 12:46:02 -080087 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -080088
89 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
90 int enclave() const SK_OVERRIDE;
91 const char* fileExtension() const SK_OVERRIDE { return "png"; }
92private:
93 GrContextFactory::GLContextType fContextType;
94 GrGLStandard fGpuAPI;
95 int fSampleCount;
96 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -080097 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -080098};
99
100class PDFSink : public Sink {
101public:
102 PDFSink();
103
104 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
105 int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
106 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
107};
108
109class RasterSink : public Sink {
110public:
111 explicit RasterSink(SkColorType);
112
113 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
114 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
115 const char* fileExtension() const SK_OVERRIDE { return "png"; }
116private:
117 SkColorType fColorType;
118};
119
mtklein9c3f17d2015-01-28 11:35:18 -0800120class SKPSink : public Sink {
121public:
122 SKPSink();
123
124 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
125 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
126 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
127};
128
mtklein748ca3b2015-01-15 10:56:12 -0800129/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
130
131class ViaMatrix : public Sink {
132public:
133 ViaMatrix(SkMatrix, Sink*);
134
135 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
136 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
137 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
138private:
139 SkMatrix fMatrix;
140 SkAutoTDelete<Sink> fSink;
141};
142
143class ViaPipe : public Sink {
144public:
mtklein7edca212015-01-21 13:18:51 -0800145 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800146
147 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
148 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
149 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
150private:
mtklein748ca3b2015-01-15 10:56:12 -0800151 SkAutoTDelete<Sink> fSink;
152};
153
154class ViaSerialization : public Sink {
155public:
156 explicit ViaSerialization(Sink*);
157
158 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
159 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
160 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
161private:
162 SkAutoTDelete<Sink> fSink;
163};
164
165class ViaTiles : public Sink {
166public:
167 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
168
169 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
170 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
171 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
172private:
173 const int fW, fH;
174 SkAutoTDelete<SkBBHFactory> fFactory;
175 SkAutoTDelete<Sink> fSink;
176};
177
178} // namespace DM
179
180#endif//DMSrcSink_DEFINED