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