#Topic Blend_Mode
#Alias BlendMode_Reference ##

#Subtopic Overview
#Populate
##

#Subtopic Member_Function
#Populate
##

#Subtopic Constant
#Populate
##

Describes how destination pixel is replaced with a combination of itself and
source pixel. Blend_Mode may use source, destination, or both. Blend_Mode may
operate on each Color component independently, or may allow all source pixel
components to contribute to one destination pixel component. 

Blend_Mode does not use adjacent pixels to determine the outcome.

Blend_Mode uses source and read destination Alpha to determine written
destination Alpha; both source and destination Alpha may also affect written
destination Color components.

Regardless of how Alpha is encoded in source and destination pixel, nearly all
Color_Types treat it as ranging from zero to one. And, nearly all Blend_Mode
algorithms limit the output so that all results are also zero to one.

Two exceptions are SkBlendMode::kPlus and kRGBA_F16_SkColorType. 

SkBlendMode::kPlus permits computing Alpha and Color component values larger
than one. For Color_Types other than kRGBA_F16_SkColorType, resulting Alpha
and component values are clamped to one.

kRGBA_F16_SkColorType permits values outside the zero to one range. It is up
to the client to ensure that the result is within the range of zero to one,
and therefore well-defined.

#Subtopic Porter_Duff

#A Compositing Digital Images # https://graphics.pixar.com/library/Compositing/paper.pdf ##
describes Porter_Duff modes SkBlendMode::kClear through SkBlendMode::kXor.

Drawing a bitmap with transparency using Porter_Duff compositing is free to clear
the destination.

#Illustration 1

Draw geometry with transparency using Porter_Duff compositing does not combine
transparent source pixels, leaving the destination outside the geometry untouched.

#Illustration 2

##

#Subtopic Lighten_Darken

Modes SkBlendMode::kPlus and SkBlendMode::kScreen use
simple arithmetic to lighten or darken the destination. Modes 
SkBlendMode::kOverlay through SkBlendMode::kMultiply use more complicated
algorithms to lighten or darken; sometimes one mode does both, as described by
#A Blend Modes # https://en.wikipedia.org/wiki/Blend_modes ##
.

#Illustration

##

#Subtopic Modulate_Blend
SkBlendMode::kModulate is a mashup of SkBlendMode::kSrcATop and SkBlendMode::kMultiply.
It multiplies all components, including Alpha; unlike SkBlendMode::kMultiply, if either
source or destination is transparent, result is transparent. SkBlendMode::kModulate
uses Premultiplied values to compute the product; SkBlendMode::kMultiply uses Unpremultiplied
values to compute the product.

#Illustration

##

#Subtopic Color_Blends

Modes SkBlendMode::kHue, SkBlendMode::kSaturation, SkBlendMode::kColor, and
SkBlendMode::kLuminosity convert source and destination pixels using all
components color information, using 
###$
$A non-separable blend modes $ https://www.w3.org/TR/compositing-1/#blendingnonseparable $$
$$$#
.

#Illustration

##

# ------------------------------------------------------------------------------

#PhraseDef list_of_blend_modes
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
##

#EnumClass SkBlendMode
#Line # algorithm combining source and destination pixels ##

#Code
    enum class SkBlendMode {
        kClear,
        kSrc,
        kDst,
        kSrcOver,
        kDstOver,
        kSrcIn,
        kDstIn,
        kSrcOut,
        kDstOut,
        kSrcATop,
        kDstATop,
        kXor,
        kPlus,
        kModulate,
        kScreen,
        kLastCoeffMode = kScreen,
        kOverlay,
        kDarken,
        kLighten,
        kColorDodge,
        kColorBurn,
        kHardLight,
        kSoftLight,
        kDifference,
        kExclusion,
        kMultiply,
        kLastSeparableMode = kMultiply,
        kHue,
        kSaturation,
        kColor,
        kLuminosity,
        kLastMode = kLuminosity,
    };
##

#Const kClear 0
#Line # replaces destination with zero: fully transparent ##
#Details Clear
Replaces destination with Alpha and Color components set to zero;
a fully transparent pixel.
##

#Const kSrc 1
#Line # replaces destination ##
#Details Src
Replaces destination with source. Destination alpha and color component values
are ignored.
##

#Const kDst 2
#Line # preserves destination ##
#Details Dst
Preserves destination, ignoring source. Drawing with Paint set to kDst has
no effect.
##

