• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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