1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkComposeShader_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkComposeShader_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkXfermode;
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////////////////
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkComposeShader
205d0b150257f9a630154a39ab6aa5cffc850d4622commit-bot@chromium.org    This subclass of shader returns the composition of two other shaders, combined by
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    a xfermode.
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
23c7d9f9d8ae3283accf17e77e70fc64cfbfd8121actguil@chromium.orgclass SK_API SkComposeShader : public SkShader {
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Create a new compose shader, given shaders A, B, and a combining xfermode mode.
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        When the xfermode is called, it will be given the result from shader A as its
275d0b150257f9a630154a39ab6aa5cffc850d4622commit-bot@chromium.org        "dst", and the result from shader B as its "src".
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        mode->xfer32(sA_result, sB_result, ...)
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param shaderA  The colors from this shader are seen as the "dst" by the xfermode
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param shaderB  The colors from this shader are seen as the "src" by the xfermode
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        @param mode     The xfermode that combines the colors from the two shaders. If mode
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        is null, then SRC_OVER is assumed.
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposeShader(SkShader* sA, SkShader* sB, SkXfermode* mode = NULL);
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkComposeShader();
36fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
3787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    virtual size_t contextSize() const SK_OVERRIDE;
3887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
3987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    class ComposeShaderContext : public SkShader::Context {
4087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    public:
4187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        // When this object gets destroyed, it will call contextA and contextB's destructor
4287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        // but it will NOT free the memory.
43e901b6de3ef8dea842008a08fc81e92fb1478d61commit-bot@chromium.org        ComposeShaderContext(const SkComposeShader&, const ContextRec&,
4487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                             SkShader::Context* contextA, SkShader::Context* contextB);
4587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
4687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        SkShader::Context* getShaderContextA() const { return fShaderContextA; }
4787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        SkShader::Context* getShaderContextB() const { return fShaderContextB; }
4887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
4987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        virtual ~ComposeShaderContext();
5087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        virtual void shadeSpan(int x, int y, SkPMColor[], int count) SK_OVERRIDE;
5287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    private:
5487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        SkShader::Context* fShaderContextA;
5587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        SkShader::Context* fShaderContextB;
5687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
5787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org        typedef SkShader::Context INHERITED;
5887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    };
5987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
6087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org#ifdef SK_DEBUG
6187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkShader* getShaderA() { return fShaderA; }
6287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkShader* getShaderB() { return fShaderB; }
6387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org#endif
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
65795905562d1bd8bbedcf47f6a00efb220ec8bbe0commit-bot@chromium.org    virtual bool asACompose(ComposeRec* rec) const SK_OVERRIDE;
66795905562d1bd8bbedcf47f6a00efb220ec8bbe0commit-bot@chromium.org
670f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org    SK_TO_STRING_OVERRIDE()
68ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader)
69ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
718b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkComposeShader(SkReadBuffer& );
728b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
73ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org    virtual Context* onCreateContext(const ContextRec&, void*) const SK_OVERRIDE;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShader*   fShaderA;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShader*   fShaderB;
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode* fMode;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkShader INHERITED;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
84