| // Copyright 2020 Google LLC. | 
 | // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | 
 | #include "tools/fiddle/examples.h" | 
 | REG_FIDDLE(BlendModes, 256, 4352, false, 0) { | 
 | void drawBG(SkCanvas* canvas) { | 
 |     SkColor radColors[] = {0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF}; | 
 |     auto rad = SkGradientShader::MakeRadial(SkPoint::Make(128, 128), 128, radColors, nullptr, 3, | 
 |                                             SkTileMode::kClamp); | 
 |  | 
 |     SkMatrix rotMtx; | 
 |     rotMtx.setRotate(-90, 128, 128); | 
 |     SkColor sweepColors[] = {0xFFFF00FF, 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, | 
 |                              0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF}; | 
 |     auto sweep = SkGradientShader::MakeSweep(128, 128, sweepColors, nullptr, 7, 0, &rotMtx); | 
 |  | 
 |     auto comp = SkShaders::Blend(SkBlendMode::kModulate, std::move(rad), std::move(sweep)); | 
 |     SkPaint p; | 
 |     p.setShader(std::move(comp)); | 
 |  | 
 |     canvas->drawPaint(p); | 
 | } | 
 |  | 
 | void draw(SkCanvas* canvas) { | 
 |     SkBlendMode blendModes[] = { | 
 |         SkBlendMode::kDst, | 
 |         SkBlendMode::kSrc, | 
 |         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, | 
 |     }; | 
 |  | 
 |     SkPaint labelPaint; | 
 |     labelPaint.setAntiAlias(true); | 
 |     SkFont font(nullptr, 12); | 
 |  | 
 |     for (auto mode : blendModes) { | 
 |         SkPaint layerPaint; | 
 |         layerPaint.setBlendMode(mode); | 
 |  | 
 |         canvas->save(); | 
 |         canvas->clipRect(SkRect::MakeWH(256, 256)); | 
 |  | 
 |         drawBG(canvas); | 
 |  | 
 |         canvas->saveLayer(nullptr, &layerPaint); | 
 |         const SkScalar r = 80; | 
 |         SkPaint discP; | 
 |         discP.setAntiAlias(true); | 
 |         discP.setBlendMode(SkBlendMode::kPlus); | 
 |         discP.setColor(SK_ColorGREEN); canvas->drawCircle(128, r, r, discP); | 
 |         discP.setColor(SK_ColorRED);   canvas->drawCircle(r, 256 - r, r, discP); | 
 |         discP.setColor(SK_ColorBLUE);  canvas->drawCircle(256 - r, 256 - r, r, discP); | 
 |         canvas->restore(); | 
 |  | 
 |         canvas->drawSimpleText(SkBlendMode_Name(mode), strlen(SkBlendMode_Name(mode)), | 
 |                                SkTextEncoding::kUTF8, 10, 10, font, labelPaint); | 
 |         canvas->restore(); | 
 |         canvas->translate(0, 256); | 
 |     } | 
 | } | 
 | }  // END FIDDLE |