blob: efae87138e50c6684b0ef1e65bfbbb7272aedaab [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"
16#include "SkData.h"
17#include "SkGPipe.h"
18#include "SkPicture.h"
mtklein748ca3b2015-01-15 10:56:12 -080019#include "gm.h"
20
21namespace DM {
22
23// This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...).
24struct ImplicitString : public SkString {
25 template <typename T>
26 ImplicitString(const T& s) : SkString(s) {}
msarett9e707a02015-09-01 14:57:57 -070027 ImplicitString() : SkString("") {}
mtklein748ca3b2015-01-15 10:56:12 -080028};
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
mtklein99cab4e2015-07-31 06:43:04 -070056struct SinkFlags {
57 enum { kNull, kGPU, kVector, kRaster } type;
58 enum { kDirect, kIndirect } approach;
59};
mtkleine0effd62015-07-29 06:37:28 -070060
mtklein748ca3b2015-01-15 10:56:12 -080061struct Src {
62 // All Srcs must be thread safe.
63 virtual ~Src() {}
64 virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
65 virtual SkISize size() const = 0;
66 virtual Name name() const = 0;
bsalomon4ee6bd82015-05-27 13:23:23 -070067 virtual void modifyGrContextOptions(GrContextOptions* options) const {}
mtklein99cab4e2015-07-31 06:43:04 -070068 virtual bool veto(SinkFlags) const { return false; }
mtklein748ca3b2015-01-15 10:56:12 -080069};
70
71struct Sink {
72 virtual ~Sink() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -080073 // You may write to either the bitmap or stream. If you write to log, we'll print that out.
74 virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
75 const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080076 // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
77 virtual int enclave() const = 0;
78
79 // File extension for the content draw() outputs, e.g. "png", "pdf".
80 virtual const char* fileExtension() const = 0;
mtklein99cab4e2015-07-31 06:43:04 -070081
82 virtual SinkFlags flags() const = 0;
mtklein748ca3b2015-01-15 10:56:12 -080083};
84
halcanary792c80f2015-02-20 07:21:05 -080085enum { kAnyThread_Enclave, kGPU_Enclave };
86static const int kNumEnclaves = kGPU_Enclave + 1;
mtklein748ca3b2015-01-15 10:56:12 -080087
88/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
89
mtklein748ca3b2015-01-15 10:56:12 -080090class GMSrc : public Src {
91public:
92 explicit GMSrc(skiagm::GMRegistry::Factory);
93
mtklein36352bf2015-03-25 18:17:31 -070094 Error draw(SkCanvas*) const override;
95 SkISize size() const override;
96 Name name() const override;
bsalomon4ee6bd82015-05-27 13:23:23 -070097 void modifyGrContextOptions(GrContextOptions* options) const override;
98
mtklein748ca3b2015-01-15 10:56:12 -080099private:
100 skiagm::GMRegistry::Factory fFactory;
101};
102
scroggo9b77ddd2015-03-19 06:03:39 -0700103class CodecSrc : public Src {
104public:
scroggo9c59ebc2015-03-25 13:48:49 -0700105 enum Mode {
msarett9e707a02015-09-01 14:57:57 -0700106 kScaledCodec_Mode,
107 kCodec_Mode,
scroggo9c59ebc2015-03-25 13:48:49 -0700108 kScanline_Mode,
emmaleer97002062015-05-27 12:36:10 -0700109 kScanline_Subset_Mode,
msarett0a242972015-06-11 14:27:27 -0700110 kStripe_Mode, // Tests the skipping of scanlines
scroggob636b452015-07-22 07:16:20 -0700111 kSubset_Mode, // For codecs that support subsets directly.
scroggo9c59ebc2015-03-25 13:48:49 -0700112 };
msarett438b2ad2015-04-09 12:43:10 -0700113 enum DstColorType {
114 kGetFromCanvas_DstColorType,
115 kIndex8_Always_DstColorType,
116 kGrayscale_Always_DstColorType,
117 };
msarett0a242972015-06-11 14:27:27 -0700118 CodecSrc(Path, Mode, DstColorType, float);
scroggo9b77ddd2015-03-19 06:03:39 -0700119
mtklein36352bf2015-03-25 18:17:31 -0700120 Error draw(SkCanvas*) const override;
121 SkISize size() const override;
122 Name name() const override;
mtklein99cab4e2015-07-31 06:43:04 -0700123 bool veto(SinkFlags) const override;
scroggo9b77ddd2015-03-19 06:03:39 -0700124private:
msarett9e707a02015-09-01 14:57:57 -0700125 Path fPath;
126 Mode fMode;
127 DstColorType fDstColorType;
128 float fScale;
scroggo9b77ddd2015-03-19 06:03:39 -0700129};
130
131
mtklein748ca3b2015-01-15 10:56:12 -0800132class ImageSrc : public Src {
133public:
mtkleinedc93bc2015-01-30 13:22:23 -0800134 // divisor == 0 means decode the whole image
135 // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
136 explicit ImageSrc(Path path, int divisor = 0);
mtklein748ca3b2015-01-15 10:56:12 -0800137
mtklein36352bf2015-03-25 18:17:31 -0700138 Error draw(SkCanvas*) const override;
139 SkISize size() const override;
140 Name name() const override;
mtklein99cab4e2015-07-31 06:43:04 -0700141 bool veto(SinkFlags) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800142private:
mtklein8d17a132015-01-30 11:42:31 -0800143 Path fPath;
mtkleinedc93bc2015-01-30 13:22:23 -0800144 const int fDivisor;
mtklein748ca3b2015-01-15 10:56:12 -0800145};
146
147class SKPSrc : public Src {
148public:
mtklein8d17a132015-01-30 11:42:31 -0800149 explicit SKPSrc(Path path);
mtklein748ca3b2015-01-15 10:56:12 -0800150
mtklein36352bf2015-03-25 18:17:31 -0700151 Error draw(SkCanvas*) const override;
152 SkISize size() const override;
153 Name name() const override;
mtklein748ca3b2015-01-15 10:56:12 -0800154private:
mtklein8d17a132015-01-30 11:42:31 -0800155 Path fPath;
mtklein748ca3b2015-01-15 10:56:12 -0800156};
157
158/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
159
mtkleinad66f9b2015-02-13 15:11:10 -0800160class NullSink : public Sink {
161public:
162 NullSink() {}
163
mtklein36352bf2015-03-25 18:17:31 -0700164 Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override;
165 int enclave() const override { return kAnyThread_Enclave; }
166 const char* fileExtension() const override { return ""; }
mtklein99cab4e2015-07-31 06:43:04 -0700167 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kNull, SinkFlags::kDirect }; }
mtkleinad66f9b2015-02-13 15:11:10 -0800168};
169
170
mtklein748ca3b2015-01-15 10:56:12 -0800171class GPUSink : public Sink {
172public:
bsalomonafcd7cd2015-08-31 12:39:41 -0700173 GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool diText, bool threaded);
mtklein748ca3b2015-01-15 10:56:12 -0800174
mtklein36352bf2015-03-25 18:17:31 -0700175 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
176 int enclave() const override;
177 const char* fileExtension() const override { return "png"; }
mtklein99cab4e2015-07-31 06:43:04 -0700178 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kGPU, SinkFlags::kDirect }; }
mtklein748ca3b2015-01-15 10:56:12 -0800179private:
180 GrContextFactory::GLContextType fContextType;
181 GrGLStandard fGpuAPI;
182 int fSampleCount;
bsalomonafcd7cd2015-08-31 12:39:41 -0700183 bool fUseDIText;
mtklein82d28432015-01-15 12:46:02 -0800184 bool fThreaded;
mtklein748ca3b2015-01-15 10:56:12 -0800185};
186
187class PDFSink : public Sink {
188public:
189 PDFSink();
190
mtklein36352bf2015-03-25 18:17:31 -0700191 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
192 int enclave() const override { return kAnyThread_Enclave; }
193 const char* fileExtension() const override { return "pdf"; }
mtklein99cab4e2015-07-31 06:43:04 -0700194 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; }
mtklein748ca3b2015-01-15 10:56:12 -0800195};
196
halcanary47ef4d52015-03-03 09:13:09 -0800197class XPSSink : public Sink {
198public:
199 XPSSink();
200
mtklein36352bf2015-03-25 18:17:31 -0700201 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
202 int enclave() const override { return kAnyThread_Enclave; }
203 const char* fileExtension() const override { return "xps"; }
mtklein99cab4e2015-07-31 06:43:04 -0700204 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; }
halcanary47ef4d52015-03-03 09:13:09 -0800205};
206
mtklein748ca3b2015-01-15 10:56:12 -0800207class RasterSink : public Sink {
208public:
209 explicit RasterSink(SkColorType);
210
mtklein36352bf2015-03-25 18:17:31 -0700211 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
212 int enclave() const override { return kAnyThread_Enclave; }
213 const char* fileExtension() const override { return "png"; }
mtklein99cab4e2015-07-31 06:43:04 -0700214 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kRaster, SinkFlags::kDirect }; }
mtklein748ca3b2015-01-15 10:56:12 -0800215private:
216 SkColorType fColorType;
217};
218
mtklein9c3f17d2015-01-28 11:35:18 -0800219class SKPSink : public Sink {
220public:
221 SKPSink();
222
mtklein36352bf2015-03-25 18:17:31 -0700223 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
224 int enclave() const override { return kAnyThread_Enclave; }
225 const char* fileExtension() const override { return "skp"; }
mtklein99cab4e2015-07-31 06:43:04 -0700226 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; }
mtklein9c3f17d2015-01-28 11:35:18 -0800227};
228
mtklein8a4527e2015-01-31 20:00:58 -0800229class SVGSink : public Sink {
230public:
231 SVGSink();
232
mtklein36352bf2015-03-25 18:17:31 -0700233 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
234 int enclave() const override { return kAnyThread_Enclave; }
235 const char* fileExtension() const override { return "svg"; }
mtklein99cab4e2015-07-31 06:43:04 -0700236 SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; }
mtklein8a4527e2015-01-31 20:00:58 -0800237};
238
239
mtklein748ca3b2015-01-15 10:56:12 -0800240/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
241
mtklein78829242015-05-06 07:54:07 -0700242class Via : public Sink {
243public:
244 explicit Via(Sink* sink) : fSink(sink) {}
245 const char* fileExtension() const override { return fSink->fileExtension(); }
246 int enclave() const override { return fSink->enclave(); }
mtklein99cab4e2015-07-31 06:43:04 -0700247 SinkFlags flags() const override {
248 SinkFlags flags = fSink->flags();
249 flags.approach = SinkFlags::kIndirect;
250 return flags;
251 }
mtklein78829242015-05-06 07:54:07 -0700252protected:
253 SkAutoTDelete<Sink> fSink;
254};
255
256class ViaMatrix : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800257public:
258 ViaMatrix(SkMatrix, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700259 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800260private:
mtklein78829242015-05-06 07:54:07 -0700261 const SkMatrix fMatrix;
mtklein748ca3b2015-01-15 10:56:12 -0800262};
263
mtklein78829242015-05-06 07:54:07 -0700264class ViaUpright : public Via {
mtkleind603b222015-02-17 11:13:33 -0800265public:
266 ViaUpright(SkMatrix, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700267 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleind603b222015-02-17 11:13:33 -0800268private:
mtklein78829242015-05-06 07:54:07 -0700269 const SkMatrix fMatrix;
mtkleind603b222015-02-17 11:13:33 -0800270};
271
mtklein78829242015-05-06 07:54:07 -0700272class ViaPipe : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800273public:
mtklein78829242015-05-06 07:54:07 -0700274 explicit ViaPipe(Sink* sink) : Via(sink) {}
mtklein36352bf2015-03-25 18:17:31 -0700275 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800276};
277
mtklein78829242015-05-06 07:54:07 -0700278class ViaDeferred : public Via {
reed06a22f62015-05-05 08:11:33 -0700279public:
mtklein78829242015-05-06 07:54:07 -0700280 explicit ViaDeferred(Sink* sink) : Via(sink) {}
reed06a22f62015-05-05 08:11:33 -0700281 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
reed06a22f62015-05-05 08:11:33 -0700282};
283
mtklein78829242015-05-06 07:54:07 -0700284class ViaSerialization : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800285public:
mtklein78829242015-05-06 07:54:07 -0700286 explicit ViaSerialization(Sink* sink) : Via(sink) {}
mtklein36352bf2015-03-25 18:17:31 -0700287 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800288};
289
mtklein78829242015-05-06 07:54:07 -0700290class ViaTiles : public Via {
mtklein748ca3b2015-01-15 10:56:12 -0800291public:
292 ViaTiles(int w, int h, SkBBHFactory*, Sink*);
mtklein36352bf2015-03-25 18:17:31 -0700293 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtklein748ca3b2015-01-15 10:56:12 -0800294private:
295 const int fW, fH;
296 SkAutoTDelete<SkBBHFactory> fFactory;
mtklein748ca3b2015-01-15 10:56:12 -0800297};
298
mtklein78829242015-05-06 07:54:07 -0700299class ViaSecondPicture : public Via {
mtkleinb7e8d692015-04-07 08:30:32 -0700300public:
mtklein78829242015-05-06 07:54:07 -0700301 explicit ViaSecondPicture(Sink* sink) : Via(sink) {}
mtkleinb7e8d692015-04-07 08:30:32 -0700302 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleinb7e8d692015-04-07 08:30:32 -0700303};
304
mtklein78829242015-05-06 07:54:07 -0700305class ViaSingletonPictures : public Via {
mtkleind31c13d2015-05-05 12:59:56 -0700306public:
mtklein78829242015-05-06 07:54:07 -0700307 explicit ViaSingletonPictures(Sink* sink) : Via(sink) {}
mtkleind31c13d2015-05-05 12:59:56 -0700308 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
mtkleind31c13d2015-05-05 12:59:56 -0700309};
310
mtklein6fbf4b32015-05-06 11:35:40 -0700311class ViaTwice : public Via {
312public:
313 explicit ViaTwice(Sink* sink) : Via(sink) {}
314 Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
315};
316
mtklein748ca3b2015-01-15 10:56:12 -0800317} // namespace DM
318
319#endif//DMSrcSink_DEFINED