blob: 0807cb664454e173cfc3cc3d5848d2aac5f85d7d [file] [log] [blame]
scroggo478652e2015-03-25 07:11:02 -07001/*
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
mtklein748ca3b2015-01-15 10:56:12 -08008#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"
msarett438b2ad2015-04-09 12:43:10 -070016#include "SkCodec.h"
mtklein748ca3b2015-01-15 10:56:12 -080017#include "SkData.h"
18#include "SkGPipe.h"
19#include "SkPicture.h"
mtklein748ca3b2015-01-15 10:56:12 -080020#include "gm.h"
21
22namespace DM {
23
24// This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...).
25struct ImplicitString : public SkString {
26 template <typename T>
27 ImplicitString(const T& s) : SkString(s) {}
28};
mtklein748ca3b2015-01-15 10:56:12 -080029typedef ImplicitString Name;
mtklein8d17a132015-01-30 11:42:31 -080030typedef ImplicitString Path;
mtklein748ca3b2015-01-15 10:56:12 -080031
mtklein4089ef72015-03-05 08:40:28 -080032class Error {
33public:
34 Error(const SkString& s) : fMsg(s), fFatal(!this->isEmpty()) {}
35 Error(const char* s) : fMsg(s), fFatal(!this->isEmpty()) {}
36
37 Error(const Error&) = default;
38 Error& operator=(const Error&) = default;
39
40 static Error Nonfatal(const SkString& s) { return Nonfatal(s.c_str()); }
41 static Error Nonfatal(const char* s) {
42 Error e(s);
43 e.fFatal = false;
44 return e;
45 }
46
47 const char* c_str() const { return fMsg.c_str(); }
48 bool isEmpty() const { return fMsg.isEmpty(); }
49 bool isFatal() const { return fFatal; }
50
51private:
52 SkString fMsg;
53 bool fFatal;
54};
55
mtklein748ca3b2015-01-15 10:56:12 -080056struct Src {
57 // All Srcs must be thread safe.
58 virtual ~Src() {}
59 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
60 virtual SkISize size() const = 0;
61 virtual Name name() const = 0;
62};
63
64struct Sink {
65 virtual ~Sink() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -080066 // You may write to either the bitmap or stream. If you write to log, we'll print that out.
67 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
68 const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080069 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
70 virtual int enclave() const = 0;
71
72 // File extension for the content draw() outputs, e.g. "png", "pdf".
73 virtual const char* fileExtension() const = 0;
74};
75
halcanary792c80f2015-02-20 07:21:05 -080076enum { kAnyThread_Enclave, kGPU_Enclave };
77static const int kNumEnclaves = kGPU_Enclave + 1;
mtklein748ca3b2015-01-15 10:56:12 -080078
79/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
80
mtklein748ca3b2015-01-15 10:56:12 -080081class GMSrc : public Src {
82public:
83 explicit GMSrc(skiagm::GMRegistry::Factory);
84
mtklein36352bf2015-03-25 18:17:31 -070085 Error draw(SkCanvas*) const override;
86 SkISize size() const override;
87 Name name() const override;
mtklein748ca3b2015-01-15 10:56:12 -080088private:
89 skiagm::GMRegistry::Factory fFactory;
90};
91
scroggo9b77ddd2015-03-19 06:03:39 -070092class CodecSrc : public Src {
93public:
scroggo9c59ebc2015-03-25 13:48:49 -070094 enum Mode {
95 kNormal_Mode,
96 kScanline_Mode,
97 };
msarett438b2ad2015-04-09 12:43:10 -070098 enum DstColorType {
99 kGetFromCanvas_DstColorType,
100 kIndex8_Always_DstColorType,
101 kGrayscale_Always_DstColorType,
102 };
103 CodecSrc(Path, Mode, DstColorType);
scroggo9b77ddd2015-03-19 06:03:39 -0700104
mtklein36352bf2015-03-25 18:17:31 -0700105 Error draw(SkCanvas*) const override;
106 SkISize size() const override;
107 Name name() const override;
scroggo9b77ddd2015-03-19 06:03:39 -0700108private:
msarett438b2ad2015-04-09 12:43:10 -0700109 Path fPath;
110 Mode fMode;
111 DstColorType fDstColorType;
scroggo9b77ddd2015-03-19 06:03:39 -0700112};
113
114
mtklein748ca3b2015-01-15 10:56:12 -0800115class ImageSrc : public Src {
116public:
mtkleinedc93bc2015-01-30 13:22:23 -0800117 // divisor == 0 means decode the whole image
118 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
119 explicit ImageSrc(Path path, int divisor = 0);
mtklein748ca3b2015-01-15 10:56:12 -0800120
mtklein36352bf2015-03-25 18:17:31 -0700121 Error draw(SkCanvas*) const override;
122 SkISize size() const override;
123 Name name() const override;
mtklein748ca3b2015-01-15 10:56:12 -0800124private:
mtklein8d17a132015-01-30 11:42:31 -0800125 Path fPath;
mtkleinedc93bc2015-01-30 13:22:23 -0800126 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -0800127};
128
129class SKPSrc : public Src {
130public:
mtklein8d17a132015-01-30 11:42:31 -0800131 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -0800132
mtklein36352bf2015-03-25 18:17:31 -0700133 Error draw(SkCanvas*) const override;
134 SkISize size() const override;
135 Name name() const override;
mtklein748ca3b2015-01-15 10:56:12 -0800136private:
mtklein8d17a132015-01-30 11:42:31 -0800137 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -0800138};
139
140/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
141
mtkleinad66f9b2015-02-13 15:11:10 -0800142class NullSink : public Sink {
143public:
144 NullSink() {}
145
mtklein36352bf2015-03-25 18:17:31 -0700146 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override;
147 int enclave() const override { return kAnyThread_Enclave; }
148 const char* fileExtension() const override { return ""; }
mtkleinad66f9b2015-02-13 15:11:10 -0800149};
150
151
mtklein748ca3b2015-01-15 10:56:12 -0800152class GPUSink : public Sink {
153public:
mtklein82d28432015-01-15 12:46:02 -0800154 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -0800155
mtklein36352bf2015-03-25 18:17:31 -0700156 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
157 int enclave() const override;
158 const char* fileExtension() const override { return "png"; }
mtklein748ca3b2015-01-15 10:56:12 -0800159private:
160 GrContextFactory::GLContextType fContextType;
161 GrGLStandard fGpuAPI;
162 int fSampleCount;
163 bool fUseDFText;
mtklein82d28432015-01-15 12:46:02 -0800164 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800165};
166
167class PDFSink : public Sink {
168public:
169 PDFSink();
170
mtklein36352bf2015-03-25 18:17:31 -0700171 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
172 int enclave() const override { return kAnyThread_Enclave; }
173 const char* fileExtension() const override { return "pdf"; }
mtklein748ca3b2015-01-15 10:56:12 -0800174};
175
halcanary47ef4d52015-03-03 09:13:09 -0800176class XPSSink : public Sink {
177public:
178 XPSSink();
179
mtklein36352bf2015-03-25 18:17:31 -0700180 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
181 int enclave() const override { return kAnyThread_Enclave; }
182 const char* fileExtension() const override { return "xps"; }
halcanary47ef4d52015-03-03 09:13:09 -0800183};
184
mtklein748ca3b2015-01-15 10:56:12 -0800185class RasterSink : public Sink {
186public:
187 explicit RasterSink(SkColorType);
188
mtklein36352bf2015-03-25 18:17:31 -0700189 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
190 int enclave() const override { return kAnyThread_Enclave; }
191 const char* fileExtension() const override { return "png"; }
mtklein748ca3b2015-01-15 10:56:12 -0800192private:
193 SkColorType fColorType;
194};
195
mtklein9c3f17d2015-01-28 11:35:18 -0800196class SKPSink : public Sink {
197public:
198 SKPSink();
199
mtklein36352bf2015-03-25 18:17:31 -0700200 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
201 int enclave() const override { return kAnyThread_Enclave; }
202 const char* fileExtension() const override { return "skp"; }
mtklein9c3f17d2015-01-28 11:35:18 -0800203};
204
mtklein8a4527e2015-01-31 20:00:58 -0800205class SVGSink : public Sink {
206public:
207 SVGSink();
208
mtklein36352bf2015-03-25 18:17:31 -0700209 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
210 int enclave() const override { return kAnyThread_Enclave; }
211 const char* fileExtension() const override { return "svg"; }
mtklein8a4527e2015-01-31 20:00:58 -0800212};
213
214
mtklein748ca3b2015-01-15 10:56:12 -0800215/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
216
217class ViaMatrix : public Sink {
218public:
219 ViaMatrix(SkMatrix, Sink*);
220
mtklein36352bf2015-03-25 18:17:31 -0700221 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
222 int enclave() const override { return fSink->enclave(); }
223 const char* fileExtension() const override { return fSink->fileExtension(); }
mtklein748ca3b2015-01-15 10:56:12 -0800224private:
225 SkMatrix fMatrix;
226 SkAutoTDelete<Sink> fSink;
227};
228
mtkleind603b222015-02-17 11:13:33 -0800229class ViaUpright : public Sink {
230public:
231 ViaUpright(SkMatrix, Sink*);
232
mtklein36352bf2015-03-25 18:17:31 -0700233 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
234 int enclave() const override { return fSink->enclave(); }
235 const char* fileExtension() const override { return fSink->fileExtension(); }
mtkleind603b222015-02-17 11:13:33 -0800236private:
237 SkMatrix fMatrix;
238 SkAutoTDelete<Sink> fSink;
239};
240
mtklein748ca3b2015-01-15 10:56:12 -0800241class ViaPipe : public Sink {
242public:
mtklein7edca212015-01-21 13:18:51 -0800243 explicit ViaPipe(Sink*);
mtklein748ca3b2015-01-15 10:56:12 -0800244
mtklein36352bf2015-03-25 18:17:31 -0700245 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
246 int enclave() const override { return fSink->enclave(); }
247 const char* fileExtension() const override { return fSink->fileExtension(); }
mtklein748ca3b2015-01-15 10:56:12 -0800248private:
mtklein748ca3b2015-01-15 10:56:12 -0800249 SkAutoTDelete<Sink> fSink;
250};
251
252class ViaSerialization : public Sink {
253public:
254 explicit ViaSerialization(Sink*);
255
mtklein36352bf2015-03-25 18:17:31 -0700256 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
257 int enclave() const override { return fSink->enclave(); }
258 const char* fileExtension() const override { return fSink->fileExtension(); }
mtklein748ca3b2015-01-15 10:56:12 -0800259private:
260 SkAutoTDelete<Sink> fSink;
261};
262
263class ViaTiles : public Sink {
264public:
265 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
266
mtklein36352bf2015-03-25 18:17:31 -0700267 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
268 int enclave() const override { return fSink->enclave(); }
269 const char* fileExtension() const override { return fSink->fileExtension(); }
mtklein748ca3b2015-01-15 10:56:12 -0800270private:
271 const int fW, fH;
272 SkAutoTDelete<SkBBHFactory> fFactory;
273 SkAutoTDelete<Sink> fSink;
274};
275
mtkleinb7e8d692015-04-07 08:30:32 -0700276class ViaSecondPicture : public Sink {
277public:
278 explicit ViaSecondPicture(Sink*);
279
280 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
281 int enclave() const override { return fSink->enclave(); }
282 const char* fileExtension() const override { return fSink->fileExtension(); }
283private:
284 SkAutoTDelete<Sink> fSink;
285};
286
mtklein748ca3b2015-01-15 10:56:12 -0800287} // namespace DM
288
289#endif//DMSrcSink_DEFINED