Home | History | Annotate | Download | only in core
      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 "SkBlendMode.h"
     12 #include "SkColor.h"
     13 #include "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      */
     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:
     59     SkXfermode() {}
     60 };
     61 
     62 #endif
     63