Revert "replace SkXfermode obj with SkBlendMode enum in paints"
[platform/upstream/libSkiaSharp.git] / include / gpu / effects / GrPorterDuffXferProcessor.h
1 /*
2  * Copyright 2014 Google Inc.
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 GrPorterDuffXferProcessor_DEFINED
9 #define GrPorterDuffXferProcessor_DEFINED
10
11 #include "GrTypes.h"
12 #include "GrXferProcessor.h"
13 #include "SkXfermode.h"
14
15 class GrProcOptInfo;
16
17 class GrPorterDuffXPFactory : public GrXPFactory {
18 public:
19     static sk_sp<GrXPFactory> Make(SkXfermode::Mode mode);
20
21     void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
22                                   GrXPFactory::InvariantBlendedColor*) const override;
23
24
25     /** Because src-over is so common we special case it for performance reasons. If this returns
26         null then the SimpleSrcOverXP() below should be used. */
27     static GrXferProcessor* CreateSrcOverXferProcessor(const GrCaps& caps,
28                                                        const GrPipelineOptimizations& optimizations,
29                                                        bool hasMixedSamples,
30                                                        const GrXferProcessor::DstTexture*);
31     /** This XP implements non-LCD src-over using hw blend with no optimizations. It is returned
32         by reference because it is global and its ref-cnting methods are not thread safe. */
33     static const GrXferProcessor& SimpleSrcOverXP();
34
35     static inline void SrcOverInvariantBlendedColor(
36                                                 GrColor inputColor,
37                                                 GrColorComponentFlags validColorFlags,
38                                                 bool isOpaque,
39                                                 GrXPFactory::InvariantBlendedColor* blendedColor) {
40         if (!isOpaque) {
41             blendedColor->fWillBlendWithDst = true;
42             blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags;
43             return;
44         }
45         blendedColor->fWillBlendWithDst = false;
46
47         blendedColor->fKnownColor = inputColor;
48         blendedColor->fKnownColorFlags = validColorFlags;
49     }
50
51     static bool SrcOverWillNeedDstTexture(const GrCaps&, const GrPipelineOptimizations&);
52
53 private:
54     GrPorterDuffXPFactory(SkXfermode::Mode);
55
56     GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
57                                            const GrPipelineOptimizations& optimizations,
58                                            bool hasMixedSamples,
59                                            const DstTexture*) const override;
60
61     bool onWillReadDstColor(const GrCaps&, const GrPipelineOptimizations&) const override;
62
63     bool onIsEqual(const GrXPFactory& xpfBase) const override {
64         const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>();
65         return fXfermode == xpf.fXfermode;
66     }
67
68     GR_DECLARE_XP_FACTORY_TEST;
69     static void TestGetXPOutputTypes(const GrXferProcessor*, int* outPrimary, int* outSecondary);
70
71     SkXfermode::Mode fXfermode;
72
73     friend class GrPorterDuffTest; // for TestGetXPOutputTypes()
74     typedef GrXPFactory INHERITED;
75 };
76
77 #endif