| scroggo | 478652e | 2015-03-25 07:11:02 -0700 | [diff] [blame] | 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 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 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" | 
| msarett | 5cb4885 | 2015-11-06 08:56:32 -0800 | [diff] [blame] | 15 | #include "SkBitmapRegionDecoder.h" | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 16 | #include "SkCanvas.h" | 
 | 17 | #include "SkData.h" | 
| halcanary | 45420a9 | 2016-06-02 12:41:14 -0700 | [diff] [blame] | 18 | #include "SkMultiPictureDocumentReader.h" | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 19 | #include "SkPicture.h" | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 20 | #include "gm.h" | 
 | 21 |  | 
 | 22 | namespace DM { | 
 | 23 |  | 
 | 24 | // This is just convenience.  It lets you use either return "foo" or return SkStringPrintf(...). | 
 | 25 | struct ImplicitString : public SkString { | 
 | 26 |     template <typename T> | 
 | 27 |     ImplicitString(const T& s) : SkString(s) {} | 
| msarett | 9e707a0 | 2015-09-01 14:57:57 -0700 | [diff] [blame] | 28 |     ImplicitString() : SkString("") {} | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 29 | }; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 30 | typedef ImplicitString Name; | 
| mtklein | 8d17a13 | 2015-01-30 11:42:31 -0800 | [diff] [blame] | 31 | typedef ImplicitString Path; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 32 |  | 
| mtklein | 4089ef7 | 2015-03-05 08:40:28 -0800 | [diff] [blame] | 33 | class Error { | 
 | 34 | public: | 
 | 35 |     Error(const SkString& s) : fMsg(s), fFatal(!this->isEmpty()) {} | 
 | 36 |     Error(const char* s)     : fMsg(s), fFatal(!this->isEmpty()) {} | 
 | 37 |  | 
 | 38 |     Error(const Error&)            = default; | 
 | 39 |     Error& operator=(const Error&) = default; | 
 | 40 |  | 
 | 41 |     static Error Nonfatal(const SkString& s) { return Nonfatal(s.c_str()); } | 
 | 42 |     static Error Nonfatal(const char* s) { | 
 | 43 |         Error e(s); | 
 | 44 |         e.fFatal = false; | 
 | 45 |         return e; | 
 | 46 |     } | 
 | 47 |  | 
 | 48 |     const char* c_str() const { return fMsg.c_str(); } | 
 | 49 |     bool isEmpty() const { return fMsg.isEmpty(); } | 
 | 50 |     bool isFatal() const { return fFatal; } | 
 | 51 |  | 
 | 52 | private: | 
 | 53 |     SkString fMsg; | 
 | 54 |     bool     fFatal; | 
 | 55 | }; | 
 | 56 |  | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 57 | struct SinkFlags { | 
 | 58 |     enum { kNull, kGPU, kVector, kRaster } type; | 
 | 59 |     enum { kDirect, kIndirect } approach; | 
 | 60 | }; | 
| mtklein | e0effd6 | 2015-07-29 06:37:28 -0700 | [diff] [blame] | 61 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 62 | struct Src { | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 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; | 
| bsalomon | 4ee6bd8 | 2015-05-27 13:23:23 -0700 | [diff] [blame] | 67 |     virtual void modifyGrContextOptions(GrContextOptions* options) const {} | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 68 |     virtual bool veto(SinkFlags) const { return false; } | 
| mtklein | 21eaf3b | 2016-02-08 12:39:59 -0800 | [diff] [blame] | 69 |  | 
| halcanary | 45420a9 | 2016-06-02 12:41:14 -0700 | [diff] [blame] | 70 |     virtual int pageCount() const { return 1; } | 
 | 71 |     virtual Error SK_WARN_UNUSED_RESULT draw(int, SkCanvas* canvas) const { | 
 | 72 |         return this->draw(canvas); | 
 | 73 |     } | 
 | 74 |     virtual SkISize size(int) const { return this->size(); } | 
| mtklein | 21eaf3b | 2016-02-08 12:39:59 -0800 | [diff] [blame] | 75 |     // Force Tasks using this Src to run on the main thread? | 
 | 76 |     virtual bool serial() const { return false; } | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 77 | }; | 
 | 78 |  | 
 | 79 | struct Sink { | 
 | 80 |     virtual ~Sink() {} | 
| mtklein | b9eb4ac | 2015-02-02 18:26:03 -0800 | [diff] [blame] | 81 |     // You may write to either the bitmap or stream.  If you write to log, we'll print that out. | 
 | 82 |     virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log) | 
 | 83 |         const = 0; | 
| mtklein | 21eaf3b | 2016-02-08 12:39:59 -0800 | [diff] [blame] | 84 |  | 
 | 85 |     // Force Tasks using this Sink to run on the main thread? | 
 | 86 |     virtual bool serial() const { return false; } | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 87 |  | 
 | 88 |     // File extension for the content draw() outputs, e.g. "png", "pdf". | 
 | 89 |     virtual const char* fileExtension() const  = 0; | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 90 |  | 
 | 91 |     virtual SinkFlags flags() const = 0; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 92 | }; | 
 | 93 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 94 | /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ | 
 | 95 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 96 | class GMSrc : public Src { | 
 | 97 | public: | 
 | 98 |     explicit GMSrc(skiagm::GMRegistry::Factory); | 
 | 99 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 100 |     Error draw(SkCanvas*) const override; | 
 | 101 |     SkISize size() const override; | 
 | 102 |     Name name() const override; | 
| bsalomon | 4ee6bd8 | 2015-05-27 13:23:23 -0700 | [diff] [blame] | 103 |     void modifyGrContextOptions(GrContextOptions* options) const override; | 
 | 104 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 105 | private: | 
 | 106 |     skiagm::GMRegistry::Factory fFactory; | 
 | 107 | }; | 
 | 108 |  | 
