1// Copyright 2020 Google LLC. 2// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3#include "tools/fiddle/examples.h" 4REG_FIDDLE(BlendModes, 256, 4352, false, 0) { 5void drawBG(SkCanvas* canvas) { 6 SkColor radColors[] = {0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF}; 7 auto rad = SkGradientShader::MakeRadial(SkPoint::Make(128, 128), 128, radColors, nullptr, 3, 8 SkTileMode::kClamp); 9 10 SkMatrix rotMtx; 11 rotMtx.setRotate(-90, 128, 128); 12 SkColor sweepColors[] = {0xFFFF00FF, 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 13 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF}; 14 auto sweep = SkGradientShader::MakeSweep(128, 128, sweepColors, nullptr, 7, 0, &rotMtx); 15 16 auto comp = SkShaders::Blend(SkBlendMode::kModulate, std::move(rad), std::move(sweep)); 17 SkPaint p; 18 p.setShader(std::move(comp)); 19 20 canvas->drawPaint(p); 21} 22 23void draw(SkCanvas* canvas) { 24 SkBlendMode blendModes[] = { 25 SkBlendMode::kDst, 26 SkBlendMode::kSrc, 27 SkBlendMode::kSrcOver, 28 SkBlendMode::kDstOver, 29 SkBlendMode::kSrcIn, 30 SkBlendMode::kDstIn, 31 SkBlendMode::kSrcOut, 32 SkBlendMode::kDstOut, 33 SkBlendMode::kSrcATop, 34 SkBlendMode::kDstATop, 35 SkBlendMode::kXor, 36 SkBlendMode::kPlus, 37 SkBlendMode::kModulate, 38 SkBlendMode::kScreen, 39 SkBlendMode::kOverlay, 40 SkBlendMode::kDarken, 41 SkBlendMode::kLighten, 42 }; 43 44 SkPaint labelPaint; 45 labelPaint.setAntiAlias(true); 46 SkFont font(nullptr, 12); 47 48 for (auto mode : blendModes) { 49 SkPaint layerPaint; 50 layerPaint.setBlendMode(mode); 51 52 canvas->save(); 53 canvas->clipRect(SkRect::MakeWH(256, 256)); 54 55 drawBG(canvas); 56 57 canvas->saveLayer(nullptr, &layerPaint); 58 const SkScalar r = 80; 59 SkPaint discP; 60 discP.setAntiAlias(true); 61 discP.setBlendMode(SkBlendMode::kPlus); 62 discP.setColor(SK_ColorGREEN); canvas->drawCircle(128, r, r, discP); 63 discP.setColor(SK_ColorRED); canvas->drawCircle(r, 256 - r, r, discP); 64 discP.setColor(SK_ColorBLUE); canvas->drawCircle(256 - r, 256 - r, r, discP); 65 canvas->restore(); 66 67 canvas->drawSimpleText(SkBlendMode_Name(mode), strlen(SkBlendMode_Name(mode)), 68 SkTextEncoding::kUTF8, 10, 10, font, labelPaint); 69 canvas->restore(); 70 canvas->translate(0, 256); 71 } 72} 73} // END FIDDLE 74