/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkBlendMode_DEFINED #define SkBlendMode_DEFINED #include "include/core/SkTypes.h" /** * Blends are operators that take in two colors (source, destination) and return a new color. * Many of these operate the same on all 4 components: red, green, blue, alpha. For these, * we just document what happens to one component, rather than naming each one separately. * * Different SkColorTypes have different representations for color components: * 8-bit: 0..255 * 6-bit: 0..63 * 5-bit: 0..31 * 4-bit: 0..15 * floats: 0...1 * * The documentation is expressed as if the component values are always 0..1 (floats). * * For brevity, the documentation uses the following abbreviations * s : source * d : destination * sa : source alpha * da : destination alpha * * Results are abbreviated * r : if all 4 components are computed in the same manner * ra : result alpha component * rc : result "color": red, green, blue components */ enum class SkBlendMode { kClear, //!< r = 0 kSrc, //!< r = s kDst, //!< r = d kSrcOver, //!< r = s + (1-sa)*d kDstOver, //!< r = d + (1-da)*s kSrcIn, //!< r = s * da kDstIn, //!< r = d * sa kSrcOut, //!< r = s * (1-da) kDstOut, //!< r = d * (1-sa) kSrcATop, //!< r = s*da + d*(1-sa) kDstATop, //!< r = d*sa + s*(1-da) kXor, //!< r = s*(1-da) + d*(1-sa) kPlus, //!< r = min(s + d, 1) kModulate, //!< r = s*d kScreen, //!< r = s + d - s*d kOverlay, //!< multiply or screen, depending on destination kDarken, //!< rc = s + d - max(s*da, d*sa), ra = kSrcOver kLighten, //!< rc = s + d - min(s*da, d*sa), ra = kSrcOver kColorDodge, //!< brighten destination to reflect source kColorBurn, //!< darken destination to reflect source kHardLight, //!< multiply or screen, depending on source kSoftLight, //!< lighten or darken, depending on source kDifference, //!< rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver kExclusion, //!< rc = s + d - two(s*d), ra = kSrcOver kMultiply, //!< r = s*(1-da) + d*(1-sa) + s*d kHue, //!< hue of source with saturation and luminosity of destination kSaturation, //!< saturation of source with hue and luminosity of destination kColor, //!< hue and saturation of source with luminosity of destination kLuminosity, //!< luminosity of source with hue and saturation of destination kLastCoeffMode = kScreen, //!< last porter duff blend mode kLastSeparableMode = kMultiply, //!< last blend mode operating separately on components kLastMode = kLuminosity, //!< last valid value }; static constexpr int kSkBlendModeCount = static_cast(SkBlendMode::kLastMode) + 1; /** * For Porter-Duff SkBlendModes (those <= kLastCoeffMode), these coefficients describe the blend * equation used. Coefficient-based blend modes specify an equation: * ('dstCoeff' * dst + 'srcCoeff' * src), where the coefficient values are constants, functions of * the src or dst alpha, or functions of the src or dst color. */ enum class SkBlendModeCoeff { kZero, /** 0 */ kOne, /** 1 */ kSC, /** src color */ kISC, /** inverse src color (i.e. 1 - sc) */ kDC, /** dst color */ kIDC, /** inverse dst color (i.e. 1 - dc) */ kSA, /** src alpha */ kISA, /** inverse src alpha (i.e. 1 - sa) */ kDA, /** dst alpha */ kIDA, /** inverse dst alpha (i.e. 1 - da) */ kCoeffCount }; /** * Returns true if 'mode' is a coefficient-based blend mode (<= kLastCoeffMode). If true is * returned, the mode's src and dst coefficient functions are set in 'src' and 'dst'. */ SK_API bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoeff* dst); /** Returns name of blendMode as null-terminated C string. @return C string */ SK_API const char* SkBlendMode_Name(SkBlendMode blendMode); #endif