| scroggo | 9b77ddd | 2015-03-19 06:03:39 -0700 | [diff] [blame] | 109 | class CodecSrc : public Src { | 
 | 110 | public: | 
| scroggo | 9c59ebc | 2015-03-25 13:48:49 -0700 | [diff] [blame] | 111 |     enum Mode { | 
| msarett | 9e707a0 | 2015-09-01 14:57:57 -0700 | [diff] [blame] | 112 |         kCodec_Mode, | 
| msarett | bb25b53 | 2016-01-13 09:31:39 -0800 | [diff] [blame] | 113 |         // We choose to test only one mode with zero initialized memory. | 
 | 114 |         // This will exercise all of the interesting cases in SkSwizzler | 
 | 115 |         // without doubling the size of our test suite. | 
 | 116 |         kCodecZeroInit_Mode, | 
| scroggo | 9c59ebc | 2015-03-25 13:48:49 -0700 | [diff] [blame] | 117 |         kScanline_Mode, | 
| msarett | 0a24297 | 2015-06-11 14:27:27 -0700 | [diff] [blame] | 118 |         kStripe_Mode, // Tests the skipping of scanlines | 
| msarett | 91c22b2 | 2016-02-22 12:27:46 -0800 | [diff] [blame] | 119 |         kCroppedScanline_Mode, // Tests (jpeg) cropped scanline optimization | 
| scroggo | b636b45 | 2015-07-22 07:16:20 -0700 | [diff] [blame] | 120 |         kSubset_Mode, // For codecs that support subsets directly. | 
| scroggo | 9c59ebc | 2015-03-25 13:48:49 -0700 | [diff] [blame] | 121 |     }; | 
| msarett | 438b2ad | 2015-04-09 12:43:10 -0700 | [diff] [blame] | 122 |     enum DstColorType { | 
 | 123 |         kGetFromCanvas_DstColorType, | 
 | 124 |         kIndex8_Always_DstColorType, | 
 | 125 |         kGrayscale_Always_DstColorType, | 
| msarett | 34e0ec4 | 2016-04-22 16:27:24 -0700 | [diff] [blame] | 126 |         kNonNative8888_Always_DstColorType, | 
| msarett | 438b2ad | 2015-04-09 12:43:10 -0700 | [diff] [blame] | 127 |     }; | 
| scroggo | c5560be | 2016-02-03 09:42:42 -0800 | [diff] [blame] | 128 |     CodecSrc(Path, Mode, DstColorType, SkAlphaType, float); | 
| scroggo | 9b77ddd | 2015-03-19 06:03:39 -0700 | [diff] [blame] | 129 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 130 |     Error draw(SkCanvas*) const override; | 
 | 131 |     SkISize size() const override; | 
 | 132 |     Name name() const override; | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 133 |     bool veto(SinkFlags) const override; | 
| scroggo | 3ac66e9 | 2016-02-08 15:09:48 -0800 | [diff] [blame] | 134 |     bool serial() const override { return fRunSerially; } | 
| scroggo | 9b77ddd | 2015-03-19 06:03:39 -0700 | [diff] [blame] | 135 | private: | 
| msarett | 9e707a0 | 2015-09-01 14:57:57 -0700 | [diff] [blame] | 136 |     Path                    fPath; | 
 | 137 |     Mode                    fMode; | 
 | 138 |     DstColorType            fDstColorType; | 
| scroggo | c5560be | 2016-02-03 09:42:42 -0800 | [diff] [blame] | 139 |     SkAlphaType             fDstAlphaType; | 
| msarett | 9e707a0 | 2015-09-01 14:57:57 -0700 | [diff] [blame] | 140 |     float                   fScale; | 
| scroggo | 3ac66e9 | 2016-02-08 15:09:48 -0800 | [diff] [blame] | 141 |     bool                    fRunSerially; | 
| scroggo | 9b77ddd | 2015-03-19 06:03:39 -0700 | [diff] [blame] | 142 | }; | 
 | 143 |  | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 144 | class AndroidCodecSrc : public Src { | 
 | 145 | public: | 
| scroggo | f8dc9df | 2016-05-16 09:04:13 -0700 | [diff] [blame] | 146 |     AndroidCodecSrc(Path, CodecSrc::DstColorType, SkAlphaType, int sampleSize); | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 147 |  | 
 | 148 |     Error draw(SkCanvas*) const override; | 
 | 149 |     SkISize size() const override; | 
 | 150 |     Name name() const override; | 
 | 151 |     bool veto(SinkFlags) const override; | 
| scroggo | 3ac66e9 | 2016-02-08 15:09:48 -0800 | [diff] [blame] | 152 |     bool serial() const override { return fRunSerially; } | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 153 | private: | 
 | 154 |     Path                    fPath; | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 155 |     CodecSrc::DstColorType  fDstColorType; | 
| scroggo | c5560be | 2016-02-03 09:42:42 -0800 | [diff] [blame] | 156 |     SkAlphaType             fDstAlphaType; | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 157 |     int                     fSampleSize; | 
| scroggo | 3ac66e9 | 2016-02-08 15:09:48 -0800 | [diff] [blame] | 158 |     bool                    fRunSerially; | 
| msarett | 3d9d7a7 | 2015-10-21 10:27:10 -0700 | [diff] [blame] | 159 | }; | 
 | 160 |  | 
