blob: 903755eb7e6c7204eb7e024120a84d03022ffc40 [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
mtklein78829242015-05-06 07:54:07 -0700217class Via : public Sink {
218public:
219 explicit Via(Sink* sink) : fSink(sink) {}
220 const char* fileExtension() const override { return fSink->fileExtension(); }
221 int enclave() const override { return fSink->enclave(); }
222protected:
223 SkAutoTDelete<Sink> fSink;
224};
225
226class ViaMatrix : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800227public:
228 ViaMatrix(SkMatrix, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700229 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800230private:
mtklein78829242015-05-06 07:54:07 -0700231 const SkMatrix fMatrix;
mtklein748ca3b2015-01-15 10:56:12 -0800232};
233
mtklein78829242015-05-06 07:54:07 -0700234class ViaUpright : public Via {
mtkleind603b222015-02-17 11:13:33 -0800235public:
236 ViaUpright(SkMatrix, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700237 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleind603b222015-02-17 11:13:33 -0800238private:
mtklein78829242015-05-06 07:54:07 -0700239 const SkMatrix fMatrix;
mtkleind603b222015-02-17 11:13:33 -0800240};
241
mtklein78829242015-05-06 07:54:07 -0700242class ViaPipe : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800243public:
mtklein78829242015-05-06 07:54:07 -0700244 explicit ViaPipe(Sink* sink) : Via(sink) {}
mtklein36352bf2015-03-25 18:17:31 -0700245 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800246};
247
mtklein78829242015-05-06 07:54:07 -0700248class ViaDeferred : public Via {
reed06a22f62015-05-05 08:11:33 -0700249public:
mtklein78829242015-05-06 07:54:07 -0700250 explicit ViaDeferred(Sink* sink) : Via(sink) {}
reed06a22f62015-05-05 08:11:33 -0700251 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
reed06a22f62015-05-05 08:11:33 -0700252};
253
mtklein78829242015-05-06 07:54:07 -0700254class ViaSerialization : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800255public:
mtklein78829242015-05-06 07:54:07 -0700256 explicit ViaSerialization(Sink* sink) : Via(sink) {}
mtklein36352bf2015-03-25 18:17:31 -0700257 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800258};
259
mtklein78829242015-05-06 07:54:07 -0700260class ViaTiles : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800261public:
262 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700263 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800264private:
265 const int fW, fH;
266 SkAutoTDelete<SkBBHFactory> fFactory;
mtklein748ca3b2015-01-15 10:56:12 -0800267};
268
mtklein78829242015-05-06 07:54:07 -0700269class ViaSecondPicture : public Via {
mtkleinb7e8d692015-04-07 08:30:32 -0700270public:
mtklein78829242015-05-06 07:54:07 -0700271 explicit ViaSecondPicture(Sink* sink) : Via(sink) {}
mtkleinb7e8d692015-04-07 08:30:32 -0700272 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleinb7e8d692015-04-07 08:30:32 -0700273};
274
mtklein78829242015-05-06 07:54:07 -0700275class ViaSingletonPictures : public Via {
mtkleind31c13d2015-05-05 12:59:56 -0700276public:
mtklein78829242015-05-06 07:54:07 -0700277 explicit ViaSingletonPictures(Sink* sink) : Via(sink) {}
mtkleind31c13d2015-05-05 12:59:56 -0700278 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleind31c13d2015-05-05 12:59:56 -0700279};
280
mtklein748ca3b2015-01-15 10:56:12 -0800281} // namespace DM
282
283#endif//DMSrcSink_DEFINED