#Const kSrcOver 3
#Line # source over destination ##
#Details Src_Over
Replaces destination with source blended with destination. If source is opaque,
replaces destination with source. Used as the default Blend_Mode for SkPaint.
##

#Const kDstOver 4
#Line # destination over source ##
#Details Dst_Over
Replaces destination with destination blended with source. If destination is opaque,
has no effect.
##

#Const kSrcIn 5
#Line # source trimmed inside destination ##
#Details Src_In
Replaces destination with source using destination opacity.
##

#Const kDstIn 6
#Line # destination trimmed by source ##
#Details Dst_In
Scales destination opacity by source opacity. 
##

#Const kSrcOut 7
#Line # source trimmed outside destination ##
#Details Src_Out
Replaces destination with source using the inverse of destination opacity,
drawing source fully where destination opacity is zero.
##

#Const kDstOut 8
#Line # destination trimmed outside source ##
#Details Dst_Out
Replaces destination opacity with inverse of source opacity. If source is
transparent, has no effect.
##

#Const kSrcATop 9
#Line # source inside destination blended with destination ##
#Details Src_Atop
Blends destination with source using read destination opacity.
##

#Const kDstATop 10
#Line # destination inside source blended with source ##
#Details Dst_Atop
Blends destination with source using source opacity.
##

#Const kXor 11
#Line # each of source and destination trimmed outside the other ##
#Details Xor
Blends destination by exchanging transparency of the source and destination.
##

#Const kPlus 12
#Line # sum of colors ##
#Details Plus
Replaces destination with source and destination added together.
##

#Const kModulate 13
#Line # product of Premultiplied colors; darkens destination ##
#Details Modulate
Replaces destination with source and destination multiplied together.
##

#Const kScreen 14
#Line # multiply inverse of pixels, inverting result; brightens destination ##
#Details Screen
Replaces destination with inverted source and destination multiplied together.
##

#Const kLastCoeffMode 14
#Line # last Porter_Duff blend mode ##
##

#Const kOverlay 15
#Line # multiply or screen, depending on destination ##
#Details Overlay
Replaces destination with multiply or screen, depending on destination.
##

#Const kDarken 16
#Line # darker of source and destination ##
#Details Darken
Replaces destination with darker of source and destination.
##

#Const kLighten 17
#Line # lighter of source and destination ##
#Details Lighten
Replaces destination with lighter of source and destination.
##

#Const kColorDodge 18
#Line # brighten destination to reflect source ##
#Details Color_Dodge
Makes destination brighter to reflect source.
##

#Const kColorBurn 19
#Line # darken destination to reflect source ##
#Details Color_Burn
Makes destination darker to reflect source.
##

#Const kHardLight 20
#Line # multiply or screen, depending on source ##
#Details Hard_Light
Makes destination lighter or darker, depending on source.
##

#Const kSoftLight 21
#Line # lighten or darken, depending on source ##
#Details Soft_Light
Makes destination lighter or darker, depending on source.
##

#Const kDifference 22
#Line # subtract darker from lighter with higher contrast ##
#Details Difference
Subtracts darker from lighter with higher contrast.
##

#Const kExclusion 23
#Line # subtract darker from lighter with lower contrast ##
#Details Exclusion
Subtracts darker from lighter with lower contrast.
##

#Const kMultiply 24
#Line # multiply source with destination, darkening image ##
#Details Multiply
Multiplies source with destination, darkening image.
##

#Const kLastSeparableMode 24
#Line # last blend mode operating separately on components ##
Last blend mode operating separately on components.
##

#Const kHue 25
#Line # hue of source with saturation and luminosity of destination ##
#Details Hue
Replaces hue of destination with hue of source, leaving saturation and luminosity
unchanged.
##

#Const kSaturation 26
#Line # saturation of source with hue and luminosity of destination ##
#Details Saturation
Replaces saturation of destination saturation hue of source, leaving hue and
luminosity unchanged.
##

#Const kColor 27
#Line # hue and saturation of source with luminosity of destination ##
#Details Color
Replaces hue and saturation of destination with hue and saturation of source,
leaving luminosity unchanged.
##

#Const kLuminosity 28
#Line # luminosity of source with hue and saturation of destination ##
#Details Luminosity
Replaces luminosity of destination with luminosity of source, leaving hue and
saturation unchanged.
##

#Const kLastMode 28
#Line # last valid value ##
Used by tests to iterate through all valid values.
##

#NoExample
##

