| 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
|
|
|