| msarett | a5783ae | 2015-09-08 15:35:32 -0700 | [diff] [blame] | 161 | // Allows for testing of various implementations of Android's BitmapRegionDecoder | 
 | 162 | class BRDSrc : public Src { | 
 | 163 | public: | 
 | 164 |     enum Mode { | 
 | 165 |         // Decode the entire image as one region. | 
 | 166 |         kFullImage_Mode, | 
 | 167 |         // Splits the image into multiple regions using a divisor and decodes the regions | 
 | 168 |         // separately.  Also, this test adds a border of a few pixels to each of the regions | 
 | 169 |         // that it is decoding.  This tests the behavior when a client asks for a region that | 
 | 170 |         // does not fully fit in the image. | 
 | 171 |         kDivisor_Mode, | 
 | 172 |     }; | 
 | 173 |  | 
| msarett | d1227a7 | 2016-05-18 06:23:57 -0700 | [diff] [blame] | 174 |     BRDSrc(Path, Mode, CodecSrc::DstColorType, uint32_t); | 
| msarett | a5783ae | 2015-09-08 15:35:32 -0700 | [diff] [blame] | 175 |  | 
| msarett | a5783ae | 2015-09-08 15:35:32 -0700 | [diff] [blame] | 176 |     Error draw(SkCanvas*) const override; | 
 | 177 |     SkISize size() const override; | 
 | 178 |     Name name() const override; | 
 | 179 |     bool veto(SinkFlags) const override; | 
 | 180 | private: | 
 | 181 |     Path                                     fPath; | 
| msarett | a5783ae | 2015-09-08 15:35:32 -0700 | [diff] [blame] | 182 |     Mode                                     fMode; | 
 | 183 |     CodecSrc::DstColorType                   fDstColorType; | 
 | 184 |     uint32_t                                 fSampleSize; | 
 | 185 | }; | 