#SeeAlso SkCanvas::drawColor SkCanvas::drawVertices SkPaint SkShader::MakeCompose SkXfermodeImageFilter

#EnumClass SkBlendMode ##

#Subtopic Clear
#Line # makes destination pixels transparent ##
SkBlendMode::kClear sets destination to: #Formula # [0, 0] ##. 
Use SkBlendMode::kClear to initialize a buffer to fully transparent pixels when
creating a mask with irregular edges.

#Example
#Description
SK_ColorYELLOW is ignored because SkBlendMode::kClear ignores the source pixel
value and the destination pixel value, always setting the destination to zero.
##
    canvas->saveLayer(nullptr, nullptr);
    canvas->drawColor(SK_ColorYELLOW, SkBlendMode::kClear);
    SkPaint paint;
    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
        SkColor colors[] = { color, SkColorSetA(color, 0) }; 
        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
        canvas->drawCircle(64, 64, 100, paint);
        canvas->translate(64, 64);
    }
    canvas->restore();
##
#SeeAlso SkCanvas::clear
##

#Subtopic Src
#Line # replaces destination, ignoring Alpha ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component;
SkBlendMode::kSrc sets destination to: #Formula # [Sa, Sc] ##. 
Use SkBlendMode::kSrc to copy one buffer to another. All pixels are copied,
regardless of source and destination Alpha values. As a parameter to
SkCanvas::drawAtlas, selects sprites and ignores colors.
#Example
#Image 3
#Description
SkBlendMode::kSrc does not blend transparent pixels with existing background;
it punches a transparent hole in the existing image.
##
    canvas->drawImage(image, 0, 0);
    canvas->clipRect({50, 50, 200, 200});
    SkPaint srcBlend;
    srcBlend.setBlendMode(SkBlendMode::kSrc);
    canvas->saveLayer(nullptr, &srcBlend);
    canvas->drawColor(0);
    SkPaint transRed;
    transRed.setColor(SkColorSetA(SK_ColorRED, 127));
    canvas->drawCircle(125, 125, 75, transRed);
    canvas->restore();
##
#SeeAlso SkSurface::draw SkSurface::readPixels
##

#Subtopic Dst
#Line # preserves destination, ignoring source ##
Given: #Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
 SkBlendMode::kDst preserves destination set to: #Formula # [Da, Dc] ##.
Setting Paint Blend_Mode to SkBlendMode::kDst causes drawing with
Paint to have no effect. As a parameter to SkCanvas::drawAtlas,
selects colors and ignores sprites.
#Example
#Image 3
  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 125, 128 } };
  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };
  SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };
  canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kSrc, nullptr, nullptr);
  canvas->translate(128, 0);
  canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kDst, nullptr, nullptr);
##
##

#Subtopic Src_Over
#Line # blends source with destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kSrcOver replaces destination with: #Formula # [Sa + Da * (1 - Sa), Sc + Dc * (1 - Sa)] ##,
drawing source over destination. SkBlendMode::kSrcOver is the default for Paint.

SkBlendMode::kSrcOver cannot make destination more transparent; the result will
be at least as opaque as the less transparent of source and original destination.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOver);
##
##

#Subtopic Dst_Over
#Line # blends destination with source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDstOver replaces destination with: #Formula # [Da + Sa * (1 - Da), Dc + Sc * (1 - Da)] ##,
drawing destination over source. Has no effect destination if is opaque.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOver);
##
##

#Subtopic Src_In
#Line # source trimmed inside destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha;
SkBlendMode::kSrcIn replaces destination with: #Formula # [Sa * Da, Sc * Da] ##,
drawing source with destination opacity.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcIn);
##
##

#Subtopic Dst_In
#Line # destination trimmed by source ##
Given: #Formula # Sa ## as source Alpha,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDstIn replaces destination with: #Formula # [Da * Sa, Dc * Sa] ##,
scaling destination Alpha by source Alpha. Resulting
destination is visible where source is visible.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstIn);
##
##

#Subtopic Src_Out
#Line # source trimmed outside destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha;
SkBlendMode::kSrcOut replaces destination with: #Formula # [Sa * (1 - Da), Sc * (1 - Da)] ##,
drawing source fully where destination Alpha is zero. Is destination
is opaque, has no effect.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOut);
##
##

#Subtopic Dst_Out
#Line # destination trimmed outside source ##
Given: #Formula # Sa ## as source Alpha,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDstOut replaces destination with: #Formula # [Da * (1 - Sa), Dc * (1 - Sa)] ##,
scaling destination Alpha by source transparency. Resulting
destination is visible where source is transparent. If source is transparent,
has no effect.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOut);
##
##

