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