| scroggo | 9b77ddd | 2015-03-19 06:03:39 -0700 | [diff] [blame] | 186 |  | 
| msarett | 1897631 | 2016-03-09 14:20:58 -0800 | [diff] [blame] | 187 | class ImageGenSrc : public Src { | 
 | 188 | public: | 
 | 189 |     enum Mode { | 
 | 190 |         kCodec_Mode,    // Use CodecImageGenerator | 
 | 191 |         kPlatform_Mode, // Uses CG or WIC | 
 | 192 |     }; | 
 | 193 |     ImageGenSrc(Path, Mode, SkAlphaType, bool); | 
 | 194 |  | 
 | 195 |     Error draw(SkCanvas*) const override; | 
 | 196 |     SkISize size() const override; | 
 | 197 |     Name name() const override; | 
 | 198 |     bool veto(SinkFlags) const override; | 
 | 199 |     bool serial() const override { return fRunSerially; } | 
 | 200 | private: | 
 | 201 |     Path        fPath; | 
 | 202 |     Mode        fMode; | 
 | 203 |     SkAlphaType fDstAlphaType; | 
 | 204 |     bool        fIsGpu; | 
 | 205 |     bool        fRunSerially; | 
 | 206 | }; | 
 | 207 |  | 
| msarett | 69deca8 | 2016-04-29 09:38:40 -0700 | [diff] [blame] | 208 | class ColorCodecSrc : public Src { | 
 | 209 | public: | 
 | 210 |     enum Mode { | 
 | 211 |         // Mimic legacy behavior and apply no color correction. | 
 | 212 |         kBaseline_Mode, | 
| msarett | 888dc16 | 2016-05-23 10:21:17 -0700 | [diff] [blame] | 213 |  | 
 | 214 |         // Color correct images into a specific dst color space.  If you happen to have this | 
 | 215 |         // monitor, you're in luck!  The unmarked outputs of this test should display | 
 | 216 |         // correctly on this monitor in the Chrome browser.  If not, it's useful to know | 
 | 217 |         // that this monitor has a profile that is fairly similar to Adobe RGB. | 
| msarett | 888dc16 | 2016-05-23 10:21:17 -0700 | [diff] [blame] | 218 |         kDst_HPZR30w_Mode, | 
| msarett | 9876ac5 | 2016-06-01 14:47:18 -0700 | [diff] [blame] | 219 |  | 
| msarett | d280957 | 2016-06-20 06:07:45 -0700 | [diff] [blame] | 220 |         kDst_sRGB_Mode, | 
 | 221 |  | 
| msarett | 469f1c5 | 2016-06-06 08:20:37 -0700 | [diff] [blame] | 222 | #if defined(SK_TEST_QCMS) | 
| msarett | 9876ac5 | 2016-06-01 14:47:18 -0700 | [diff] [blame] | 223 |         // Use QCMS for color correction. | 
 | 224 |         kQCMS_HPZR30w_Mode, | 
 | 225 | #endif | 
| msarett | 69deca8 | 2016-04-29 09:38:40 -0700 | [diff] [blame] | 226 |     }; | 
 | 227 |  | 
| msarett | 9876ac5 | 2016-06-01 14:47:18 -0700 | [diff] [blame] | 228 |     ColorCodecSrc(Path, Mode); | 
| msarett | 69deca8 | 2016-04-29 09:38:40 -0700 | [diff] [blame] | 229 |  | 
 | 230 |     Error draw(SkCanvas*) const override; | 
 | 231 |     SkISize size() const override; | 
 | 232 |     Name name() const override; | 
 | 233 |     bool veto(SinkFlags) const override; | 
 | 234 | private: | 
 | 235 |     Path                    fPath; | 
 | 236 |     Mode                    fMode; | 
 | 237 | }; | 
 | 238 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 239 | class SKPSrc : public Src { | 
 | 240 | public: | 
| mtklein | 8d17a13 | 2015-01-30 11:42:31 -0800 | [diff] [blame] | 241 |     explicit SKPSrc(Path path); | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 242 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 243 |     Error draw(SkCanvas*) const override; | 
 | 244 |     SkISize size() const override; | 
 | 245 |     Name name() const override; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 246 | private: | 
| mtklein | 8d17a13 | 2015-01-30 11:42:31 -0800 | [diff] [blame] | 247 |     Path fPath; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 248 | }; | 
 | 249 |  | 
 | 250 | /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ | 
 | 251 |  | 