#Subtopic Src_Atop
#Line # source inside destination over destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kSrcATop replaces destination with: #Formula # [Da, Sc * Da + Dc * (1 - Sa)] ##,
replacing opaque destination with opaque source. If source or destination
is transparent, has no effect.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstIn);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);
##
##

#Subtopic Dst_Atop
#Line # destination inside source over source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDstATop replaces destination with: #Formula # [Sa, Dc * Sa + Sc * (1 - Da)] ##,
making destination transparent where source is transparent.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);
##
##

#Subtopic Xor
#Line # each of source and destination trimmed outside the other ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kXor replaces destination with:
#Formula # [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa)] ##,
exchanging the transparency of the source and destination.
#Example
   SkPaint paint;
   paint.setBlendMode(SkBlendMode::kXor);
   for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
       SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),
                            SkColorSetA(color, 0) }; 
       paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
               colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
       canvas->drawCircle(64, 64, 100, paint);
       canvas->translate(64, 64);
   }
##
##

#Subtopic Plus
#Line # sum of colors ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kPlus replaces destination with: #Formula # [Sa + Da, Sc + Dc] ##,
summing the Alpha and Color components.
#Example
   canvas->drawColor(SK_ColorBLACK);
   SkPaint paint;
   paint.setBlendMode(SkBlendMode::kPlus);
   for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
       SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),
                            SkColorSetA(color, 0) }; 
       paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
               colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
       canvas->drawCircle(64, 64, 100, paint);
       canvas->translate(64, 64);
   }
##
##

#Subtopic Modulate
#Line # product of Premultiplied colors; darkens destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kModulate replaces destination with: #Formula # [Sa * Da, Sc * Dc] ##,
scaling Alpha and Color components by the lesser of the values.
SkBlendMode::kModulate differs from SkBlendMode::kMultiply in two ways.
SkBlendMode::kModulate like SkBlendMode::kSrcATop alters the destination inside
the destination area, as if the destination Alpha defined the boundaries of a
soft clip. SkBlendMode::kMultiply like SkBlendMode::kSrcOver can alter the
destination where the destination is transparent.
SkBlendMode::kModulate computes the product of the source and destination using
Premultiplied component values. SkBlendMode::kMultiply the product of the source
and destination using Unpremultiplied component values.
#Example
#Description
    If source and destination are opaque, SkBlendMode::kModulate and
    SkBlendMode::kMultiply produce the same results.
##
    auto drawSquare = [=](int dx, int dy, SkBlendMode mode, const char* label) -> void {
        const SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };
        const SkPoint horz[] = { { 0, 0 }, { 128, 0 } };
        SkPaint paint;
        paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
                SkShader::kClamp_TileMode));
        paint.setBlendMode(mode);
        canvas->translate(dx, dy);
        canvas->drawRect({0, 0, 128, 128}, paint);
        paint.setBlendMode(SkBlendMode::kXor);
        canvas->drawString(label, 40, 100, paint);
    };
    drawSquare(0, 0, SkBlendMode::kSrc, "destination");
    drawSquare(128, 0, SkBlendMode::kSrc, "");
    drawSquare(0, 128, SkBlendMode::kSrc, "");
    canvas->translate(-128, -128);
    canvas->rotate(90, 0, 128);
    drawSquare(0, 0, SkBlendMode::kSrc, "source");
    drawSquare(0, -128, SkBlendMode::kModulate, "modulate");
    drawSquare(-128, 0, SkBlendMode::kMultiply, "multiply");
##
##

#Subtopic Screen
#Line # multiply inverse of pixels, inverting result; brightens destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kScreen replaces destination with: #Formula # [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] ##.

#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kScreen);
##
##

#Subtopic Overlay
#Line # multiply or screen, depending on destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kOverlay replaces destination with:
#Formula # [Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) +
    (2 * Dc <= Da ? 2 * Sc * Dc : Sa * Da - 2 * (Da - Dc) * (Sa - Sc))] ##.
#Example
    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kOverlay);
##
##

#Subtopic Darken
#Line # darker of source and destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDarken replaces destination with:
#Formula # [Sa + Da - Sa * Da,  Sc + Dc - max(Sc * Da, Dc * Sa)] ##.
SkBlendMode::kDarken does not make an image darker; it replaces the destination
component with source if source is darker. 
#Example
#Image 3
    canvas->drawImage(image, 0, 0);
    SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    paint.setBlendMode(SkBlendMode::kDarken);
    canvas->drawPaint(paint);
