1478652e918d73a4c0330e27e03eaa9564138c0f7scroggo/*
2478652e918d73a4c0330e27e03eaa9564138c0f7scroggo * Copyright 2015 Google Inc.
3478652e918d73a4c0330e27e03eaa9564138c0f7scroggo *
4478652e918d73a4c0330e27e03eaa9564138c0f7scroggo * Use of this source code is governed by a BSD-style license that can be
5478652e918d73a4c0330e27e03eaa9564138c0f7scroggo * found in the LICENSE file.
6478652e918d73a4c0330e27e03eaa9564138c0f7scroggo */
7478652e918d73a4c0330e27e03eaa9564138c0f7scroggo
8748ca3bf2d170708f263693e8579e6722389d0efmtklein#ifndef DMSrcSink_DEFINED
9748ca3bf2d170708f263693e8579e6722389d0efmtklein#define DMSrcSink_DEFINED
10748ca3bf2d170708f263693e8579e6722389d0efmtklein
11748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "DMGpuSupport.h"
12748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkBBHFactory.h"
13748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkBBoxHierarchy.h"
14748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkBitmap.h"
15748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkCanvas.h"
16438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett#include "SkCodec.h"
17748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkData.h"
18748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkGPipe.h"
19748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "SkPicture.h"
20748ca3bf2d170708f263693e8579e6722389d0efmtklein#include "gm.h"
21748ca3bf2d170708f263693e8579e6722389d0efmtklein
22748ca3bf2d170708f263693e8579e6722389d0efmtkleinnamespace DM {
23748ca3bf2d170708f263693e8579e6722389d0efmtklein
24748ca3bf2d170708f263693e8579e6722389d0efmtklein// This is just convenience.  It lets you use either return "foo" or return SkStringPrintf(...).
25748ca3bf2d170708f263693e8579e6722389d0efmtkleinstruct ImplicitString : public SkString {
26748ca3bf2d170708f263693e8579e6722389d0efmtklein    template <typename T>
27748ca3bf2d170708f263693e8579e6722389d0efmtklein    ImplicitString(const T& s) : SkString(s) {}
28748ca3bf2d170708f263693e8579e6722389d0efmtklein};
29748ca3bf2d170708f263693e8579e6722389d0efmtkleintypedef ImplicitString Name;
308d17a13a71edb0d8412e4354c428582b74587b79mtkleintypedef ImplicitString Path;
31748ca3bf2d170708f263693e8579e6722389d0efmtklein
324089ef7c982592fadeec441438c551ffb4c746bemtkleinclass Error {
334089ef7c982592fadeec441438c551ffb4c746bemtkleinpublic:
344089ef7c982592fadeec441438c551ffb4c746bemtklein    Error(const SkString& s) : fMsg(s), fFatal(!this->isEmpty()) {}
354089ef7c982592fadeec441438c551ffb4c746bemtklein    Error(const char* s)     : fMsg(s), fFatal(!this->isEmpty()) {}
364089ef7c982592fadeec441438c551ffb4c746bemtklein
374089ef7c982592fadeec441438c551ffb4c746bemtklein    Error(const Error&)            = default;
384089ef7c982592fadeec441438c551ffb4c746bemtklein    Error& operator=(const Error&) = default;
394089ef7c982592fadeec441438c551ffb4c746bemtklein
404089ef7c982592fadeec441438c551ffb4c746bemtklein    static Error Nonfatal(const SkString& s) { return Nonfatal(s.c_str()); }
414089ef7c982592fadeec441438c551ffb4c746bemtklein    static Error Nonfatal(const char* s) {
424089ef7c982592fadeec441438c551ffb4c746bemtklein        Error e(s);
434089ef7c982592fadeec441438c551ffb4c746bemtklein        e.fFatal = false;
444089ef7c982592fadeec441438c551ffb4c746bemtklein        return e;
454089ef7c982592fadeec441438c551ffb4c746bemtklein    }
464089ef7c982592fadeec441438c551ffb4c746bemtklein
474089ef7c982592fadeec441438c551ffb4c746bemtklein    const char* c_str() const { return fMsg.c_str(); }
484089ef7c982592fadeec441438c551ffb4c746bemtklein    bool isEmpty() const { return fMsg.isEmpty(); }
494089ef7c982592fadeec441438c551ffb4c746bemtklein    bool isFatal() const { return fFatal; }
504089ef7c982592fadeec441438c551ffb4c746bemtklein
514089ef7c982592fadeec441438c551ffb4c746bemtkleinprivate:
524089ef7c982592fadeec441438c551ffb4c746bemtklein    SkString fMsg;
534089ef7c982592fadeec441438c551ffb4c746bemtklein    bool     fFatal;
544089ef7c982592fadeec441438c551ffb4c746bemtklein};
554089ef7c982592fadeec441438c551ffb4c746bemtklein
56748ca3bf2d170708f263693e8579e6722389d0efmtkleinstruct Src {
57748ca3bf2d170708f263693e8579e6722389d0efmtklein    // All Srcs must be thread safe.
58748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual ~Src() {}
59748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0;
60748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual SkISize size() const = 0;
61748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual Name name() const = 0;
62748ca3bf2d170708f263693e8579e6722389d0efmtklein};
63748ca3bf2d170708f263693e8579e6722389d0efmtklein
64748ca3bf2d170708f263693e8579e6722389d0efmtkleinstruct Sink {
65748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual ~Sink() {}
66b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    // You may write to either the bitmap or stream.  If you write to log, we'll print that out.
67b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein    virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*, SkString* log)
68b9eb4ac0f1c29d6fe10ad7ff81ed8326ac1ea043mtklein        const = 0;
69748ca3bf2d170708f263693e8579e6722389d0efmtklein    // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread.
70748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual int enclave() const = 0;
71748ca3bf2d170708f263693e8579e6722389d0efmtklein
72748ca3bf2d170708f263693e8579e6722389d0efmtklein    // File extension for the content draw() outputs, e.g. "png", "pdf".
73748ca3bf2d170708f263693e8579e6722389d0efmtklein    virtual const char* fileExtension() const  = 0;
74748ca3bf2d170708f263693e8579e6722389d0efmtklein};
75748ca3bf2d170708f263693e8579e6722389d0efmtklein
76792c80f5a7b66e75d42664ccb298f31962c6654chalcanaryenum { kAnyThread_Enclave, kGPU_Enclave };
77792c80f5a7b66e75d42664ccb298f31962c6654chalcanarystatic const int kNumEnclaves = kGPU_Enclave + 1;
78748ca3bf2d170708f263693e8579e6722389d0efmtklein
79748ca3bf2d170708f263693e8579e6722389d0efmtklein/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
80748ca3bf2d170708f263693e8579e6722389d0efmtklein
81748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass GMSrc : public Src {
82748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
83748ca3bf2d170708f263693e8579e6722389d0efmtklein    explicit GMSrc(skiagm::GMRegistry::Factory);
84748ca3bf2d170708f263693e8579e6722389d0efmtklein
8536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(SkCanvas*) const override;
8636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize size() const override;
8736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Name name() const override;
88748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
89748ca3bf2d170708f263693e8579e6722389d0efmtklein    skiagm::GMRegistry::Factory fFactory;
90748ca3bf2d170708f263693e8579e6722389d0efmtklein};
91748ca3bf2d170708f263693e8579e6722389d0efmtklein
929b77ddde08efe702256355a333cf31ade8f15bb0scroggoclass CodecSrc : public Src {
939b77ddde08efe702256355a333cf31ade8f15bb0scroggopublic:
949c59ebc0db7cade1537591813430f7be47123e76scroggo    enum Mode {
959c59ebc0db7cade1537591813430f7be47123e76scroggo        kNormal_Mode,
969c59ebc0db7cade1537591813430f7be47123e76scroggo        kScanline_Mode,
979c59ebc0db7cade1537591813430f7be47123e76scroggo    };
98438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    enum DstColorType {
99438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett        kGetFromCanvas_DstColorType,
100438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett        kIndex8_Always_DstColorType,
101438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett        kGrayscale_Always_DstColorType,
102438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    };
103438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    CodecSrc(Path, Mode, DstColorType);
1049b77ddde08efe702256355a333cf31ade8f15bb0scroggo
10536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(SkCanvas*) const override;
10636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize size() const override;
10736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Name name() const override;
1089b77ddde08efe702256355a333cf31ade8f15bb0scroggoprivate:
109438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    Path                   fPath;
110438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    Mode                   fMode;
111438b2adefb9e9213e0ddaf0609405d3087a1cf0amsarett    DstColorType           fDstColorType;
1129b77ddde08efe702256355a333cf31ade8f15bb0scroggo};
1139b77ddde08efe702256355a333cf31ade8f15bb0scroggo
1149b77ddde08efe702256355a333cf31ade8f15bb0scroggo
115748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass ImageSrc : public Src {
116748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
117edc93bc74003e2c19219ba0b30383868b5371a96mtklein    // divisor == 0 means decode the whole image
118edc93bc74003e2c19219ba0b30383868b5371a96mtklein    // divisor > 0 means decode in subsets, dividing into a divisor x divisor grid.
119edc93bc74003e2c19219ba0b30383868b5371a96mtklein    explicit ImageSrc(Path path, int divisor = 0);
120748ca3bf2d170708f263693e8579e6722389d0efmtklein
12136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(SkCanvas*) const override;
12236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize size() const override;
12336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Name name() const override;
124748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
1258d17a13a71edb0d8412e4354c428582b74587b79mtklein    Path fPath;
126edc93bc74003e2c19219ba0b30383868b5371a96mtklein    const int  fDivisor;
127748ca3bf2d170708f263693e8579e6722389d0efmtklein};
128748ca3bf2d170708f263693e8579e6722389d0efmtklein
129748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass SKPSrc : public Src {
130748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
1318d17a13a71edb0d8412e4354c428582b74587b79mtklein    explicit SKPSrc(Path path);
132748ca3bf2d170708f263693e8579e6722389d0efmtklein
13336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(SkCanvas*) const override;
13436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize size() const override;
13536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Name name() const override;
136748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
1378d17a13a71edb0d8412e4354c428582b74587b79mtklein    Path fPath;
138748ca3bf2d170708f263693e8579e6722389d0efmtklein};
139748ca3bf2d170708f263693e8579e6722389d0efmtklein
140748ca3bf2d170708f263693e8579e6722389d0efmtklein/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
141748ca3bf2d170708f263693e8579e6722389d0efmtklein
142ad66f9b15fd44468b5f013534ee333dc68d6bed6mtkleinclass NullSink : public Sink {
143ad66f9b15fd44468b5f013534ee333dc68d6bed6mtkleinpublic:
144ad66f9b15fd44468b5f013534ee333dc68d6bed6mtklein    NullSink() {}
145ad66f9b15fd44468b5f013534ee333dc68d6bed6mtklein
14636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src& src, SkBitmap*, SkWStream*, SkString*) const override;
14736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
14836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return ""; }
149ad66f9b15fd44468b5f013534ee333dc68d6bed6mtklein};
150ad66f9b15fd44468b5f013534ee333dc68d6bed6mtklein
151ad66f9b15fd44468b5f013534ee333dc68d6bed6mtklein
152748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass GPUSink : public Sink {
153748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
15482d2843cc59dc048b7d8d1d928dab743d8e85a3bmtklein    GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded);
155748ca3bf2d170708f263693e8579e6722389d0efmtklein
15636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
15736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override;
15836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "png"; }
159748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
160748ca3bf2d170708f263693e8579e6722389d0efmtklein    GrContextFactory::GLContextType fContextType;
161748ca3bf2d170708f263693e8579e6722389d0efmtklein    GrGLStandard                    fGpuAPI;
162748ca3bf2d170708f263693e8579e6722389d0efmtklein    int                             fSampleCount;
163748ca3bf2d170708f263693e8579e6722389d0efmtklein    bool                            fUseDFText;
16482d2843cc59dc048b7d8d1d928dab743d8e85a3bmtklein    bool                            fThreaded;
165748ca3bf2d170708f263693e8579e6722389d0efmtklein};
166748ca3bf2d170708f263693e8579e6722389d0efmtklein
167748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass PDFSink : public Sink {
168748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
169748ca3bf2d170708f263693e8579e6722389d0efmtklein    PDFSink();
170748ca3bf2d170708f263693e8579e6722389d0efmtklein
17136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
17236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
17336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "pdf"; }
174748ca3bf2d170708f263693e8579e6722389d0efmtklein};
175748ca3bf2d170708f263693e8579e6722389d0efmtklein
17647ef4d5d934bba86848aa238efab21f54a160c1ahalcanaryclass XPSSink : public Sink {
17747ef4d5d934bba86848aa238efab21f54a160c1ahalcanarypublic:
17847ef4d5d934bba86848aa238efab21f54a160c1ahalcanary    XPSSink();
17947ef4d5d934bba86848aa238efab21f54a160c1ahalcanary
18036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
18136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
18236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "xps"; }
18347ef4d5d934bba86848aa238efab21f54a160c1ahalcanary};
18447ef4d5d934bba86848aa238efab21f54a160c1ahalcanary
185748ca3bf2d170708f263693e8579e6722389d0efmtkleinclass RasterSink : public Sink {
186748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
187748ca3bf2d170708f263693e8579e6722389d0efmtklein    explicit RasterSink(SkColorType);
188748ca3bf2d170708f263693e8579e6722389d0efmtklein
18936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
19036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
19136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "png"; }
192748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
193748ca3bf2d170708f263693e8579e6722389d0efmtklein    SkColorType    fColorType;
194748ca3bf2d170708f263693e8579e6722389d0efmtklein};
195748ca3bf2d170708f263693e8579e6722389d0efmtklein
1969c3f17d6e859a11535f40497cb9f6e777d15f62emtkleinclass SKPSink : public Sink {
1979c3f17d6e859a11535f40497cb9f6e777d15f62emtkleinpublic:
1989c3f17d6e859a11535f40497cb9f6e777d15f62emtklein    SKPSink();
1999c3f17d6e859a11535f40497cb9f6e777d15f62emtklein
20036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
20136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
20236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "skp"; }
2039c3f17d6e859a11535f40497cb9f6e777d15f62emtklein};
2049c3f17d6e859a11535f40497cb9f6e777d15f62emtklein
2058a4527e98a57b1d2dd248a635f0c4fa227be2089mtkleinclass SVGSink : public Sink {
2068a4527e98a57b1d2dd248a635f0c4fa227be2089mtkleinpublic:
2078a4527e98a57b1d2dd248a635f0c4fa227be2089mtklein    SVGSink();
2088a4527e98a57b1d2dd248a635f0c4fa227be2089mtklein
20936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
21036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int enclave() const override { return kAnyThread_Enclave; }
21136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return "svg"; }
2128a4527e98a57b1d2dd248a635f0c4fa227be2089mtklein};
2138a4527e98a57b1d2dd248a635f0c4fa227be2089mtklein
2148a4527e98a57b1d2dd248a635f0c4fa227be2089mtklein
215748ca3bf2d170708f263693e8579e6722389d0efmtklein/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
216748ca3bf2d170708f263693e8579e6722389d0efmtklein
2177882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass Via : public Sink {
218748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
2197882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit Via(Sink* sink) : fSink(sink) {}
22036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* fileExtension() const override { return fSink->fileExtension(); }
2217882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    int               enclave() const override { return fSink->enclave(); }
2227882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinprotected:
223748ca3bf2d170708f263693e8579e6722389d0efmtklein    SkAutoTDelete<Sink> fSink;
224748ca3bf2d170708f263693e8579e6722389d0efmtklein};
225748ca3bf2d170708f263693e8579e6722389d0efmtklein
2267882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaMatrix : public Via {
227d603b22903bf7c023226bf52bd7c1f49a9bee1bfmtkleinpublic:
2287882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    ViaMatrix(SkMatrix, Sink*);
22936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
230d603b22903bf7c023226bf52bd7c1f49a9bee1bfmtkleinprivate:
2317882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    const SkMatrix fMatrix;
232d603b22903bf7c023226bf52bd7c1f49a9bee1bfmtklein};
233d603b22903bf7c023226bf52bd7c1f49a9bee1bfmtklein
2347882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaUpright : public Via {
235748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
2367882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    ViaUpright(SkMatrix, Sink*);
23736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
238748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
2397882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    const SkMatrix fMatrix;
240748ca3bf2d170708f263693e8579e6722389d0efmtklein};
241748ca3bf2d170708f263693e8579e6722389d0efmtklein
2427882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaPipe : public Via {
24306a22f618cd2adbbd33634a701b5cf8353886d63reedpublic:
2447882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit ViaPipe(Sink* sink) : Via(sink) {}
24506a22f618cd2adbbd33634a701b5cf8353886d63reed    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
24606a22f618cd2adbbd33634a701b5cf8353886d63reed};
24706a22f618cd2adbbd33634a701b5cf8353886d63reed
2487882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaDeferred : public Via {
249748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
2507882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit ViaDeferred(Sink* sink) : Via(sink) {}
2517882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
2527882924c10fadaed427b6aa65dc7aa6577b94f32mtklein};
253748ca3bf2d170708f263693e8579e6722389d0efmtklein
2547882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaSerialization : public Via {
2557882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinpublic:
2567882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit ViaSerialization(Sink* sink) : Via(sink) {}
25736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
258748ca3bf2d170708f263693e8579e6722389d0efmtklein};
259748ca3bf2d170708f263693e8579e6722389d0efmtklein
2607882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaTiles : public Via {
261748ca3bf2d170708f263693e8579e6722389d0efmtkleinpublic:
262748ca3bf2d170708f263693e8579e6722389d0efmtklein    ViaTiles(int w, int h, SkBBHFactory*, Sink*);
26336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
264748ca3bf2d170708f263693e8579e6722389d0efmtkleinprivate:
265748ca3bf2d170708f263693e8579e6722389d0efmtklein    const int                   fW, fH;
266748ca3bf2d170708f263693e8579e6722389d0efmtklein    SkAutoTDelete<SkBBHFactory> fFactory;
267748ca3bf2d170708f263693e8579e6722389d0efmtklein};
268748ca3bf2d170708f263693e8579e6722389d0efmtklein
2697882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaSecondPicture : public Via {
270b7e8d69fc21a3043348fd9b76876471e0a6ae7femtkleinpublic:
2717882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit ViaSecondPicture(Sink* sink) : Via(sink) {}
272b7e8d69fc21a3043348fd9b76876471e0a6ae7femtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
273b7e8d69fc21a3043348fd9b76876471e0a6ae7femtklein};
274b7e8d69fc21a3043348fd9b76876471e0a6ae7femtklein
2757882924c10fadaed427b6aa65dc7aa6577b94f32mtkleinclass ViaSingletonPictures : public Via {
276d31c13d0441aecc8b2a4fa4f45fd5e59584cb3eamtkleinpublic:
2777882924c10fadaed427b6aa65dc7aa6577b94f32mtklein    explicit ViaSingletonPictures(Sink* sink) : Via(sink) {}
278d31c13d0441aecc8b2a4fa4f45fd5e59584cb3eamtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
279d31c13d0441aecc8b2a4fa4f45fd5e59584cb3eamtklein};
280d31c13d0441aecc8b2a4fa4f45fd5e59584cb3eamtklein
2816fbf4b3a7f0a3304649c482ab0a911dc147a6825mtkleinclass ViaTwice : public Via {
2826fbf4b3a7f0a3304649c482ab0a911dc147a6825mtkleinpublic:
2836fbf4b3a7f0a3304649c482ab0a911dc147a6825mtklein    explicit ViaTwice(Sink* sink) : Via(sink) {}
2846fbf4b3a7f0a3304649c482ab0a911dc147a6825mtklein    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
2856fbf4b3a7f0a3304649c482ab0a911dc147a6825mtklein};
2866fbf4b3a7f0a3304649c482ab0a911dc147a6825mtklein
287748ca3bf2d170708f263693e8579e6722389d0efmtklein}  // namespace DM
288748ca3bf2d170708f263693e8579e6722389d0efmtklein
289748ca3bf2d170708f263693e8579e6722389d0efmtklein#endif//DMSrcSink_DEFINED
290