1cb93a386Sopenharmony_ci// Copyright 2020 Google LLC. 2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3cb93a386Sopenharmony_ci#include "tools/fiddle/examples.h" 4cb93a386Sopenharmony_ciREG_FIDDLE(skpaint_xfer, 576, 640, false, 0) { 5cb93a386Sopenharmony_cistatic void draw_utf8_string(SkCanvas* c, const char* t, SkScalar x, SkScalar y, 6cb93a386Sopenharmony_ci const SkFont& f, const SkPaint& p) { 7cb93a386Sopenharmony_ci c->drawTextBlob(SkTextBlob::MakeFromString(t, f).get(), x, y, p); 8cb93a386Sopenharmony_ci} 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_civoid draw(SkCanvas* canvas) { 11cb93a386Sopenharmony_ci SkBlendMode modes[] = { 12cb93a386Sopenharmony_ci SkBlendMode::kClear, 13cb93a386Sopenharmony_ci SkBlendMode::kSrc, 14cb93a386Sopenharmony_ci SkBlendMode::kDst, 15cb93a386Sopenharmony_ci SkBlendMode::kSrcOver, 16cb93a386Sopenharmony_ci SkBlendMode::kDstOver, 17cb93a386Sopenharmony_ci SkBlendMode::kSrcIn, 18cb93a386Sopenharmony_ci SkBlendMode::kDstIn, 19cb93a386Sopenharmony_ci SkBlendMode::kSrcOut, 20cb93a386Sopenharmony_ci SkBlendMode::kDstOut, 21cb93a386Sopenharmony_ci SkBlendMode::kSrcATop, 22cb93a386Sopenharmony_ci SkBlendMode::kDstATop, 23cb93a386Sopenharmony_ci SkBlendMode::kXor, 24cb93a386Sopenharmony_ci SkBlendMode::kPlus, 25cb93a386Sopenharmony_ci SkBlendMode::kModulate, 26cb93a386Sopenharmony_ci SkBlendMode::kScreen, 27cb93a386Sopenharmony_ci SkBlendMode::kOverlay, 28cb93a386Sopenharmony_ci SkBlendMode::kDarken, 29cb93a386Sopenharmony_ci SkBlendMode::kLighten, 30cb93a386Sopenharmony_ci SkBlendMode::kColorDodge, 31cb93a386Sopenharmony_ci SkBlendMode::kColorBurn, 32cb93a386Sopenharmony_ci SkBlendMode::kHardLight, 33cb93a386Sopenharmony_ci SkBlendMode::kSoftLight, 34cb93a386Sopenharmony_ci SkBlendMode::kDifference, 35cb93a386Sopenharmony_ci SkBlendMode::kExclusion, 36cb93a386Sopenharmony_ci SkBlendMode::kMultiply, 37cb93a386Sopenharmony_ci SkBlendMode::kHue, 38cb93a386Sopenharmony_ci SkBlendMode::kSaturation, 39cb93a386Sopenharmony_ci SkBlendMode::kColor, 40cb93a386Sopenharmony_ci SkBlendMode::kLuminosity, 41cb93a386Sopenharmony_ci }; 42cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeWH(64.0f, 64.0f); 43cb93a386Sopenharmony_ci SkPaint stroke, src, dst; 44cb93a386Sopenharmony_ci stroke.setStyle(SkPaint::kStroke_Style); 45cb93a386Sopenharmony_ci SkFont font(nullptr, 24); 46cb93a386Sopenharmony_ci SkPoint srcPoints[2] = { 47cb93a386Sopenharmony_ci SkPoint::Make(0.0f, 0.0f), 48cb93a386Sopenharmony_ci SkPoint::Make(64.0f, 0.0f) 49cb93a386Sopenharmony_ci }; 50cb93a386Sopenharmony_ci SkColor srcColors[2] = { 51cb93a386Sopenharmony_ci SK_ColorMAGENTA & 0x00FFFFFF, 52cb93a386Sopenharmony_ci SK_ColorMAGENTA}; 53cb93a386Sopenharmony_ci src.setShader(SkGradientShader::MakeLinear( 54cb93a386Sopenharmony_ci srcPoints, srcColors, nullptr, 2, 55cb93a386Sopenharmony_ci SkTileMode::kClamp, 0, nullptr)); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci SkPoint dstPoints[2] = { 58cb93a386Sopenharmony_ci SkPoint::Make(0.0f, 0.0f), 59cb93a386Sopenharmony_ci SkPoint::Make(0.0f, 64.0f) 60cb93a386Sopenharmony_ci }; 61cb93a386Sopenharmony_ci SkColor dstColors[2] = { 62cb93a386Sopenharmony_ci SK_ColorCYAN & 0x00FFFFFF, 63cb93a386Sopenharmony_ci SK_ColorCYAN}; 64cb93a386Sopenharmony_ci dst.setShader(SkGradientShader::MakeLinear( 65cb93a386Sopenharmony_ci dstPoints, dstColors, nullptr, 2, 66cb93a386Sopenharmony_ci SkTileMode::kClamp, 0, nullptr)); 67cb93a386Sopenharmony_ci canvas->clear(SK_ColorWHITE); 68cb93a386Sopenharmony_ci size_t N = sizeof(modes) / sizeof(modes[0]); 69cb93a386Sopenharmony_ci size_t K = (N - 1) / 3 + 1; 70cb93a386Sopenharmony_ci SkASSERT(K * 64 == 640); // tall enough 71cb93a386Sopenharmony_ci for (size_t i = 0; i < N; ++i) { 72cb93a386Sopenharmony_ci SkAutoCanvasRestore autoCanvasRestore(canvas, true); 73cb93a386Sopenharmony_ci canvas->translate(192.0f * (i / K), 64.0f * (i % K)); 74cb93a386Sopenharmony_ci const char* desc = SkBlendMode_Name(modes[i]); 75cb93a386Sopenharmony_ci draw_utf8_string(canvas, desc, 68.0f, 30.0f, font, SkPaint()); 76cb93a386Sopenharmony_ci canvas->clipRect(SkRect::MakeWH(64.0f, 64.0f)); 77cb93a386Sopenharmony_ci canvas->drawColor(SK_ColorLTGRAY); 78cb93a386Sopenharmony_ci (void)canvas->saveLayer(nullptr, nullptr); 79cb93a386Sopenharmony_ci canvas->clear(SK_ColorTRANSPARENT); 80cb93a386Sopenharmony_ci canvas->drawPaint(dst); 81cb93a386Sopenharmony_ci src.setBlendMode(modes[i]); 82cb93a386Sopenharmony_ci canvas->drawPaint(src); 83cb93a386Sopenharmony_ci canvas->drawRect(rect, stroke); 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci} 86cb93a386Sopenharmony_ci} // END FIDDLE 87