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 coposition 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 of 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    // override
38    virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix);
39    virtual void shadeSpan(int x, int y, SkPMColor result[], int count);
40    virtual void beginSession();
41    virtual void endSession();
42
43protected:
44    SkComposeShader(SkFlattenableReadBuffer& );
45    virtual void flatten(SkFlattenableWriteBuffer& );
46    virtual Factory getFactory() { return CreateProc; }
47
48private:
49    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
50        return SkNEW_ARGS(SkComposeShader, (buffer)); }
51
52    SkShader*   fShaderA;
53    SkShader*   fShaderB;
54    SkXfermode* fMode;
55
56    typedef SkShader INHERITED;
57};
58
59#endif
60