1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkPictureShader_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkPictureShader_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAtomics.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShaderBase.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkArenaAlloc;
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkBitmap;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPicture;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * An SkPictureShader can be used to draw SkPicture-based patterns.
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The SkPicture is first rendered into a tile, which is then used to shade the area according
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * to specified tiling rules.
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPictureShader : public SkShaderBase {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~SkPictureShader() override;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkShader> Make(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*,
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                const SkRect*);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SK_TO_STRING_OVERRIDE()
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader)
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPictureShader(SkReadBuffer&);
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void flatten(SkWriteBuffer&) const override;
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onAppendStages(const StageRec&) const override;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onIsRasterPipelineOnly(const SkMatrix&) const override;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPictureShader(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*, const SkRect*,
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    sk_sp<SkColorSpace>);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkShader> refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix,
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    SkColorSpace* dstColorSpace,
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const int maxTextureSize = 0) const;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    class PictureShaderContext : public Context {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public:
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        PictureShaderContext(
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkPictureShader&, const ContextRec&, sk_sp<SkShader> bitmapShader, SkArenaAlloc*);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        uint32_t getFlags() const override;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkShader>         fBitmapShader;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkShaderBase::Context*  fBitmapShaderContext;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void*                   fBitmapShaderContextStorage;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        typedef Context INHERITED;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPicture>    fPicture;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect              fTile;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TileMode            fTmx, fTmy;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Should never be set by a public constructor.  This is only used when onMakeColorSpace()
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // forces a deferred color space xform.
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkColorSpace>    fColorSpace;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const uint32_t         fUniqueID;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    mutable SkAtomic<bool> fAddedToCache;
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkShaderBase INHERITED;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif // SkPictureShader_DEFINED
85