blob: 16f7c144eba5f43b7c0ba249244501349848155e [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"
halcanary022afb82015-01-30 11:00:12 -080011#include "SkNullCanvas.h"
mtklein748ca3b2015-01-15 10:56:12 -080012#include "SkPicture.h"
mtklein748ca3b2015-01-15 10:56:12 -080013#include "gm.h"
14
15namespace DM {
16
17// This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...).
18struct ImplicitString : public SkString {
19 template <typename T>
20 ImplicitString(const T& s) : SkString(s) {}
21};
22typedef ImplicitString Error;
23typedef ImplicitString Name;
mtklein8d17a132015-01-30 11:42:31 -080024typedef ImplicitString Path;
mtklein748ca3b2015-01-15 10:56:12 -080025
26struct Src {
27 // All Srcs must be thread safe.
28 virtual ~Src() {}
29 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
30 virtual SkISize size() const = 0;
31 virtual Name name() const = 0;
32};
33
34struct Sink {
35 virtual ~Sink() {}
36 // You may write to either the bitmap or stream.
37 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*) const
38 = 0;
39 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
40 virtual int enclave() const = 0;
41
42 // File extension for the content draw() outputs, e.g. "png", "pdf".
43 virtual const char* fileExtension() const = 0;
44};
45
mtklein55e88b22015-01-21 15:50:13 -080046enum { kAnyThread_Enclave, kGPU_Enclave, kPDFSink_Enclave };
mtklein748ca3b2015-01-15 10:56:12 -080047static const int kNumEnclaves = kPDFSink_Enclave + 1;
48
49/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
50
mtklein748ca3b2015-01-15 10:56:12 -080051class GMSrc : public Src {
52public:
53 explicit GMSrc(skiagm::GMRegistry::Factory);
54
55 Error draw(SkCanvas*) const SK_OVERRIDE;
56 SkISize size() const SK_OVERRIDE;
57 Name name() const SK_OVERRIDE;
58private:
59 skiagm::GMRegistry::Factory fFactory;
60};
61
62class ImageSrc : public Src {
63public:
mtklein8d17a132015-01-30 11:42:31 -080064 explicit ImageSrc(Path path, int subsets = 0);
mtklein748ca3b2015-01-15 10:56:12 -080065
66 Error draw(SkCanvas*) const SK_OVERRIDE;
67 SkISize size() const SK_OVERRIDE;
68 Name name() const SK_OVERRIDE;
69private:
mtklein8d17a132015-01-30 11:42:31 -080070 Path fPath;
71 int fSubsets;
mtklein748ca3b2015-01-15 10:56:12 -080072};
73
74class SKPSrc : public Src {
75public:
mtklein8d17a132015-01-30 11:42:31 -080076 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -080077
78 Error draw(SkCanvas*) const SK_OVERRIDE;
79 SkISize size() const SK_OVERRIDE;
80 Name name() const SK_OVERRIDE;
81private:
mtklein8d17a132015-01-30 11:42:31 -080082 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -080083};
84
85/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
86
87class GPUSink : public Sink {
88public:
mtklein82d28432015-01-15 12:46:02 -080089 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -080090
91 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
92 int enclave() const SK_OVERRIDE;
93 const char* fileExtension() const SK_OVERRIDE { return "png"; }
94private:
95 GrContextFactory::GLContextType fContextType;
96 GrGLStandard fGpuAPI;
97 int fSampleCount;
98 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -080099 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800100};
101
102class PDFSink : public Sink {
103public:
104 PDFSink();
105
106 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
107 int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
108 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
109};
110
111class RasterSink : public Sink {
112public:
113 explicit RasterSink(SkColorType);
114
115 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
116 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
117 const char* fileExtension() const SK_OVERRIDE { return "png"; }
118private:
119 SkColorType fColorType;
120};
121
mtklein9c3f17d2015-01-28 11:35:18 -0800122class SKPSink : public Sink {
123public:
124 SKPSink();
125
126 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
127 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
128 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
129};
130
mtklein748ca3b2015-01-15 10:56:12 -0800131/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
132
133class ViaMatrix : public Sink {
134public:
135 ViaMatrix(SkMatrix, Sink*);
136
137 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
138 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
139 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
140private:
141 SkMatrix fMatrix;
142 SkAutoTDelete<Sink> fSink;
143};
144
145class ViaPipe : public Sink {
146public:
mtklein7edca212015-01-21 13:18:51 -0800147 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800148
149 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
150 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
151 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
152private:
mtklein748ca3b2015-01-15 10:56:12 -0800153 SkAutoTDelete<Sink> fSink;
154};
155
156class ViaSerialization : public Sink {
157public:
158 explicit ViaSerialization(Sink*);
159
160 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
161 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
162 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
163private:
164 SkAutoTDelete<Sink> fSink;
165};
166
167class ViaTiles : public Sink {
168public:
169 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
170
171 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
172 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
173 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
174private:
175 const int fW, fH;
176 SkAutoTDelete<SkBBHFactory> fFactory;
177 SkAutoTDelete<Sink> fSink;
178};
179
halcanary022afb82015-01-30 11:00:12 -0800180class NullSink : public Sink {
181public:
182 Error draw(const Src& src, SkBitmap*, SkWStream* out) const SK_OVERRIDE {
183 return src.draw(SkCreateNullCanvas());
184 }
185 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
186 const char* fileExtension() const SK_OVERRIDE { return ""; }
187};
188
mtklein748ca3b2015-01-15 10:56:12 -0800189} // namespace DM
190
191#endif//DMSrcSink_DEFINED