| halcanary | 45420a9 | 2016-06-02 12:41:14 -0700 | [diff] [blame] | 252 | class MSKPSrc : public Src { | 
 | 253 | public: | 
 | 254 |     explicit MSKPSrc(Path path); | 
 | 255 |  | 
 | 256 |     int pageCount() const override; | 
 | 257 |     Error draw(SkCanvas* c) const override; | 
 | 258 |     Error draw(int, SkCanvas*) const override; | 
 | 259 |     SkISize size() const override; | 
 | 260 |     SkISize size(int) const override; | 
 | 261 |     Name name() const override; | 
 | 262 |  | 
 | 263 | private: | 
 | 264 |     Path fPath; | 
 | 265 |     SkMultiPictureDocumentReader fReader; | 
 | 266 | }; | 
 | 267 |  | 
 | 268 | /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ | 
 | 269 |  | 
| mtklein | ad66f9b | 2015-02-13 15:11:10 -0800 | [diff] [blame] | 270 | class NullSink : public Sink { | 
 | 271 | public: | 
 | 272 |     NullSink() {} | 
 | 273 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 274 |     Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 275 |     const char* fileExtension() const override { return ""; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 276 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kNull, SinkFlags::kDirect }; } | 
| mtklein | ad66f9b | 2015-02-13 15:11:10 -0800 | [diff] [blame] | 277 | }; | 
 | 278 |  | 
 | 279 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 280 | class GPUSink : public Sink { | 
 | 281 | public: | 
| bsalomon | 85b4b53 | 2016-04-05 11:06:27 -0700 | [diff] [blame] | 282 |     GPUSink(sk_gpu_test::GrContextFactory::ContextType, | 
 | 283 |             sk_gpu_test::GrContextFactory::ContextOptions, | 
| brianosman | b109b8c | 2016-06-16 13:03:24 -0700 | [diff] [blame] | 284 |             int samples, bool diText, SkColorType colorType, sk_sp<SkColorSpace> colorSpace, | 
| brianosman | d93c120 | 2016-03-10 07:49:08 -0800 | [diff] [blame] | 285 |             bool threaded); | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 286 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 287 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 21eaf3b | 2016-02-08 12:39:59 -0800 | [diff] [blame] | 288 |     bool serial() const override { return !fThreaded; } | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 289 |     const char* fileExtension() const override { return "png"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 290 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kGPU, SinkFlags::kDirect }; } | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 291 | private: | 
| bsalomon | 85b4b53 | 2016-04-05 11:06:27 -0700 | [diff] [blame] | 292 |     sk_gpu_test::GrContextFactory::ContextType      fContextType; | 
 | 293 |     sk_gpu_test::GrContextFactory::ContextOptions   fContextOptions; | 
