diff options
Diffstat (limited to 'dm/DMSrcSink.h')
-rw-r--r-- | dm/DMSrcSink.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h new file mode 100644 index 0000000000..3f88f6350b --- /dev/null +++ b/dm/DMSrcSink.h @@ -0,0 +1,177 @@ +#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 <typename T> + 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<SkData, SafeUnref> 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<SkPicture, SafeUnref> fPic; +}; + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +class GPUSink : public Sink { +public: + GPUSink(GrContextFactory::GLContextType, GrGLStandard, int samples, bool dfText); + + 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; +}; + +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<Sink> 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<Sink> 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<Sink> 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<SkBBHFactory> fFactory; + SkAutoTDelete<Sink> fSink; +}; + +} // namespace DM + +#endif//DMSrcSink_DEFINED |