blob: 31c31308ecc05d3f7ac4764e4b92da7fc9fef00f [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;
23
24struct Src {
25 // All Srcs must be thread safe.
26 virtual ~Src() {}
27 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
28 virtual SkISize size() const = 0;
29 virtual Name name() const = 0;
30};
31
32struct Sink {
33 virtual ~Sink() {}
34 // You may write to either the bitmap or stream.
35 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*) const
36 = 0;
37 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
38 virtual int enclave() const = 0;
39
40 // File extension for the content draw() outputs, e.g. "png", "pdf".
41 virtual const char* fileExtension() const = 0;
42};
43
44enum { kAnyThread_Enclave, kGPUSink_Enclave, kPDFSink_Enclave };
45static const int kNumEnclaves = kPDFSink_Enclave + 1;
46
47/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
48
mtklein748ca3b2015-01-15 10:56:12 -080049class GMSrc : public Src {
50public:
51 explicit GMSrc(skiagm::GMRegistry::Factory);
52
53 Error draw(SkCanvas*) const SK_OVERRIDE;
54 SkISize size() const SK_OVERRIDE;
55 Name name() const SK_OVERRIDE;
56private:
57 skiagm::GMRegistry::Factory fFactory;
58};
59
60class ImageSrc : public Src {
61public:
62 explicit ImageSrc(SkString path, int subsets = 0);
63
64 Error draw(SkCanvas*) const SK_OVERRIDE;
65 SkISize size() const SK_OVERRIDE;
66 Name name() const SK_OVERRIDE;
67private:
68 SkString fPath;
69 int fSubsets;
mtklein748ca3b2015-01-15 10:56:12 -080070};
71
72class SKPSrc : public Src {
73public:
74 explicit SKPSrc(SkString path);
75
76 Error draw(SkCanvas*) const SK_OVERRIDE;
77 SkISize size() const SK_OVERRIDE;
78 Name name() const SK_OVERRIDE;
79private:
80 SkString fPath;
mtklein748ca3b2015-01-15 10:56:12 -080081};
82
83/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
84
85class GPUSink : public Sink {
86public:
mtklein82d28432015-01-15 12:46:02 -080087 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -080088
89 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
90 int enclave() const SK_OVERRIDE;
91 const char* fileExtension() const SK_OVERRIDE { return "png"; }
92private:
93 GrContextFactory::GLContextType fContextType;
94 GrGLStandard fGpuAPI;
95 int fSampleCount;
96 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -080097 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -080098};
99
100class PDFSink : public Sink {
101public:
102 PDFSink();
103
104 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
105 int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; }
106 const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
107};
108
109class RasterSink : public Sink {
110public:
111 explicit RasterSink(SkColorType);
112
113 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
114 int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
115 const char* fileExtension() const SK_OVERRIDE { return "png"; }
116private:
117 SkColorType fColorType;
118};
119
120/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
121
122class ViaMatrix : public Sink {
123public:
124 ViaMatrix(SkMatrix, Sink*);
125
126 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
127 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
128 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
129private:
130 SkMatrix fMatrix;
131 SkAutoTDelete<Sink> fSink;
132};
133
134class ViaPipe : public Sink {
135public:
mtklein7edca212015-01-21 13:18:51 -0800136 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800137
138 Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE;
139 int enclave() const SK_OVERRIDE { return fSink->enclave(); }
140 const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
141private:
mtklein748ca3b2015-01-15 10:56:12 -0800142 SkAutoTDelete<Sink> fSink;
143};
144
145class ViaSerialization : public Sink {
146public:
147 explicit ViaSerialization(Sink*);
148
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:
153 SkAutoTDelete<Sink> fSink;
154};
155
156class ViaTiles : public Sink {
157public:
158 ViaTiles(int w, int h, SkBBHFactory*, 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 const int fW, fH;
165 SkAutoTDelete<SkBBHFactory> fFactory;
166 SkAutoTDelete<Sink> fSink;
167};
168
169} // namespace DM
170
171#endif//DMSrcSink_DEFINED