1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
10cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h"
11cb93a386Sopenharmony_ci#include "include/core/SkShader.h"
12cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_cistatic const SkBlendMode gModes[] = {
15cb93a386Sopenharmony_ci    SkBlendMode::kClear,
16cb93a386Sopenharmony_ci    SkBlendMode::kSrc,
17cb93a386Sopenharmony_ci    SkBlendMode::kDst,
18cb93a386Sopenharmony_ci    SkBlendMode::kSrcOver,
19cb93a386Sopenharmony_ci    SkBlendMode::kDstOver,
20cb93a386Sopenharmony_ci    SkBlendMode::kSrcIn,
21cb93a386Sopenharmony_ci    SkBlendMode::kDstIn,
22cb93a386Sopenharmony_ci    SkBlendMode::kSrcOut,
23cb93a386Sopenharmony_ci    SkBlendMode::kDstOut,
24cb93a386Sopenharmony_ci    SkBlendMode::kSrcATop,
25cb93a386Sopenharmony_ci    SkBlendMode::kDstATop,
26cb93a386Sopenharmony_ci    SkBlendMode::kXor,
27cb93a386Sopenharmony_ci};
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciconst int gWidth = 64;
30cb93a386Sopenharmony_ciconst int gHeight = 64;
31cb93a386Sopenharmony_ciconst SkScalar W = SkIntToScalar(gWidth);
32cb93a386Sopenharmony_ciconst SkScalar H = SkIntToScalar(gHeight);
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_cistatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) {
35cb93a386Sopenharmony_ci    SkPaint paint;
36cb93a386Sopenharmony_ci    paint.setAntiAlias(true);
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    SkRect r = SkRect::MakeWH(W, H);
39cb93a386Sopenharmony_ci    r.inset(W/10, H/10);
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci    paint.setColor(SK_ColorBLUE);
42cb93a386Sopenharmony_ci    paint.setAlpha(a0);
43cb93a386Sopenharmony_ci    canvas->drawOval(r, paint);
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_ci    paint.setColor(SK_ColorRED);
46cb93a386Sopenharmony_ci    paint.setAlpha(a1);
47cb93a386Sopenharmony_ci    paint.setBlendMode(mode);
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    SkScalar offset = SK_Scalar1 / 3;
50cb93a386Sopenharmony_ci    SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
51cb93a386Sopenharmony_ci                                   H / 4 + offset,
52cb93a386Sopenharmony_ci                                   W / 2, H / 2);
53cb93a386Sopenharmony_ci    canvas->drawRect(rect, paint);
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    return H;
56cb93a386Sopenharmony_ci}
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_bg_shader() {
59cb93a386Sopenharmony_ci    SkBitmap bm;
60cb93a386Sopenharmony_ci    bm.allocN32Pixels(2, 2);
61cb93a386Sopenharmony_ci    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
62cb93a386Sopenharmony_ci    *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC,
63cb93a386Sopenharmony_ci                                                             0xCC, 0xCC);
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci    return bm.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions(),
66cb93a386Sopenharmony_ci                         SkMatrix::Scale(6, 6));
67cb93a386Sopenharmony_ci}
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ciclass AARectsModesView : public Sample {
70cb93a386Sopenharmony_ci    SkPaint fBGPaint;
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci    void onOnceBeforeDraw() override {
73cb93a386Sopenharmony_ci        fBGPaint.setShader(make_bg_shader());
74cb93a386Sopenharmony_ci    }
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_ci    SkString name() override { return SkString("AARectsModes"); }
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
79cb93a386Sopenharmony_ci        const SkRect bounds = SkRect::MakeWH(W, H);
80cb93a386Sopenharmony_ci        static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
81cb93a386Sopenharmony_ci
82cb93a386Sopenharmony_ci        canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci        for (int alpha = 0; alpha < 4; ++alpha) {
85cb93a386Sopenharmony_ci            canvas->save();
86cb93a386Sopenharmony_ci            canvas->save();
87cb93a386Sopenharmony_ci            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
88cb93a386Sopenharmony_ci                if (6 == i) {
89cb93a386Sopenharmony_ci                    canvas->restore();
90cb93a386Sopenharmony_ci                    canvas->translate(W * 5, 0);
91cb93a386Sopenharmony_ci                    canvas->save();
92cb93a386Sopenharmony_ci                }
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci                canvas->drawRect(bounds, fBGPaint);
95cb93a386Sopenharmony_ci                canvas->saveLayer(&bounds, nullptr);
96cb93a386Sopenharmony_ci                SkScalar dy = drawCell(canvas, gModes[i], gAlphaValue[alpha & 1],
97cb93a386Sopenharmony_ci                                       gAlphaValue[alpha & 2]);
98cb93a386Sopenharmony_ci                canvas->restore();
99cb93a386Sopenharmony_ci
100cb93a386Sopenharmony_ci                canvas->translate(0, dy * 5 / 4);
101cb93a386Sopenharmony_ci            }
102cb93a386Sopenharmony_ci            canvas->restore();
103cb93a386Sopenharmony_ci            canvas->restore();
104cb93a386Sopenharmony_ci            canvas->translate(W * 5 / 4, 0);
105cb93a386Sopenharmony_ci        }
106cb93a386Sopenharmony_ci    }
107cb93a386Sopenharmony_ci};
108cb93a386Sopenharmony_ciDEF_SAMPLE( return new AARectsModesView(); )
109