// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_DISPLAY_LIST_DL_BLEND_MODE_H_
#define FLUTTER_DISPLAY_LIST_DL_BLEND_MODE_H_

namespace flutter {

/// A enum define the blend mode.
/// Blends are operators that take in two colors (source, destination) and
/// return a new color. 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
/// color types might 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 comments are 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 DlBlendMode {
  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
  kDefaultMode = kSrcOver,
};

}  // namespace flutter

#endif  // FLUTTER_DISPLAY_LIST_DL_BLEND_MODE_H_
