Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkBlendMode.h
Go to the documentation of this file.
1/*
2 * Copyright 2016 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 SkBlendMode_DEFINED
9#define SkBlendMode_DEFINED
10
12
13/**
14 * Blends are operators that take in two colors (source, destination) and return a new color.
15 * Many of these operate the same on all 4 components: red, green, blue, alpha. For these,
16 * we just document what happens to one component, rather than naming each one separately.
17 *
18 * Different SkColorTypes have different representations for color components:
19 * 8-bit: 0..255
20 * 6-bit: 0..63
21 * 5-bit: 0..31
22 * 4-bit: 0..15
23 * floats: 0...1
24 *
25 * The documentation is expressed as if the component values are always 0..1 (floats).
26 *
27 * For brevity, the documentation uses the following abbreviations
28 * s : source
29 * d : destination
30 * sa : source alpha
31 * da : destination alpha
32 *
33 * Results are abbreviated
34 * r : if all 4 components are computed in the same manner
35 * ra : result alpha component
36 * rc : result "color": red, green, blue components
37 */
38enum class SkBlendMode {
39 kClear, //!< r = 0
40 kSrc, //!< r = s
41 kDst, //!< r = d
42 kSrcOver, //!< r = s + (1-sa)*d
43 kDstOver, //!< r = d + (1-da)*s
44 kSrcIn, //!< r = s * da
45 kDstIn, //!< r = d * sa
46 kSrcOut, //!< r = s * (1-da)
47 kDstOut, //!< r = d * (1-sa)
48 kSrcATop, //!< r = s*da + d*(1-sa)
49 kDstATop, //!< r = d*sa + s*(1-da)
50 kXor, //!< r = s*(1-da) + d*(1-sa)
51 kPlus, //!< r = min(s + d, 1)
52 kModulate, //!< r = s*d
53 kScreen, //!< r = s + d - s*d
54
55 kOverlay, //!< multiply or screen, depending on destination
56 kDarken, //!< rc = s + d - max(s*da, d*sa), ra = kSrcOver
57 kLighten, //!< rc = s + d - min(s*da, d*sa), ra = kSrcOver
58 kColorDodge, //!< brighten destination to reflect source
59 kColorBurn, //!< darken destination to reflect source
60 kHardLight, //!< multiply or screen, depending on source
61 kSoftLight, //!< lighten or darken, depending on source
62 kDifference, //!< rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver
63 kExclusion, //!< rc = s + d - two(s*d), ra = kSrcOver
64 kMultiply, //!< r = s*(1-da) + d*(1-sa) + s*d
65
66 kHue, //!< hue of source with saturation and luminosity of destination
67 kSaturation, //!< saturation of source with hue and luminosity of destination
68 kColor, //!< hue and saturation of source with luminosity of destination
69 kLuminosity, //!< luminosity of source with hue and saturation of destination
70
71 kLastCoeffMode = kScreen, //!< last porter duff blend mode
72 kLastSeparableMode = kMultiply, //!< last blend mode operating separately on components
73 kLastMode = kLuminosity, //!< last valid value
74};
75
76static constexpr int kSkBlendModeCount = static_cast<int>(SkBlendMode::kLastMode) + 1;
77
78/**
79 * For Porter-Duff SkBlendModes (those <= kLastCoeffMode), these coefficients describe the blend
80 * equation used. Coefficient-based blend modes specify an equation:
81 * ('dstCoeff' * dst + 'srcCoeff' * src), where the coefficient values are constants, functions of
82 * the src or dst alpha, or functions of the src or dst color.
83 */
84enum class SkBlendModeCoeff {
85 kZero, /** 0 */
86 kOne, /** 1 */
87 kSC, /** src color */
88 kISC, /** inverse src color (i.e. 1 - sc) */
89 kDC, /** dst color */
90 kIDC, /** inverse dst color (i.e. 1 - dc) */
91 kSA, /** src alpha */
92 kISA, /** inverse src alpha (i.e. 1 - sa) */
93 kDA, /** dst alpha */
94 kIDA, /** inverse dst alpha (i.e. 1 - da) */
95
97};
98
99/**
100 * Returns true if 'mode' is a coefficient-based blend mode (<= kLastCoeffMode). If true is
101 * returned, the mode's src and dst coefficient functions are set in 'src' and 'dst'.
102 */
104
105
106/** Returns name of blendMode as null-terminated C string.
107
108 @return C string
109*/
110SK_API const char* SkBlendMode_Name(SkBlendMode blendMode);
111
112#endif
#define SK_API
Definition SkAPI.h:35
SK_API bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff *src, SkBlendModeCoeff *dst)
SK_API const char * SkBlendMode_Name(SkBlendMode blendMode)
static constexpr int kSkBlendModeCount
Definition SkBlendMode.h:76
SkBlendMode
Definition SkBlendMode.h:38
@ kSrcOut
r = s * (1-da)
@ kExclusion
rc = s + d - two(s*d), ra = kSrcOver
@ kSaturation
saturation of source with hue and luminosity of destination
@ kColorBurn
darken destination to reflect source
@ kPlus
r = min(s + d, 1)
@ kLighten
rc = s + d - min(s*da, d*sa), ra = kSrcOver
@ kHue
hue of source with saturation and luminosity of destination
@ kDstIn
r = d * sa
@ kModulate
r = s*d
@ kMultiply
r = s*(1-da) + d*(1-sa) + s*d
@ kLastCoeffMode
last porter duff blend mode
@ kColorDodge
brighten destination to reflect source
@ kScreen
r = s + d - s*d
@ kSrcOver
r = s + (1-sa)*d
@ kXor
r = s*(1-da) + d*(1-sa)
@ kLastSeparableMode
last blend mode operating separately on components
@ kLuminosity
luminosity of source with hue and saturation of destination
@ kSoftLight
lighten or darken, depending on source
@ kDifference
rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver
@ kOverlay
multiply or screen, depending on destination
@ kSrcATop
r = s*da + d*(1-sa)
@ kDstATop
r = d*sa + s*(1-da)
@ kDstOver
r = d + (1-da)*s
@ kLastMode
last valid value
@ kColor
hue and saturation of source with luminosity of destination
@ kHardLight
multiply or screen, depending on source
@ kDstOut
r = d * (1-sa)
@ kDarken
rc = s + d - max(s*da, d*sa), ra = kSrcOver
@ kSrcIn
r = s * da
@ kClear
r = 0
SkBlendModeCoeff
Definition SkBlendMode.h:84