| bsalomon | 3724e57 | 2016-03-30 18:56:19 -0700 | [diff] [blame] | 294 |     int                                             fSampleCount; | 
 | 295 |     bool                                            fUseDIText; | 
 | 296 |     SkColorType                                     fColorType; | 
| brianosman | b109b8c | 2016-06-16 13:03:24 -0700 | [diff] [blame] | 297 |     sk_sp<SkColorSpace>                             fColorSpace; | 
| bsalomon | 3724e57 | 2016-03-30 18:56:19 -0700 | [diff] [blame] | 298 |     bool                                            fThreaded; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 299 | }; | 
 | 300 |  | 
 | 301 | class PDFSink : public Sink { | 
 | 302 | public: | 
| halcanary | 4b65666 | 2016-04-27 07:45:18 -0700 | [diff] [blame] | 303 |     PDFSink(bool pdfa = false) : fPDFA(pdfa) {} | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 304 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 305 |     const char* fileExtension() const override { return "pdf"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 306 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } | 
| halcanary | 4b65666 | 2016-04-27 07:45:18 -0700 | [diff] [blame] | 307 |     bool fPDFA; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 308 | }; | 
 | 309 |  | 
| halcanary | 47ef4d5 | 2015-03-03 09:13:09 -0800 | [diff] [blame] | 310 | class XPSSink : public Sink { | 
 | 311 | public: | 
 | 312 |     XPSSink(); | 
 | 313 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 314 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 315 |     const char* fileExtension() const override { return "xps"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 316 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } | 
| halcanary | 47ef4d5 | 2015-03-03 09:13:09 -0800 | [diff] [blame] | 317 | }; | 
 | 318 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 319 | class RasterSink : public Sink { | 
 | 320 | public: | 
| brianosman | b109b8c | 2016-06-16 13:03:24 -0700 | [diff] [blame] | 321 |     explicit RasterSink(SkColorType, sk_sp<SkColorSpace> = nullptr); | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 322 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 323 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 324 |     const char* fileExtension() const override { return "png"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 325 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kRaster, SinkFlags::kDirect }; } | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 326 | private: | 
| brianosman | b109b8c | 2016-06-16 13:03:24 -0700 | [diff] [blame] | 327 |     SkColorType         fColorType; | 
 | 328 |     sk_sp<SkColorSpace> fColorSpace; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 329 | }; | 
 | 330 |  | 
| mtklein | 9c3f17d | 2015-01-28 11:35:18 -0800 | [diff] [blame] | 331 | class SKPSink : public Sink { | 
 | 332 | public: | 
 | 333 |     SKPSink(); | 
 | 334 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 335 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 336 |     const char* fileExtension() const override { return "skp"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 337 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } | 
| mtklein | 9c3f17d | 2015-01-28 11:35:18 -0800 | [diff] [blame] | 338 | }; | 
 | 339 |  | 
| mtklein | 8a4527e | 2015-01-31 20:00:58 -0800 | [diff] [blame] | 340 | class SVGSink : public Sink { | 
 | 341 | public: | 
 | 342 |     SVGSink(); | 
 | 343 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 344 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 345 |     const char* fileExtension() const override { return "svg"; } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 346 |     SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } | 
