blob: dcd169e32283977beabfb2655a821374370be0e8 [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};
mtklein748ca3b2015-01-15 10:56:12 -080021typedef ImplicitString Name;
mtklein8d17a132015-01-30 11:42:31 -080022typedef ImplicitString Path;
mtklein748ca3b2015-01-15 10:56:12 -080023
mtklein4089ef72015-03-05 08:40:28 -080024class Error {
25public:
26 Error(const SkString& s) : fMsg(s), fFatal(!this->isEmpty()) {}
27 Error(const char* s) : fMsg(s), fFatal(!this->isEmpty()) {}
28
29 Error(const Error&) = default;
30 Error& operator=(const Error&) = default;
31
32 static Error Nonfatal(const SkString& s) { return Nonfatal(s.c_str()); }
33 static Error Nonfatal(const char* s) {
34 Error e(s);
35 e.fFatal = false;
36 return e;
37 }
38
39 const char* c_str() const { return fMsg.c_str(); }
40 bool isEmpty() const { return fMsg.isEmpty(); }
41 bool isFatal() const { return fFatal; }
42
43private:
44 SkString fMsg;
45 bool fFatal;
46};
47
mtklein748ca3b2015-01-15 10:56:12 -080048struct Src {
49 // All Srcs must be thread safe.
50 virtual ~Src() {}
51 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
52 virtual SkISize size() const = 0;
53 virtual Name name() const = 0;
54};
55
56struct Sink {
57 virtual ~Sink() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -080058 // You may write to either the bitmap or stream. If you write to log, we'll print that out.
59 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
60 const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080061 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
62 virtual int enclave() const = 0;
63
64 // File extension for the content draw() outputs, e.g. "png", "pdf".
65 virtual const char* fileExtension() const = 0;
66};
67
halcanary792c80f2015-02-20 07:21:05 -080068enum { kAnyThread_Enclave, kGPU_Enclave };
69static const int kNumEnclaves = kGPU_Enclave + 1;
mtklein748ca3b2015-01-15 10:56:12 -080070
71/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
72
mtklein748ca3b2015-01-15 10:56:12 -080073class GMSrc : public Src {
74public:
75 explicit GMSrc(skiagm::GMRegistry::Factory);
76
77 Error draw(SkCanvas*) const SK_OVERRIDE;
78 SkISize size() const SK_OVERRIDE;
79 Name name() const SK_OVERRIDE;
80private:
81 skiagm::GMRegistry::Factory fFactory;
82};
83
84class ImageSrc : public Src {
85public:
mtkleinedc93bc2015-01-30 13:22:23 -080086 // divisor == 0 means decode the whole image
87 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
88 explicit ImageSrc(Path path, int divisor = 0);
mtklein748ca3b2015-01-15 10:56:12 -080089
90 Error draw(SkCanvas*) const SK_OVERRIDE;
91 SkISize size() const SK_OVERRIDE;
92 Name name() const SK_OVERRIDE;
93private:
mtklein8d17a132015-01-30 11:42:31 -080094 Path fPath;
mtkleinedc93bc2015-01-30 13:22:23 -080095 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -080096};
97
98class SKPSrc : public Src {
99public:
mtklein8d17a132015-01-30 11:42:31 -0800100 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -0800101
102 Error draw(SkCanvas*) const SK_OVERRIDE;
103 SkISize size() const SK_OVERRIDE;
104 Name name() const SK_OVERRIDE;
105private:
mtklein8d17a132015-01-30 11:42:31 -0800106 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -0800107};
108
109/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
110
mtkleinad66f9b2015-02-13 15:11:10 -0800111class NullSink : public Sink {
112public:
113 NullSink() {}
114
115 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
116 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
117 const char* fileExtension() const SK_OVERRIDE { return ""; }
118};
119
120
mtklein748ca3b2015-01-15 10:56:12 -0800121class GPUSink : public Sink {
122public:
mtklein82d28432015-01-15 12:46:02 -0800123 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -0800124
mtkleinb9eb4ac2015-02-02 18:26:03 -0800125 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800126 int enclave() const SK_OVERRIDE;
127 const char* fileExtension() const SK_OVERRIDE { return "png"; }
128private:
129 GrContextFactory::GLContextType fContextType;
130 GrGLStandard fGpuAPI;
131 int fSampleCount;
132 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -0800133 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800134};
135
136class PDFSink : public Sink {
137public:
138 PDFSink();
139
mtkleinb9eb4ac2015-02-02 18:26:03 -0800140 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
halcanary792c80f2015-02-20 07:21:05 -0800141 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
mtklein748ca3b2015-01-15 10:56:12 -0800142 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
143};
144
halcanary47ef4d52015-03-03 09:13:09 -0800145class XPSSink : public Sink {
146public:
147 XPSSink();
148
149 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
150 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
151 const char* fileExtension() const SK_OVERRIDE { return "xps"; }
152};
153
mtklein748ca3b2015-01-15 10:56:12 -0800154class RasterSink : public Sink {
155public:
156 explicit RasterSink(SkColorType);
157
mtkleinb9eb4ac2015-02-02 18:26:03 -0800158 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800159 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
160 const char* fileExtension() const SK_OVERRIDE { return "png"; }
161private:
162 SkColorType fColorType;
163};
164
mtklein9c3f17d2015-01-28 11:35:18 -0800165class SKPSink : public Sink {
166public:
167 SKPSink();
168
mtkleinb9eb4ac2015-02-02 18:26:03 -0800169 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein9c3f17d2015-01-28 11:35:18 -0800170 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
171 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
172};
173
mtklein8a4527e2015-01-31 20:00:58 -0800174class SVGSink : public Sink {
175public:
176 SVGSink();
177
mtkleinb9eb4ac2015-02-02 18:26:03 -0800178 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein8a4527e2015-01-31 20:00:58 -0800179 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
180 const char* fileExtension() const SK_OVERRIDE { return "svg"; }
181};
182
183
mtklein748ca3b2015-01-15 10:56:12 -0800184/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
185
186class ViaMatrix : public Sink {
187public:
188 ViaMatrix(SkMatrix, Sink*);
189
mtkleinb9eb4ac2015-02-02 18:26:03 -0800190 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800191 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
192 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
193private:
194 SkMatrix fMatrix;
195 SkAutoTDelete<Sink> fSink;
196};
197
mtkleind603b222015-02-17 11:13:33 -0800198class ViaUpright : public Sink {
199public:
200 ViaUpright(SkMatrix, Sink*);
201
202 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
203 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
204 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
205private:
206 SkMatrix fMatrix;
207 SkAutoTDelete<Sink> fSink;
208};
209
mtklein748ca3b2015-01-15 10:56:12 -0800210class ViaPipe : public Sink {
211public:
mtklein7edca212015-01-21 13:18:51 -0800212 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800213
mtkleinb9eb4ac2015-02-02 18:26:03 -0800214 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800215 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
216 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
217private:
mtklein748ca3b2015-01-15 10:56:12 -0800218 SkAutoTDelete<Sink> fSink;
219};
220
221class ViaSerialization : public Sink {
222public:
223 explicit ViaSerialization(Sink*);
224
mtkleinb9eb4ac2015-02-02 18:26:03 -0800225 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800226 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
227 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
228private:
229 SkAutoTDelete<Sink> fSink;
230};
231
232class ViaTiles : public Sink {
233public:
234 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
235
mtkleinb9eb4ac2015-02-02 18:26:03 -0800236 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800237 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
238 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
239private:
240 const int fW, fH;
241 SkAutoTDelete<SkBBHFactory> fFactory;
242 SkAutoTDelete<Sink> fSink;
243};
244
mtklein748ca3b2015-01-15 10:56:12 -0800245} // namespace DM
246
247#endif//DMSrcSink_DEFINED