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 coposition 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 of 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 // override 38 virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix); 39 virtual void shadeSpan(int x, int y, SkPMColor result[], int count); 40 virtual void beginSession(); 41 virtual void endSession(); 42 43protected: 44 SkComposeShader(SkFlattenableReadBuffer& ); 45 virtual void flatten(SkFlattenableWriteBuffer& ); 46 virtual Factory getFactory() { return CreateProc; } 47 48private: 49 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 50 return SkNEW_ARGS(SkComposeShader, (buffer)); } 51 52 SkShader* fShaderA; 53 SkShader* fShaderB; 54 SkXfermode* fMode; 55 56 typedef SkShader INHERITED; 57}; 58 59#endif 60