03da0d33173058366f1d3da1488691c6816342ba
[platform/upstream/libSkiaSharp.git] / gm / xfermodes2.cpp
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #include "gm.h"
8 #include "SkBitmap.h"
9 #include "SkShader.h"
10 #include "SkXfermode.h"
11 #include "SkColorPriv.h"
12
13 namespace skiagm {
14
15 class Xfermodes2GM : public GM {
16 public:
17     Xfermodes2GM() {}
18
19 protected:
20     SkString onShortName() override {
21         return SkString("xfermodes2");
22     }
23
24     SkISize onISize() override {
25         return SkISize::Make(455, 475);
26     }
27
28     void onDraw(SkCanvas* canvas) override {
29         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
30
31         const SkScalar w = SkIntToScalar(kSize);
32         const SkScalar h = SkIntToScalar(kSize);
33
34         SkPaint labelP;
35         labelP.setAntiAlias(true);
36         sk_tool_utils::set_portable_typeface(&labelP);
37         labelP.setTextAlign(SkPaint::kCenter_Align);
38
39         const int W = 6;
40
41         SkScalar x = 0, y = 0;
42         for (size_t m = 0; m <= SkXfermode::kLastMode; m++) {
43             SkBlendMode mode = static_cast<SkBlendMode>(m);
44
45             canvas->save();
46
47             canvas->translate(x, y);
48             SkPaint p;
49             p.setAntiAlias(false);
50             p.setStyle(SkPaint::kFill_Style);
51             p.setShader(fBG);
52             SkRect r = SkRect::MakeWH(w, h);
53             canvas->drawRect(r, p);
54
55             canvas->saveLayer(&r, nullptr);
56
57             p.setShader(fDst);
58             canvas->drawRect(r, p);
59             p.setShader(fSrc);
60             p.setBlendMode(mode);
61             canvas->drawRect(r, p);
62
63             canvas->restore();
64
65             r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
66             p.setStyle(SkPaint::kStroke_Style);
67             p.setShader(nullptr);
68             p.setBlendMode(SkBlendMode::kSrcOver);
69             canvas->drawRect(r, p);
70
71             canvas->restore();
72
73 #if 1
74             canvas->drawText(SkXfermode::ModeName(mode), strlen(SkXfermode::ModeName(mode)),
75                              x + w/2, y - labelP.getTextSize()/2, labelP);
76 #endif
77             x += w + SkIntToScalar(10);
78             if ((m % W) == W - 1) {
79                 x = 0;
80                 y += h + SkIntToScalar(30);
81             }
82         }
83     }
84
85 private:
86     void onOnceBeforeDraw() override {
87         const uint32_t kCheckData[] = {
88             SkPackARGB32(0xFF, 0x42, 0x41, 0x42),
89             SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
90             SkPackARGB32(0xFF, 0xD6, 0xD3, 0xD6),
91             SkPackARGB32(0xFF, 0x42, 0x41, 0x42)
92         };
93         SkBitmap bg;
94         bg.allocN32Pixels(2, 2, true);
95         memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
96
97         SkMatrix lm;
98         lm.setScale(SkIntToScalar(16), SkIntToScalar(16));
99         fBG = SkShader::MakeBitmapShader(bg, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
100                                          &lm);
101
102         SkBitmap srcBmp;
103         srcBmp.allocN32Pixels(kSize, kSize);
104         SkPMColor* pixels = reinterpret_cast<SkPMColor*>(srcBmp.getPixels());
105
106         for (int y = 0; y < kSize; ++y) {
107             int c = y * (1 << kShift);
108             SkPMColor rowColor = SkPackARGB32(c, c, 0, c/2);
109             for (int x = 0; x < kSize; ++x) {
110                 pixels[kSize * y + x] = rowColor;
111             }
112         }
113         fSrc = SkShader::MakeBitmapShader(srcBmp, SkShader::kClamp_TileMode,
114                                           SkShader::kClamp_TileMode);
115         SkBitmap dstBmp;
116         dstBmp.allocN32Pixels(kSize, kSize);
117         pixels = reinterpret_cast<SkPMColor*>(dstBmp.getPixels());
118
119         for (int x = 0; x < kSize; ++x) {
120             int c = x * (1 << kShift);
121             SkPMColor colColor = SkPackARGB32(c, 0, c, c/2);
122             for (int y = 0; y < kSize; ++y) {
123                 pixels[kSize * y + x] = colColor;
124             }
125         }
126         fDst = SkShader::MakeBitmapShader(dstBmp, SkShader::kClamp_TileMode,
127                                           SkShader::kClamp_TileMode);
128     }
129
130     enum {
131         kShift = 2,
132         kSize = 256 >> kShift,
133     };
134
135     sk_sp<SkShader> fBG;
136     sk_sp<SkShader> fSrc;
137     sk_sp<SkShader> fDst;
138
139     typedef GM INHERITED;
140 };
141
142 //////////////////////////////////////////////////////////////////////////////
143
144 static GM* MyFactory(void*) { return new Xfermodes2GM; }
145 static GMRegistry reg(MyFactory);
146
147 }