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