blob: 48c572b1a7d8e771a0186b395ebb7fc0b9e60c46 [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() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -080036 // You may write to either the bitmap or stream. If you write to log, we'll print that out.
37 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
38 const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080039 // 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:
mtkleinedc93bc2015-01-30 13:22:23 -080064 // divisor == 0 means decode the whole image
65 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
66 explicit ImageSrc(Path path, int divisor = 0);
mtklein748ca3b2015-01-15 10:56:12 -080067
68 Error draw(SkCanvas*) const SK_OVERRIDE;
69 SkISize size() const SK_OVERRIDE;
70 Name name() const SK_OVERRIDE;
71private:
mtklein8d17a132015-01-30 11:42:31 -080072 Path fPath;
mtkleinedc93bc2015-01-30 13:22:23 -080073 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -080074};
75
76class SKPSrc : public Src {
77public:
mtklein8d17a132015-01-30 11:42:31 -080078 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -080079
80 Error draw(SkCanvas*) const SK_OVERRIDE;
81 SkISize size() const SK_OVERRIDE;
82 Name name() const SK_OVERRIDE;
83private:
mtklein8d17a132015-01-30 11:42:31 -080084 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -080085};
86
87/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
88
89class GPUSink : public Sink {
90public:
mtklein82d28432015-01-15 12:46:02 -080091 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -080092
mtkleinb9eb4ac2015-02-02 18:26:03 -080093 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -080094 int enclave() const SK_OVERRIDE;
95 const char* fileExtension() const SK_OVERRIDE { return "png"; }
96private:
97 GrContextFactory::GLContextType fContextType;
98 GrGLStandard fGpuAPI;
99 int fSampleCount;
100 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -0800101 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800102};
103
104class PDFSink : public Sink {
105public:
106 PDFSink();
107
mtkleinb9eb4ac2015-02-02 18:26:03 -0800108 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800109 int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
110 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
111};
112
113class RasterSink : public Sink {
114public:
115 explicit RasterSink(SkColorType);
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 kAnyThread_Enclave; }
119 const char* fileExtension() const SK_OVERRIDE { return "png"; }
120private:
121 SkColorType fColorType;
122};
123
mtklein9c3f17d2015-01-28 11:35:18 -0800124class SKPSink : public Sink {
125public:
126 SKPSink();
127
mtkleinb9eb4ac2015-02-02 18:26:03 -0800128 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein9c3f17d2015-01-28 11:35:18 -0800129 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
130 const char* fileExtension() const SK_OVERRIDE { return "skp"; }
131};
132
mtklein8a4527e2015-01-31 20:00:58 -0800133class SVGSink : public Sink {
134public:
135 SVGSink();
136
mtkleinb9eb4ac2015-02-02 18:26:03 -0800137 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein8a4527e2015-01-31 20:00:58 -0800138 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
139 const char* fileExtension() const SK_OVERRIDE { return "svg"; }
140};
141
142
mtklein748ca3b2015-01-15 10:56:12 -0800143/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
144
145class ViaMatrix : public Sink {
146public:
147 ViaMatrix(SkMatrix, Sink*);
148
mtkleinb9eb4ac2015-02-02 18:26:03 -0800149 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800150 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
151 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
152private:
153 SkMatrix fMatrix;
154 SkAutoTDelete<Sink> fSink;
155};
156
157class ViaPipe : public Sink {
158public:
mtklein7edca212015-01-21 13:18:51 -0800159 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800160
mtkleinb9eb4ac2015-02-02 18:26:03 -0800161 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800162 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
163 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
164private:
mtklein748ca3b2015-01-15 10:56:12 -0800165 SkAutoTDelete<Sink> fSink;
166};
167
168class ViaSerialization : public Sink {
169public:
170 explicit ViaSerialization(Sink*);
171
mtkleinb9eb4ac2015-02-02 18:26:03 -0800172 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800173 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
174 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
175private:
176 SkAutoTDelete<Sink> fSink;
177};
178
179class ViaTiles : public Sink {
180public:
181 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
182
mtkleinb9eb4ac2015-02-02 18:26:03 -0800183 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
mtklein748ca3b2015-01-15 10:56:12 -0800184 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
185 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
186private:
187 const int fW, fH;
188 SkAutoTDelete<SkBBHFactory> fFactory;
189 SkAutoTDelete<Sink> fSink;
190};
191
halcanary022afb82015-01-30 11:00:12 -0800192class NullSink : public Sink {
193public:
mtkleinb9eb4ac2015-02-02 18:26:03 -0800194 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE {
halcanary022afb82015-01-30 11:00:12 -0800195 return src.draw(SkCreateNullCanvas());
196 }
197 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
198 const char* fileExtension() const SK_OVERRIDE { return ""; }
199};
200
mtklein748ca3b2015-01-15 10:56:12 -0800201} // namespace DM
202
203#endif//DMSrcSink_DEFINED