blob: abf3ef8a2f256fa020d916a37e39be83875cfd7c [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;
mtklein8d17a132015-01-30 11:42:31 -080023typedef ImplicitString Path;
mtklein748ca3b2015-01-15 10:56:12 -080024
25struct Src {
26 // All Srcs must be thread safe.
27 virtual ~Src() {}
28 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
29 virtual SkISize size() const = 0;
30 virtual Name name() const = 0;
31};
32
33struct Sink {
34 virtual ~Sink() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -080035 // You may write to either the bitmap or stream. If you write to log, we'll print that out.
36 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
37 const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080038 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
39 virtual int enclave() const = 0;
40
41 // File extension for the content draw() outputs, e.g. "png", "pdf".
42 virtual const char* fileExtension() const = 0;
43};
44
mtklein55e88b22015-01-21 15:50:13 -080045enum { kAnyThread_Enclave, kGPU_Enclave, kPDFSink_Enclave };
mtklein748ca3b2015-01-15 10:56:12 -080046static const int kNumEnclaves = kPDFSink_Enclave + 1;
47
48/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
49
mtklein748ca3b2015-01-15 10:56:12 -080050class GMSrc : public Src {
51public:
52 explicit GMSrc(skiagm::GMRegistry::Factory);
53
54 Error draw(SkCanvas*) const SK_OVERRIDE;
55 SkISize size() const SK_OVERRIDE;
56 Name name() const SK_OVERRIDE;
57private:
58 skiagm::GMRegistry::Factory fFactory;
59};
60
61class ImageSrc : public Src {
62public:
mtkleinedc93bc2015-01-30 13:22:23 -080063 // divisor == 0 means decode the whole image
64 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
65 explicit ImageSrc(Path path, int divisor = 0);
mtklein748ca3b2015-01-15 10:56:12 -080066
67 Error draw(SkCanvas*) const SK_OVERRIDE;
68 SkISize size() const SK_OVERRIDE;
69 Name name() const SK_OVERRIDE;
70private:
mtklein8d17a132015-01-30 11:42:31 -080071 Path fPath;
mtkleinedc93bc2015-01-30 13:22:23 -080072 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -080073};
74
75class SKPSrc : public Src {
76public:
mtklein8d17a132015-01-30 11:42:31 -080077 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -080078
79 Error draw(SkCanvas*) const SK_OVERRIDE;
80 SkISize size() const SK_OVERRIDE;
81 Name name() const SK_OVERRIDE;
82private:
mtklein8d17a132015-01-30 11:42:31 -080083 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -080084};
85
86/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
87
mtkleinad66f9b2015-02-13 15:11:10 -080088class NullSink : public Sink {
89public:
90 NullSink() {}
91
92 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
93 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
94 const char* fileExtension() const SK_OVERRIDE { return ""; }
95};
96
97
mtklein748ca3b2015-01-15 10:56:12 -080098class GPUSink : public Sink {
99public:
mtklein82d28432015-01-15 12:46:02 -0800100 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -0800101
mtkleinb9eb4ac2015-02-02 18:26:03 -0800102 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800103 int enclave() const SK_OVERRIDE;
104 const char* fileExtension() const SK_OVERRIDE { return "png"; }
105private:
106 GrContextFactory::GLContextType fContextType;
107 GrGLStandard fGpuAPI;
108 int fSampleCount;
109 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -0800110 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800111};
112
113class PDFSink : public Sink {
114public:
115 PDFSink();
116
mtkleinb9eb4ac2015-02-02 18:26:03 -0800117 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800118 int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
119 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
120};
121
122class RasterSink : public Sink {
123public:
124 explicit RasterSink(SkColorType);
125
mtkleinb9eb4ac2015-02-02 18:26:03 -0800126 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800127 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
128 const char* fileExtension() const SK_OVERRIDE { return "png"; }
129private:
130 SkColorType fColorType;
131};
132
mtklein9c3f17d2015-01-28 11:35:18 -0800133class SKPSink : public Sink {
134public:
135 SKPSink();
136
mtkleinb9eb4ac2015-02-02 18:26:03 -0800137 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein9c3f17d2015-01-28 11:35:18 -0800138 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
139 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
140};
141
mtklein8a4527e2015-01-31 20:00:58 -0800142class SVGSink : public Sink {
143public:
144 SVGSink();
145
mtkleinb9eb4ac2015-02-02 18:26:03 -0800146 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein8a4527e2015-01-31 20:00:58 -0800147 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
148 const char* fileExtension() const SK_OVERRIDE { return "svg"; }
149};
150
151
mtklein748ca3b2015-01-15 10:56:12 -0800152/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
153
154class ViaMatrix : public Sink {
155public:
156 ViaMatrix(SkMatrix, Sink*);
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 fSink->enclave(); }
160 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
161private:
162 SkMatrix fMatrix;
163 SkAutoTDelete<Sink> fSink;
164};
165
mtkleind603b222015-02-17 11:13:33 -0800166class ViaUpright : public Sink {
167public:
168 ViaUpright(SkMatrix, Sink*);
169
170 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
171 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
172 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
173private:
174 SkMatrix fMatrix;
175 SkAutoTDelete<Sink> fSink;
176};
177
mtklein748ca3b2015-01-15 10:56:12 -0800178class ViaPipe : public Sink {
179public:
mtklein7edca212015-01-21 13:18:51 -0800180 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800181
mtkleinb9eb4ac2015-02-02 18:26:03 -0800182 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800183 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
184 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
185private:
mtklein748ca3b2015-01-15 10:56:12 -0800186 SkAutoTDelete<Sink> fSink;
187};
188
189class ViaSerialization : public Sink {
190public:
191 explicit ViaSerialization(Sink*);
192
mtkleinb9eb4ac2015-02-02 18:26:03 -0800193 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800194 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
195 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
196private:
197 SkAutoTDelete<Sink> fSink;
198};
199
200class ViaTiles : public Sink {
201public:
202 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
203
mtkleinb9eb4ac2015-02-02 18:26:03 -0800204 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800205 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
206 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
207private:
208 const int fW, fH;
209 SkAutoTDelete<SkBBHFactory> fFactory;
210 SkAutoTDelete<Sink> fSink;
211};
212
mtklein748ca3b2015-01-15 10:56:12 -0800213} // namespace DM
214
215#endif//DMSrcSink_DEFINED