##
##

#Subtopic Lighten
#Line # lighter of source and destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kLighten replaces destination with:
#Formula # [Sa + Da - Sa * Da,  Sc + Dc - min(Sc * Da, Dc * Sa)] ##. 
SkBlendMode::kDarken does not make an image lighter; it replaces the destination
component with source if source is lighter. 
#Example
#Image 3
    canvas->drawImage(image, 0, 0);
    SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };
    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
    SkPaint paint;
    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
            SkShader::kClamp_TileMode));
    paint.setBlendMode(SkBlendMode::kLighten);
    canvas->drawPaint(paint);
##
##

#Subtopic Color_Dodge
#Line # brighten destination to reflect source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kColorDodge replaces destination with:
#Formula # [Sa + Da - Sa * Da, Dc == 0 ? Sc * (1 - Da) : Sc == Sa ? Sc + Da * (1 - Sa) :
            Sa * min(Da, Dc * Sa / (Sa - Sc)) + Sc * (1 - Da) + Da * (1 - Sa)] ##,
making destination brighter to reflect source.
#Example
#Image 3
    canvas->drawImage(image, 0, 0);
    canvas->clipRect({128, 0, 256, 256});
    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorDodge);
##
##

#Subtopic Color_Burn
#Line # darken destination to reflect source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kColorBurn replaces destination with:
#Formula # [Sa + Da - Sa * Da, Dc == Da ? Dc + Sc * (1 - Da) : Sc == 0 ? Da * (1 - Sa) :
            Sa * (Da - min(Da, (Da - Dc) * Sa / Sc)) + Sc * (1 - Da) + Da * (1 - Sa)] ##,
making destination darker to reflect source.
#Example
#Image 3
    canvas->drawImage(image, 0, 0);
    canvas->clipRect({128, 0, 256, 256});
    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorBurn);
##
##

#Subtopic Hard_Light
#Line # multiply or screen, depending on source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kHardLight replaces destination with:
#Formula # [Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) +
        2 * Sc <= Sa ? 2 * Sc * Dc : Sa * Da - 2 * (Da - Dc) * (Sa - Sc)] ##,
making destination lighter or darker, depending on source.
#Example
#Image 3
   canvas->drawImage(image, 0, 0);
   const SkColor colors[] = { 0xFFFFFFFF, 0x00000000 };
   SkPaint paint;
   paint.setBlendMode(SkBlendMode::kHardLight);
   paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,
        nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
   canvas->clipRect({0, 128, 256, 256});
   canvas->drawPaint(paint);
##
##

#Subtopic Soft_Light
#Line # lighten or darken, depending on source ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
where #Formula # m = Da > 0 ? Dc / Da : 0 ##;
SkBlendMode::kSoftLight replaces destination with: #Formula # [Sa + Da - Sa * Da, Sc / Da + Dc / Sa +
    (2 * Sc <= Sa ? Dc * (Sa + (2 * Sc - Sa) * (1 - m)) : Dc * Sa + Da * (2 * Sc - Sa) *
    (4 * Dc <= Da ? (16 * m * m  + 4 * m) * (m - 1) + 7 * m : sqrt(m) - m))] ##,
making destination lighter or darker, depending on source.
#Example
#Image 3
   const SkColor colors[] = { 0xFFFFFFFF, 0x3FFFFFFF };
   SkPaint paint;
   paint.setBlendMode(SkBlendMode::kSoftLight);
   paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,
        nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
   canvas->drawImage(image, 0, 0);
   canvas->drawCircle(128, 128, 100, paint);
##
##

#Subtopic Difference
#Line # subtract darker from lighter with higher contrast ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kDifference replaces destination with:
#Formula # [Sa + Da - Sa * Da, Sc + Dc - 2 * min(Sc * Da, Dc * Sa)] ##,
replacing destination with lighter less darker.
#Example
#Image 5
    canvas->drawImage(image, 0, 0);
    canvas->drawImage(image, 128, 0);
    canvas->drawImage(image, 0, 128);
    canvas->drawImage(image, 128, 128);
    SkPaint paint;
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(0x80bb9977, SkBlendMode::kDifference);
##
##

