11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkComposeShader_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkComposeShader_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkShader.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkXfermode;
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////////////////
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkComposeShader
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    This subclass of shader returns the coposition of two other shaders, combined by
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a xfermode.
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SK_API SkComposeShader : public SkShader {
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Create a new compose shader, given shaders A, B, and a combining xfermode mode.
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        When the xfermode is called, it will be given the result from shader A as its
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "dst", and the result of from shader B as its "src".
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        mode->xfer32(sA_result, sB_result, ...)
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param shaderA  The colors from this shader are seen as the "dst" by the xfermode
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param shaderB  The colors from this shader are seen as the "src" by the xfermode
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param mode     The xfermode that combines the colors from the two shaders. If mode
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        is null, then SRC_OVER is assumed.
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode = NULL);
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkComposeShader();
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // override
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix);
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void shadeSpan(int x, int y, SkPMColor result[], int count);
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void beginSession();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void endSession();
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkComposeShader(SkFlattenableReadBuffer& );
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void flatten(SkFlattenableWriteBuffer& );
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual Factory getFactory() { return CreateProc; }
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkNEW_ARGS(SkComposeShader, (buffer)); }
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShader*   fShaderA;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShader*   fShaderB;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode* fMode;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkShader INHERITED;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
60