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