1 /*
2  * Copyright 2015 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 GrBlendFragmentProcessor_DEFINED
9 #define GrBlendFragmentProcessor_DEFINED
10 
11 #include "include/core/SkBlendMode.h"
12 #include "include/core/SkRefCnt.h"
13 
14 class GrFragmentProcessor;
15 
16 namespace GrBlendFragmentProcessor {
17 
18 // TODO(skbug.com/10457): Standardize on a single blend behavior
19 enum class BlendBehavior {
20     // Picks "ComposeOne" or "ComposeTwo" automatically depending on presence of src/dst FPs.
21     kDefault = 0,
22 
23     // half(1) is passed as the input color to child FPs. No alpha channel trickery.
24     kComposeOneBehavior,
25 
26     // fInputColor.rgb1 is passed as the input color to child FPs. Alpha is manually blended.
27     kComposeTwoBehavior,
28 
29     // half(1) is passed to src; fInputColor is passed to dst. No alpha channel trickery.
30     kSkModeBehavior,
31 
32     kLastBlendBehavior = kSkModeBehavior,
33 };
34 
35 /** Blends src and dst inputs according to the blend mode.
36  *  If either input is null, fInputColor is used instead.
37  */
38 std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> src,
39                                           std::unique_ptr<GrFragmentProcessor> dst,
40                                           SkBlendMode mode,
41                                           BlendBehavior behavior = BlendBehavior::kDefault);
42 
43 }  // namespace GrBlendFragmentProcessor
44 
45 #endif
46