1c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org/*
2c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * Copyright 2014 Google Inc.
3c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org *
4c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * found in the LICENSE file.
6c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org */
7c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
8c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#ifndef SkPictureShader_DEFINED
9c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#define SkPictureShader_DEFINED
10c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
11c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "SkShader.h"
12c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
13c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgclass SkBitmap;
14c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgclass SkPicture;
15c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
16c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org/*
17c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * An SkPictureShader can be used to draw SkPicture-based patterns.
18c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org *
19c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * The SkPicture is first rendered into a tile, which is then used to shade the area according
20c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * to specified tiling rules.
21c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org */
22c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgclass SkPictureShader : public SkShader {
23c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgpublic:
24b5f7826c51af2862aebcabe61e1ba684f925e488fmalita    static SkPictureShader* Create(const SkPicture*, TileMode, TileMode, const SkMatrix*,
25b5f7826c51af2862aebcabe61e1ba684f925e488fmalita                                   const SkRect*);
26f47e70712b964b5360a3fec9e5e84bb594fc1f02fmalita    virtual ~SkPictureShader();
27c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
2836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    size_t contextSize() const override;
29c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
30c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SK_TO_STRING_OVERRIDE()
31c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader)
32c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
335531d51ce7426bdae7563547326fcf0bf926a083joshualitt    bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix& viewM, const SkMatrix*,
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                             GrColor*, GrFragmentProcessor**) const override;
35c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
36c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgprotected:
37c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SkPictureShader(SkReadBuffer&);
3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void flatten(SkWriteBuffer&) const override;
3936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    Context* onCreateContext(const ContextRec&, void* storage) const override;
40c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
41c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgprivate:
42b5f7826c51af2862aebcabe61e1ba684f925e488fmalita    SkPictureShader(const SkPicture*, TileMode, TileMode, const SkMatrix*, const SkRect*);
43c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
44b9ed8845783ec3c59b2b185d26801f251adbf68dgen.kim    SkShader* refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix, const int maxTextureSize = 0) const;
45c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
46f47e70712b964b5360a3fec9e5e84bb594fc1f02fmalita    const SkPicture* fPicture;
47f47e70712b964b5360a3fec9e5e84bb594fc1f02fmalita    SkRect           fTile;
48f47e70712b964b5360a3fec9e5e84bb594fc1f02fmalita    TileMode         fTmx, fTmy;
49c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
50ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    class PictureShaderContext : public SkShader::Context {
51ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    public:
52ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        static Context* Create(void* storage, const SkPictureShader&, const ContextRec&,
53ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org                               SkShader* bitmapShader);
54ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org
55ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        virtual ~PictureShaderContext();
56edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        uint32_t getFlags() const override;
58edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
5936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        ShadeProc asAShadeProc(void** ctx) override;
6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein        void shadeSpan16(int x, int y, uint16_t dstC[], int count) override;
62edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
63ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    private:
64ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        PictureShaderContext(const SkPictureShader&, const ContextRec&, SkShader* bitmapShader);
65ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org
66ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        SkAutoTUnref<SkShader>  fBitmapShader;
67ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        SkShader::Context*      fBitmapShaderContext;
68ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        void*                   fBitmapShaderContextStorage;
69edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
70ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org        typedef SkShader::Context INHERITED;
71ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    };
72edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
73c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    typedef SkShader INHERITED;
74c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org};
75c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
76c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#endif // SkPictureShader_DEFINED
77