/*
 * 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"

enum class SkBlendMode {
    kClear,                           //!< replaces destination with zero: fully transparent
    kSrc,                             //!< replaces destination
    kDst,                             //!< preserves destination
    kSrcOver,                         //!< source over destination
    kDstOver,                         //!< destination over source
    kSrcIn,                           //!< source trimmed inside destination
    kDstIn,                           //!< destination trimmed by source
    kSrcOut,                          //!< source trimmed outside destination
    kDstOut,                          //!< destination trimmed outside source
    kSrcATop,                         //!< source inside destination blended with destination
    kDstATop,                         //!< destination inside source blended with source
    kXor,                             //!< each of source and destination trimmed outside the other
    kPlus,                            //!< sum of colors
    kModulate,                        //!< product of premultiplied colors; darkens destination
    kScreen,                //!< multiply inverse of pixels, inverting result; brightens destination
    kLastCoeffMode     = kScreen,     //!< last porter duff blend mode
    kOverlay,                         //!< multiply or screen, depending on destination
    kDarken,                          //!< darker of source and destination
    kLighten,                         //!< lighter of source and destination
    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,                      //!< subtract darker from lighter with higher contrast
    kExclusion,                       //!< subtract darker from lighter with lower contrast
    kMultiply,                        //!< multiply source with destination, darkening image
    kLastSeparableMode = kMultiply,   //!< last blend mode operating separately on components
    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
    kLastMode          = kLuminosity, //!< last valid value
};

/**
 * 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.

    @param blendMode  one of:
                      SkBlendMode::kClear, SkBlendMode::kSrc, SkBlendMode::kDst,
                      SkBlendMode::kSrcOver, SkBlendMode::kDstOver, SkBlendMode::kSrcIn,
                      SkBlendMode::kDstIn, SkBlendMode::kSrcOut, SkBlendMode::kDstOut,
                      SkBlendMode::kSrcATop, SkBlendMode::kDstATop, SkBlendMode::kXor,
                      SkBlendMode::kPlus, SkBlendMode::kModulate, SkBlendMode::kScreen,
                      SkBlendMode::kOverlay, SkBlendMode::kDarken, SkBlendMode::kLighten,
                      SkBlendMode::kColorDodge, SkBlendMode::kColorBurn, SkBlendMode::kHardLight,
                      SkBlendMode::kSoftLight, SkBlendMode::kDifference, SkBlendMode::kExclusion,
                      SkBlendMode::kMultiply, SkBlendMode::kHue, SkBlendMode::kSaturation,
                      SkBlendMode::kColor, SkBlendMode::kLuminosity
    @return           C string
*/
SK_API const char* SkBlendMode_Name(SkBlendMode blendMode);

#endif
