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 15 class 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 */ 23 class SK_API SkComposeShader : public SkShader { 24 public: 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 getShaderContextA()46 SkShader::Context* getShaderContextA() const { return fShaderContextA; } getShaderContextB()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 getShaderA()61 SkShader* getShaderA() { return fShaderA; } getShaderB()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 70 protected: 71 SkComposeShader(SkReadBuffer& ); 72 void flatten(SkWriteBuffer&) const override; 73 Context* onCreateContext(const ContextRec&, void*) const override; 74 75 private: 76 SkShader* fShaderA; 77 SkShader* fShaderB; 78 SkXfermode* fMode; 79 80 typedef SkShader INHERITED; 81 }; 82 83 #endif 84