Index: dm/DMSrcSink.h |
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3f88f6350b8d48c3b6e3b5b5c0cf54bccee88f65 |
--- /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 |