#ifndef DMSrcSink_DEFINED #define DMSrcSink_DEFINED #include "DMGpuSupport.h" #include "SkBBHFactory.h" #include "SkBBoxHierarchy.h" #include "SkBitmap.h" #include "SkCanvas.h" #include "SkData.h" #include "SkGPipe.h" #include "SkPicture.h" #include "SkStream.h" #include "gm.h" namespace DM { // This is just convenience. It lets you use either return "foo" or return SkStringPrintf(...). struct ImplicitString : public SkString { template ImplicitString(const T& s) : SkString(s) {} }; typedef ImplicitString Error; typedef ImplicitString Name; struct Src { // All Srcs must be thread safe. virtual ~Src() {} virtual Error SK_WARN_UNUSED_RESULT draw(SkCanvas*) const = 0; virtual SkISize size() const = 0; virtual Name name() const = 0; }; struct Sink { virtual ~Sink() {} // You may write to either the bitmap or stream. virtual Error SK_WARN_UNUSED_RESULT draw(const Src&, SkBitmap*, SkWStream*) const = 0; // Sinks in the same enclave (except kAnyThread_Enclave) will run serially on the same thread. virtual int enclave() const = 0; // File extension for the content draw() outputs, e.g. "png", "pdf". virtual const char* fileExtension() const = 0; }; enum { kAnyThread_Enclave, kGPUSink_Enclave, kPDFSink_Enclave }; static const int kNumEnclaves = kPDFSink_Enclave + 1; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ void SafeUnref(SkPicture*); // These need external linkage (and specific types). void SafeUnref(SkData*); class GMSrc : public Src { public: explicit GMSrc(skiagm::GMRegistry::Factory); Error draw(SkCanvas*) const SK_OVERRIDE; SkISize size() const SK_OVERRIDE; Name name() const SK_OVERRIDE; private: skiagm::GMRegistry::Factory fFactory; }; class ImageSrc : public Src { public: explicit ImageSrc(SkString path, int subsets = 0); Error draw(SkCanvas*) const SK_OVERRIDE; SkISize size() const SK_OVERRIDE; Name name() const SK_OVERRIDE; private: SkString fPath; int fSubsets; SkLazyPtr fEncoded; }; class SKPSrc : public Src { public: explicit SKPSrc(SkString path); Error draw(SkCanvas*) const SK_OVERRIDE; SkISize size() const SK_OVERRIDE; Name name() const SK_OVERRIDE; private: SkString fPath; SkLazyPtr fPic; }; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ class GPUSink : public Sink { public: GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText, bool threaded); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE; const char* fileExtension() const SK_OVERRIDE { return "png"; } private: GrContextFactory::GLContextType fContextType; GrGLStandard fGpuAPI; int fSampleCount; bool fUseDFText; bool fThreaded; }; class PDFSink : public Sink { public: PDFSink(); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return kPDFSink_Enclave; } const char* fileExtension() const SK_OVERRIDE { return "pdf"; } }; class RasterSink : public Sink { public: explicit RasterSink(SkColorType); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return kAnyThread_Enclave; } const char* fileExtension() const SK_OVERRIDE { return "png"; } private: SkColorType fColorType; }; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ class ViaMatrix : public Sink { public: ViaMatrix(SkMatrix, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return fSink->enclave(); } const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); } private: SkMatrix fMatrix; SkAutoTDelete fSink; }; class ViaPipe : public Sink { public: ViaPipe(int flags, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return fSink->enclave(); } const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); } private: SkGPipeWriter::Flags fFlags; SkAutoTDelete fSink; }; class ViaSerialization : public Sink { public: explicit ViaSerialization(Sink*); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return fSink->enclave(); } const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); } private: SkAutoTDelete fSink; }; class ViaTiles : public Sink { public: ViaTiles(int w, int h, SkBBHFactory*, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*) const SK_OVERRIDE; int enclave() const SK_OVERRIDE { return fSink->enclave(); } const char* fileExtension() const SK_OVERRIDE { return fSink->fileExtension(); } private: const int fW, fH; SkAutoTDelete fFactory; SkAutoTDelete fSink; }; } // namespace DM #endif//DMSrcSink_DEFINED