1 /* 2 * Copyright 2006 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkXfermodePriv_DEFINED 9 #define SkXfermodePriv_DEFINED 10 11 #include "include/core/SkBlendMode.h" 12 #include "include/core/SkColor.h" 13 #include "include/core/SkRefCnt.h" 14 15 class GrFragmentProcessor; 16 class GrTexture; 17 class GrXPFactory; 18 class SkRasterPipeline; 19 class SkString; 20 21 class SkXfermode : public SkRefCnt { 22 public: 23 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 24 const SkAlpha aa[]) const = 0; 25 26 /** Return an SkXfermode object for the specified mode. 27 */ 28 static sk_sp<SkXfermode> Make(SkBlendMode); 29 30 /** 31 * Skia maintains global xfermode objects corresponding to each BlendMode. This returns a 32 * ptr to that global xfermode (or null if the mode is srcover). Thus the caller may use 33 * the returned ptr, but it should leave its refcnt untouched. 34 */ Peek(SkBlendMode mode)35 static SkXfermode* Peek(SkBlendMode mode) { 36 sk_sp<SkXfermode> xfer = Make(mode); 37 if (!xfer) { 38 SkASSERT(SkBlendMode::kSrcOver == mode); 39 return nullptr; 40 } 41 SkASSERT(!xfer->unique()); 42 return xfer.get(); 43 } 44 45 enum SrcColorOpacity { 46 // The src color is known to be opaque (alpha == 255) 47 kOpaque_SrcColorOpacity = 0, 48 // The src color is known to be fully transparent (color == 0) 49 kTransparentBlack_SrcColorOpacity = 1, 50 // The src alpha is known to be fully transparent (alpha == 0) 51 kTransparentAlpha_SrcColorOpacity = 2, 52 // The src color opacity is unknown 53 kUnknown_SrcColorOpacity = 3 54 }; 55 56 static bool IsOpaque(SkBlendMode, SrcColorOpacity); 57 58 protected: SkXfermode()59 SkXfermode() {} 60 }; 61 62 #endif 63