#Subtopic Exclusion
#Line # subtract darker from lighter with lower contrast ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kExclusion replaces destination with:
#Formula # [Sa + Da - Sa * Da, Sc + Dc - 2 * Sc * Dc] ##,
replacing destination with lighter less darker, ignoring Alpha.
#Example
#Image 5
    canvas->drawImage(image, 0, 0);
    canvas->drawImage(image, 128, 0);
    canvas->drawImage(image, 0, 128);
    canvas->drawImage(image, 128, 128);
    SkPaint paint;
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(0x80bb9977, SkBlendMode::kExclusion);
##
##

#Subtopic Multiply
#Line # multiply source with destination, darkening image ##
Given: #Formula # Sa ## as source Alpha, #Formula # Sc ## as source Color component,
#Formula # Da ## as destination Alpha, #Formula # Dc ## as destination Color component;
SkBlendMode::kMultiply replaces destination with:
#Formula # [Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) + Sc * Dc] ##,
the product of Unpremultiplied source and destination.
SkBlendMode::kMultiply makes the image darker.
#Example
#Image 5
    canvas->drawImage(image, 0, 0);
    canvas->drawImage(image, 128, 0);
    canvas->drawImage(image, 0, 128);
    canvas->drawImage(image, 128, 128);
    SkPaint paint;
    paint.setBlendMode(SkBlendMode::kDstATop);
    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
            SkShader::kClamp_TileMode));
    canvas->drawPaint(paint);
    canvas->clipRect( { 30, 30, 226, 226 } );
    canvas->drawColor(0x80bb9977, SkBlendMode::kMultiply);
##
##

#Subtopic Hue
#Line # hue of source with saturation and luminosity of destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # S ## as source Color,
#Formula # Da ## as destination Alpha, #Formula # D ## as destination Color;
SkBlendMode::kHue replaces destination with:
#Formula # [Sa + Da - Sa * Da, SetLuminosity(SetSaturation(S, Saturation(D)), Luminosity(D))] ##,
source hue, leaving destination luminosity and saturation unchanged.
#Example
#Image 3
canvas->drawImage(image, 0, 0);
canvas->drawColor(0xFF00FF00, SkBlendMode::kHue);
##
##

#Subtopic Saturation
#Line # saturation of source with hue and luminosity of destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # S ## as source Color,
#Formula # Da ## as destination Alpha, #Formula # D ## as destination Color;
SkBlendMode::kHue replaces destination with:
#Formula # [Sa + Da - Sa * Da, SetLuminosity(SetSaturation(D, Saturation(S)), Luminosity(D))] ##,
source hue, leaving destination luminosity and saturation unchanged.
#Example
#Image 3
canvas->drawImage(image, 0, 0);
canvas->drawColor(0xFF00FF00, SkBlendMode::kSaturation);
##
##

#Subtopic Color
#Line # hue and saturation of source with luminosity of destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # S ## as source Color,
#Formula # Da ## as destination Alpha, #Formula # D ## as destination Color;
SkBlendMode::kColor replaces destination with:
#Formula # [Sa + Da - Sa * Da, SetLuminosity(S, Luminosity(D))] ##,
source hue and saturation, leaving destination luminosity unchanged.
#Example
#Image 3
canvas->drawImage(image, 0, 0);
canvas->drawColor(0xFF00FF00, SkBlendMode::kColor);
##
##

#Subtopic Luminosity
#Line # luminosity of source with hue and saturation of destination ##
Given: #Formula # Sa ## as source Alpha, #Formula # S ## as source Color,
#Formula # Da ## as destination Alpha, #Formula # D ## as destination Color;
SkBlendMode::kLuminosity replaces destination with:
#Formula # [Sa + Da - Sa * Da, SetLuminosity(D, Luminosity(S))] ##,
source luminosity, leaving destination hue and saturation unchanged.
#Example
#Image 3
canvas->drawImage(image, 0, 0);
canvas->drawColor(0xFF00FF00, SkBlendMode::kLuminosity);
##
##

# ------------------------------------------------------------------------------

#Method SK_API const char* SkBlendMode_Name(SkBlendMode blendMode)
#In Utility
#Line # returns mode as C string ##

Returns name of blendMode as null-terminated C string.

#Param blendMode  one of: #list_of_blend_modes#
##

#Return C string ##

#Example
SkDebugf("default blend: SkBlendMode::k%s\n", SkBlendMode_Name(SkPaint().getBlendMode()));
#StdOut
default blend: SkBlendMode::kSrcOver
##
##

#SeeAlso SkBlendMode

#Method ##

#Topic Blend_Mode ##
