aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm/DMSrcSink.h
diff options
context:
space:
mode:
Diffstat (limited to 'dm/DMSrcSink.h')
-rw-r--r--dm/DMSrcSink.h177
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