blob: 364afe0e11b80dc8de2ab58516fbc149dd0cadd4 [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
scroggo9b77ddd2015-03-19 06:03:39 -070084class CodecSrc : public Src {
85public:
86 explicit CodecSrc(Path path);
87
88 Error draw(SkCanvas*) const SK_OVERRIDE;
89 SkISize size() const SK_OVERRIDE;
90 Name name() const SK_OVERRIDE;
91private:
92 Path fPath;
93};
94
95
mtklein748ca3b2015-01-15 10:56:12 -080096class ImageSrc : public Src {
97public:
mtkleinedc93bc2015-01-30 13:22:23 -080098 // divisor == 0 means decode the whole image
99 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
100 explicit ImageSrc(Path path, int divisor = 0);
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;
mtkleinedc93bc2015-01-30 13:22:23 -0800107 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -0800108};
109
110class SKPSrc : public Src {
111public:
mtklein8d17a132015-01-30 11:42:31 -0800112 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -0800113
114 Error draw(SkCanvas*) const SK_OVERRIDE;
115 SkISize size() const SK_OVERRIDE;
116 Name name() const SK_OVERRIDE;
117private:
mtklein8d17a132015-01-30 11:42:31 -0800118 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -0800119};
120
121/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
122
mtkleinad66f9b2015-02-13 15:11:10 -0800123class NullSink : public Sink {
124public:
125 NullSink() {}
126
127 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
128 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
129 const char* fileExtension() const SK_OVERRIDE { return ""; }
130};
131
132
mtklein748ca3b2015-01-15 10:56:12 -0800133class GPUSink : public Sink {
134public:
mtklein82d28432015-01-15 12:46:02 -0800135 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -0800136
mtkleinb9eb4ac2015-02-02 18:26:03 -0800137 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800138 int enclave() const SK_OVERRIDE;
139 const char* fileExtension() const SK_OVERRIDE { return "png"; }
140private:
141 GrContextFactory::GLContextType fContextType;
142 GrGLStandard fGpuAPI;
143 int fSampleCount;
144 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -0800145 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800146};
147
148class PDFSink : public Sink {
149public:
150 PDFSink();
151
mtkleinb9eb4ac2015-02-02 18:26:03 -0800152 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
halcanary792c80f2015-02-20 07:21:05 -0800153 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
mtklein748ca3b2015-01-15 10:56:12 -0800154 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
155};
156
halcanary47ef4d52015-03-03 09:13:09 -0800157class XPSSink : public Sink {
158public:
159 XPSSink();
160
161 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
162 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
163 const char* fileExtension() const SK_OVERRIDE { return "xps"; }
164};
165
mtklein748ca3b2015-01-15 10:56:12 -0800166class RasterSink : public Sink {
167public:
168 explicit RasterSink(SkColorType);
169
mtkleinb9eb4ac2015-02-02 18:26:03 -0800170 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800171 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
172 const char* fileExtension() const SK_OVERRIDE { return "png"; }
173private:
174 SkColorType fColorType;
175};
176
mtklein9c3f17d2015-01-28 11:35:18 -0800177class SKPSink : public Sink {
178public:
179 SKPSink();
180
mtkleinb9eb4ac2015-02-02 18:26:03 -0800181 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein9c3f17d2015-01-28 11:35:18 -0800182 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
183 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
184};
185
mtklein8a4527e2015-01-31 20:00:58 -0800186class SVGSink : public Sink {
187public:
188 SVGSink();
189
mtkleinb9eb4ac2015-02-02 18:26:03 -0800190 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein8a4527e2015-01-31 20:00:58 -0800191 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
192 const char* fileExtension() const SK_OVERRIDE { return "svg"; }
193};
194
195
mtklein748ca3b2015-01-15 10:56:12 -0800196/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
197
198class ViaMatrix : public Sink {
199public:
200 ViaMatrix(SkMatrix, Sink*);
201
mtkleinb9eb4ac2015-02-02 18:26:03 -0800202 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800203 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
mtkleind603b222015-02-17 11:13:33 -0800210class ViaUpright : public Sink {
211public:
212 ViaUpright(SkMatrix, Sink*);
213
214 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
215 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
216 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
217private:
218 SkMatrix fMatrix;
219 SkAutoTDelete<Sink> fSink;
220};
221
mtklein748ca3b2015-01-15 10:56:12 -0800222class ViaPipe : public Sink {
223public:
mtklein7edca212015-01-21 13:18:51 -0800224 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800225
mtkleinb9eb4ac2015-02-02 18:26:03 -0800226 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800227 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
228 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
229private:
mtklein748ca3b2015-01-15 10:56:12 -0800230 SkAutoTDelete<Sink> fSink;
231};
232
233class ViaSerialization : public Sink {
234public:
235 explicit ViaSerialization(Sink*);
236
mtkleinb9eb4ac2015-02-02 18:26:03 -0800237 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800238 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
239 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
240private:
241 SkAutoTDelete<Sink> fSink;
242};
243
244class ViaTiles : public Sink {
245public:
246 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
247
mtkleinb9eb4ac2015-02-02 18:26:03 -0800248 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800249 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
250 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
251private:
252 const int fW, fH;
253 SkAutoTDelete<SkBBHFactory> fFactory;
254 SkAutoTDelete<Sink> fSink;
255};
256
mtklein748ca3b2015-01-15 10:56:12 -0800257} // namespace DM
258
259#endif//DMSrcSink_DEFINED