1
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#ifndef SkComposeShader_DEFINED
11#define SkComposeShader_DEFINED
12
13#include "SkShader.h"
14
15class SkXfermode;
16
17///////////////////////////////////////////////////////////////////////////////////////////
18
19/** \class SkComposeShader
20    This subclass of shader returns the composition of two other shaders, combined by
21    a xfermode.
22*/
23class SK_API SkComposeShader : public SkShader {
24public:
25    /** Create a new compose shader, given shaders A, B, and a combining xfermode mode.
26        When the xfermode is called, it will be given the result from shader A as its
27        "dst", and the result from shader B as its "src".
28        mode->xfer32(sA_result, sB_result, ...)
29        @param shaderA  The colors from this shader are seen as the "dst" by the xfermode
30        @param shaderB  The colors from this shader are seen as the "src" by the xfermode
31        @param mode     The xfermode that combines the colors from the two shaders. If mode
32                        is null, then SRC_OVER is assumed.
33    */
34    SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode = NULL);
35    virtual ~SkComposeShader();
36
37    size_t contextSize() const override;
38
39    class ComposeShaderContext : public SkShader::Context {
40    public:
41        // When this object gets destroyed, it will call contextA and contextB's destructor
42        // but it will NOT free the memory.
43        ComposeShaderContext(const SkComposeShader&, const ContextRec&,
44                             SkShader::Context* contextA, SkShader::Context* contextB);
45
46        SkShader::Context* getShaderContextA() const { return fShaderContextA; }
47        SkShader::Context* getShaderContextB() const { return fShaderContextB; }
48
49        virtual ~ComposeShaderContext();
50
51        void shadeSpan(int x, int y, SkPMColor[], int count) override;
52
53    private:
54        SkShader::Context* fShaderContextA;
55        SkShader::Context* fShaderContextB;
56
57        typedef SkShader::Context INHERITED;
58    };
59
60#ifdef SK_DEBUG
61    SkShader* getShaderA() { return fShaderA; }
62    SkShader* getShaderB() { return fShaderB; }
63#endif
64
65    bool asACompose(ComposeRec* rec) const override;
66
67    SK_TO_STRING_OVERRIDE()
68    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader)
69
70protected:
71    SkComposeShader(SkReadBuffer& );
72    void flatten(SkWriteBuffer&) const override;
73    Context* onCreateContext(const ContextRec&, void*) const override;
74
75private:
76    SkShader*   fShaderA;
77    SkShader*   fShaderB;
78    SkXfermode* fMode;
79
80    typedef SkShader INHERITED;
81};
82
83#endif
84