SkComposeShader.h revision 0910916c0f7b951ee55c4b7c6358295b9bca0565
1ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall/*
2ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * Copyright (C) 2006 The Android Open Source Project
3ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall *
4ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
5ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * you may not use this file except in compliance with the License.
6ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * You may obtain a copy of the License at
7ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall *
8ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
9ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall *
10ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * Unless required by applicable law or agreed to in writing, software
11ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
12ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * See the License for the specific language governing permissions and
14ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall * limitations under the License.
15ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall */
16ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
17ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#ifndef SkComposeShader_DEFINED
18ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#define SkComposeShader_DEFINED
19ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
20ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "SkShader.h"
21ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
22ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallclass SkXfermode;
23ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
24ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall///////////////////////////////////////////////////////////////////////////////////////////
25dca7f2a6ac56567850e0e03a063e1739e43c5ce2Jesse Hall
26ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall/** \class SkComposeShader
27ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    This subclass of shader returns the coposition of two other shaders, combined by
28ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    a xfermode.
29ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall*/
30dca7f2a6ac56567850e0e03a063e1739e43c5ce2Jesse Hallclass SkComposeShader : public SkShader {
31ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallpublic:
32dca7f2a6ac56567850e0e03a063e1739e43c5ce2Jesse Hall    /** Create a new compose shader, given shaders A, B, and a combining xfermode mode.
33ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        When the xfermode is called, it will be given the result from shader A as its
34ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        "dst", and the result of from shader B as its "src".
35ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        mode->xfer32(sA_result, sB_result, ...)
36ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        @param shaderA  The colors from this shader are seen as the "dst" by the xfermode
37ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        @param shaderB  The colors from this shader are seen as the "src" by the xfermode
38ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall        @param mode     The xfermode that combines the colors from the two shaders. If mode
39ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall                        is null, then SRC_OVER is assumed.
40ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    */
41ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode = NULL);
42ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    virtual ~SkComposeShader();
43ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
44ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    // override
45ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix);
46ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    virtual void shadeSpan(int x, int y, SkPMColor result[], int count);
47ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    virtual void beginSession();
48ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    virtual void endSession();
49ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall
50ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallprotected:
51ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall    SkComposeShader(SkFlattenableReadBuffer& );
52    virtual void flatten(SkFlattenableWriteBuffer& );
53    virtual Factory getFactory() { return CreateProc; }
54
55private:
56    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
57        return SkNEW_ARGS(SkComposeShader, (buffer)); }
58
59    SkShader*   fShaderA;
60    SkShader*   fShaderB;
61    SkXfermode* fMode;
62
63    typedef SkShader INHERITED;
64};
65
66#endif
67