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