3a0eab020fd692a1a12a3f00ba987166075c701b
[platform/upstream/libSkiaSharp.git] / dm / DMSrcSink.h
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #ifndef DMSrcSink_DEFINED
9 #define DMSrcSink_DEFINED
10
11 #include "DMGpuSupport.h"
12 #include "SkBBHFactory.h"
13 #include "SkBBoxHierarchy.h"
14 #include "SkBitmap.h"
15 #include "SkCanvas.h"
16 #include "SkData.h"
17 #include "SkGPipe.h"
18 #include "SkPicture.h"
19 #include "gm.h"
20
21 namespace DM {
22
23 // This is just convenience.  It lets you use either return "foo" or return SkStringPrintf(...).
24 struct ImplicitString : public SkString {
25     template <typename T>
26     ImplicitString(const T& s) : SkString(s) {}
27 };
28 typedef ImplicitString Name;
29 typedef ImplicitString Path;
30
31 class Error {
32 public:
33     Error(const SkString& s) : fMsg(s), fFatal(!this->isEmpty()) {}
34     Error(const char* s)     : fMsg(s), fFatal(!this->isEmpty()) {}
35
36     Error(const Error&)            = default;
37     Error& operator=(const Error&) = default;
38
39     static Error Nonfatal(const SkString& s) { return Nonfatal(s.c_str()); }
40     static Error Nonfatal(const char* s) {
41         Error e(s);
42         e.fFatal = false;
43         return e;
44     }
45
46     const char* c_str() const { return fMsg.c_str(); }
47     bool isEmpty() const { return fMsg.isEmpty(); }
48     bool isFatal() const { return fFatal; }
49
50 private:
51     SkString fMsg;
52     bool     fFatal;
53 };
54
55 struct Src {
56     // All Srcs must be thread safe.
57     virtual ~Src() {}
58     virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
59     virtual SkISize size() const = 0;
60     virtual Name name() const = 0;
61 };
62
63 struct Sink {
64     virtual ~Sink() {}
65     // You may write to either the bitmap or stream.  If you write to log, we'll print that out.
66     virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
67         const = 0;
68     // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
69     virtual int enclave() const = 0;
70
71     // File extension for the content draw() outputs, e.g. "png", "pdf".
72     virtual const char* fileExtension() const  = 0;
73 };
74
75 enum { kAnyThread_Enclave, kGPU_Enclave };
76 static const int kNumEnclaves = kGPU_Enclave + 1;
77
78 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
79
80 class GMSrc : public Src {
81 public:
82     explicit GMSrc(skiagm::GMRegistry::Factory);
83
84     Error draw(SkCanvas*) const SK_OVERRIDE;
85     SkISize size() const SK_OVERRIDE;
86     Name name() const SK_OVERRIDE;
87 private:
88     skiagm::GMRegistry::Factory fFactory;
89 };
90
91 class CodecSrc : public Src {
92 public:
93     enum Mode {
94         kNormal_Mode,
95         kScanline_Mode,
96     };
97     CodecSrc(Path, Mode);
98
99     Error draw(SkCanvas*) const SK_OVERRIDE;
100     SkISize size() const SK_OVERRIDE;
101     Name name() const SK_OVERRIDE;
102 private:
103     Path fPath;
104     Mode fMode;
105 };
106
107
108 class ImageSrc : public Src {
109 public:
110     // divisor == 0 means decode the whole image
111     // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
112     explicit ImageSrc(Path path, int divisor = 0);
113
114     Error draw(SkCanvas*) const SK_OVERRIDE;
115     SkISize size() const SK_OVERRIDE;
116     Name name() const SK_OVERRIDE;
117 private:
118     Path fPath;
119     const int  fDivisor;
120 };
121
122 class SKPSrc : public Src {
123 public:
124     explicit SKPSrc(Path path);
125
126     Error draw(SkCanvas*) const SK_OVERRIDE;
127     SkISize size() const SK_OVERRIDE;
128     Name name() const SK_OVERRIDE;
129 private:
130     Path fPath;
131 };
132
133 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
134
135 class NullSink : public Sink {
136 public:
137     NullSink() {}
138
139     Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
140     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
141     const char* fileExtension() const SK_OVERRIDE { return ""; }
142 };
143
144
145 class GPUSink : public Sink {
146 public:
147     GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
148
149     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
150     int enclave() const SK_OVERRIDE;
151     const char* fileExtension() const SK_OVERRIDE { return "png"; }
152 private:
153     GrContextFactory::GLContextType fContextType;
154     GrGLStandard                    fGpuAPI;
155     int                             fSampleCount;
156     bool                            fUseDFText;
157     bool                            fThreaded;
158 };
159
160 class PDFSink : public Sink {
161 public:
162     PDFSink();
163
164     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
165     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
166     const char* fileExtension() const SK_OVERRIDE { return "pdf"; }
167 };
168
169 class XPSSink : public Sink {
170 public:
171     XPSSink();
172
173     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
174     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
175     const char* fileExtension() const SK_OVERRIDE { return "xps"; }
176 };
177
178 class RasterSink : public Sink {
179 public:
180     explicit RasterSink(SkColorType);
181
182     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
183     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
184     const char* fileExtension() const SK_OVERRIDE { return "png"; }
185 private:
186     SkColorType    fColorType;
187 };
188
189 class SKPSink : public Sink {
190 public:
191     SKPSink();
192
193     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
194     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
195     const char* fileExtension() const SK_OVERRIDE { return "skp"; }
196 };
197
198 class SVGSink : public Sink {
199 public:
200     SVGSink();
201
202     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
203     int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; }
204     const char* fileExtension() const SK_OVERRIDE { return "svg"; }
205 };
206
207
208 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
209
210 class ViaMatrix : public Sink {
211 public:
212     ViaMatrix(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(); }
217 private:
218     SkMatrix            fMatrix;
219     SkAutoTDelete<Sink> fSink;
220 };
221
222 class ViaUpright : public Sink {
223 public:
224     ViaUpright(SkMatrix, Sink*);
225
226     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
227     int enclave() const SK_OVERRIDE { return fSink->enclave(); }
228     const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
229 private:
230     SkMatrix            fMatrix;
231     SkAutoTDelete<Sink> fSink;
232 };
233
234 class ViaPipe : public Sink {
235 public:
236     explicit ViaPipe(Sink*);
237
238     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
239     int enclave() const SK_OVERRIDE { return fSink->enclave(); }
240     const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
241 private:
242     SkAutoTDelete<Sink>  fSink;
243 };
244
245 class ViaSerialization : public Sink {
246 public:
247     explicit ViaSerialization(Sink*);
248
249     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
250     int enclave() const SK_OVERRIDE { return fSink->enclave(); }
251     const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
252 private:
253     SkAutoTDelete<Sink> fSink;
254 };
255
256 class ViaTiles : public Sink {
257 public:
258     ViaTiles(int w, int h, SkBBHFactory*, Sink*);
259
260     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const SK_OVERRIDE;
261     int enclave() const SK_OVERRIDE { return fSink->enclave(); }
262     const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); }
263 private:
264     const int                   fW, fH;
265     SkAutoTDelete<SkBBHFactory> fFactory;
266     SkAutoTDelete<Sink>         fSink;
267 };
268
269 }  // namespace DM
270
271 #endif//DMSrcSink_DEFINED