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 composition 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 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 size_t contextSize() const override; 38 39 class ComposeShaderContext : public SkShader::Context { 40 public: 41 // When this object gets destroyed, it will call contextA and contextB's destructor 42 // but it will NOT free the memory. 43 ComposeShaderContext(const SkComposeShader&, const ContextRec&, 44 SkShader::Context* contextA, SkShader::Context* contextB); 45 46 SkShader::Context* getShaderContextA() const { return fShaderContextA; } 47 SkShader::Context* getShaderContextB() const { return fShaderContextB; } 48 49 virtual ~ComposeShaderContext(); 50 51 void shadeSpan(int x, int y, SkPMColor[], int count) override; 52 53 private: 54 SkShader::Context* fShaderContextA; 55 SkShader::Context* fShaderContextB; 56 57 typedef SkShader::Context INHERITED; 58 }; 59 60#ifdef SK_DEBUG 61 SkShader* getShaderA() { return fShaderA; } 62 SkShader* getShaderB() { return fShaderB; } 63#endif 64 65 bool asACompose(ComposeRec* rec) const override; 66 67 SK_TO_STRING_OVERRIDE() 68 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader) 69 70protected: 71 SkComposeShader(SkReadBuffer& ); 72 void flatten(SkWriteBuffer&) const override; 73 Context* onCreateContext(const ContextRec&, void*) const override; 74 75private: 76 SkShader* fShaderA; 77 SkShader* fShaderB; 78 SkXfermode* fMode; 79 80 typedef SkShader INHERITED; 81}; 82 83#endif 84