// 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(skpaint_xfer, 576, 640, false, 0) { static void draw_utf8_string(SkCanvas* c, const char* t, SkScalar x, SkScalar y, const SkFont& f, const SkPaint& p) { c->drawTextBlob(SkTextBlob::MakeFromString(t, f).get(), x, y, p); } void draw(SkCanvas* canvas) { SkBlendMode 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, }; SkRect rect = SkRect::MakeWH(64.0f, 64.0f); SkPaint stroke, src, dst; stroke.setStyle(SkPaint::kStroke_Style); SkFont font(nullptr, 24); SkPoint srcPoints[2] = { SkPoint::Make(0.0f, 0.0f), SkPoint::Make(64.0f, 0.0f) }; SkColor srcColors[2] = { SK_ColorMAGENTA & 0x00FFFFFF, SK_ColorMAGENTA}; src.setShader(SkGradientShader::MakeLinear( srcPoints, srcColors, nullptr, 2, SkTileMode::kClamp, 0, nullptr)); SkPoint dstPoints[2] = { SkPoint::Make(0.0f, 0.0f), SkPoint::Make(0.0f, 64.0f) }; SkColor dstColors[2] = { SK_ColorCYAN & 0x00FFFFFF, SK_ColorCYAN}; dst.setShader(SkGradientShader::MakeLinear( dstPoints, dstColors, nullptr, 2, SkTileMode::kClamp, 0, nullptr)); canvas->clear(SK_ColorWHITE); size_t N = sizeof(modes) / sizeof(modes[0]); size_t K = (N - 1) / 3 + 1; SkASSERT(K * 64 == 640); // tall enough for (size_t i = 0; i < N; ++i) { SkAutoCanvasRestore autoCanvasRestore(canvas, true); canvas->translate(192.0f * (i / K), 64.0f * (i % K)); const char* desc = SkBlendMode_Name(modes[i]); draw_utf8_string(canvas, desc, 68.0f, 30.0f, font, SkPaint()); canvas->clipRect(SkRect::MakeWH(64.0f, 64.0f)); canvas->drawColor(SK_ColorLTGRAY); (void)canvas->saveLayer(nullptr, nullptr); canvas->clear(SK_ColorTRANSPARENT); canvas->drawPaint(dst); src.setBlendMode(modes[i]); canvas->drawPaint(src); canvas->drawRect(rect, stroke); } } } // END FIDDLE