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