| #Topic Blend_Mode |
| |
| #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 |
| ## |
| |
| #Code |
| #Populate |
| ## |
| |
| #EnumClass SkBlendMode |
| #Line # algorithm combining source and destination pixels ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #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 |
| |
| #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); |
| ## |
| ## |
| |
| #EnumClass SkBlendMode ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #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 ## |