| mtklein | 8a4527e | 2015-01-31 20:00:58 -0800 | [diff] [blame] | 347 | }; | 
 | 348 |  | 
 | 349 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 350 | /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ | 
 | 351 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 352 | class Via : public Sink { | 
 | 353 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 354 |     explicit Via(Sink* sink) : fSink(sink) {} | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 355 |     const char* fileExtension() const override { return fSink->fileExtension(); } | 
| mtklein | 21eaf3b | 2016-02-08 12:39:59 -0800 | [diff] [blame] | 356 |     bool               serial() const override { return fSink->serial(); } | 
| mtklein | 99cab4e | 2015-07-31 06:43:04 -0700 | [diff] [blame] | 357 |     SinkFlags flags() const override { | 
 | 358 |         SinkFlags flags = fSink->flags(); | 
 | 359 |         flags.approach = SinkFlags::kIndirect; | 
 | 360 |         return flags; | 
 | 361 |     } | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 362 | protected: | 
 | 363 |     SkAutoTDelete<Sink> fSink; | 
 | 364 | }; | 
 | 365 |  | 
 | 366 | class ViaMatrix : public Via { | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 367 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 368 |     ViaMatrix(SkMatrix, Sink*); | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 369 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 370 | private: | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 371 |     const SkMatrix fMatrix; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 372 | }; | 
 | 373 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 374 | class ViaUpright : public Via { | 
| mtklein | d603b22 | 2015-02-17 11:13:33 -0800 | [diff] [blame] | 375 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 376 |     ViaUpright(SkMatrix, Sink*); | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 377 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | d603b22 | 2015-02-17 11:13:33 -0800 | [diff] [blame] | 378 | private: | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 379 |     const SkMatrix fMatrix; | 
| mtklein | d603b22 | 2015-02-17 11:13:33 -0800 | [diff] [blame] | 380 | }; | 
 | 381 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 382 | class ViaSerialization : public Via { | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 383 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 384 |     explicit ViaSerialization(Sink* sink) : Via(sink) {} | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 385 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 386 | }; | 
 | 387 |  | 
| mtklein | 4a34ecb | 2016-01-08 10:19:35 -0800 | [diff] [blame] | 388 | class ViaPicture : public Via { | 
 | 389 | public: | 
 | 390 |     explicit ViaPicture(Sink* sink) : Via(sink) {} | 
 | 391 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
 | 392 | }; | 
 | 393 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 394 | class ViaTiles : public Via { | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 395 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 396 |     ViaTiles(int w, int h, SkBBHFactory*, Sink*); | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 397 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 398 | private: | 
 | 399 |     const int                   fW, fH; | 
 | 400 |     SkAutoTDelete<SkBBHFactory> fFactory; | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 401 | }; | 
 | 402 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 403 | class ViaSecondPicture : public Via { | 
| mtklein | b7e8d69 | 2015-04-07 08:30:32 -0700 | [diff] [blame] | 404 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 405 |     explicit ViaSecondPicture(Sink* sink) : Via(sink) {} | 
| mtklein | b7e8d69 | 2015-04-07 08:30:32 -0700 | [diff] [blame] | 406 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | b7e8d69 | 2015-04-07 08:30:32 -0700 | [diff] [blame] | 407 | }; | 
 | 408 |  | 
| mtklein | 7882924 | 2015-05-06 07:54:07 -0700 | [diff] [blame] | 409 | class ViaSingletonPictures : public Via { | 
| mtklein | d31c13d | 2015-05-05 12:59:56 -0700 | [diff] [blame] | 410 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 411 |     explicit ViaSingletonPictures(Sink* sink) : Via(sink) {} | 
| mtklein | d31c13d | 2015-05-05 12:59:56 -0700 | [diff] [blame] | 412 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
| mtklein | d31c13d | 2015-05-05 12:59:56 -0700 | [diff] [blame] | 413 | }; | 
 | 414 |  | 
| mtklein | 6fbf4b3 | 2015-05-06 11:35:40 -0700 | [diff] [blame] | 415 | class ViaTwice : public Via { | 
 | 416 | public: | 
| msarett | 62d3b10 | 2015-12-10 15:14:27 -0800 | [diff] [blame] | 417 |     explicit ViaTwice(Sink* sink) : Via(sink) {} | 
| mtklein | 6fbf4b3 | 2015-05-06 11:35:40 -0700 | [diff] [blame] | 418 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
 | 419 | }; | 
 | 420 |  | 
| halcanary | 7a76f9c | 2016-02-03 11:53:18 -0800 | [diff] [blame] | 421 | class ViaMojo : public Via { | 
 | 422 | public: | 
 | 423 |     explicit ViaMojo(Sink* sink) : Via(sink) {} | 
 | 424 |     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; | 
 | 425 | }; | 
 | 426 |  | 
| mtklein | 748ca3b | 2015-01-15 10:56:12 -0800 | [diff] [blame] | 427 | }  // namespace DM | 
 | 428 |  | 
 | 429 | #endif//DMSrcSink_DEFINED |