coloremoji_blendmodes.cpp revision 2a475eae622adc1e8fa29206be1eaf862c23548e
1/*
2 * Copyright 2014 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 "sk_tool_utils.h"
9#include "SkBitmap.h"
10#include "SkGradientShader.h"
11#include "SkShader.h"
12#include "SkUtils.h"
13
14namespace skiagm {
15
16static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
17
18class ColorEmojiBlendModesGM : public GM {
19public:
20    const static int W = 64;
21    const static int H = 64;
22    ColorEmojiBlendModesGM() {}
23
24protected:
25    void onOnceBeforeDraw() override {
26        const SkColor colors[] = {
27            SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
28            SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW
29        };
30        SkMatrix local;
31        local.setRotate(180);
32        SkPaint paint;
33        paint.setAntiAlias(true);
34        paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors),
35                                                    0, &local));
36
37        sk_sp<SkTypeface> orig(sk_tool_utils::create_portable_typeface("serif",
38                                   SkFontStyle::FromOldStyle(SkTypeface::kBold)));
39        if (nullptr == orig) {
40            orig = SkTypeface::MakeDefault();
41        }
42        fColorType = sk_tool_utils::emoji_typeface();
43
44        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
45                                            kOpaque_SkAlphaType), gData, 4);
46    }
47
48    virtual SkString onShortName() override {
49        SkString name("coloremoji_blendmodes");
50        name.append(sk_tool_utils::platform_os_emoji());
51        return name;
52    }
53
54    virtual SkISize onISize() override {
55        return SkISize::Make(400, 640);
56    }
57
58    virtual void onDraw(SkCanvas* canvas) override {
59        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
60
61        const SkBlendMode gModes[] = {
62            SkBlendMode::kClear,
63            SkBlendMode::kSrc,
64            SkBlendMode::kDst,
65            SkBlendMode::kSrcOver,
66            SkBlendMode::kDstOver,
67            SkBlendMode::kSrcIn,
68            SkBlendMode::kDstIn,
69            SkBlendMode::kSrcOut,
70            SkBlendMode::kDstOut,
71            SkBlendMode::kSrcATop,
72            SkBlendMode::kDstATop,
73
74            SkBlendMode::kXor,
75            SkBlendMode::kPlus,
76            SkBlendMode::kModulate,
77            SkBlendMode::kScreen,
78            SkBlendMode::kOverlay,
79            SkBlendMode::kDarken,
80            SkBlendMode::kLighten,
81            SkBlendMode::kColorDodge,
82            SkBlendMode::kColorBurn,
83            SkBlendMode::kHardLight,
84            SkBlendMode::kSoftLight,
85            SkBlendMode::kDifference,
86            SkBlendMode::kExclusion,
87            SkBlendMode::kMultiply,
88            SkBlendMode::kHue,
89            SkBlendMode::kSaturation,
90            SkBlendMode::kColor,
91            SkBlendMode::kLuminosity,
92        };
93
94        const SkScalar w = SkIntToScalar(W);
95        const SkScalar h = SkIntToScalar(H);
96        SkMatrix m;
97        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
98        auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode,
99                                            SkShader::kRepeat_TileMode, &m);
100
101        SkPaint labelP;
102        labelP.setAntiAlias(true);
103        sk_tool_utils::set_portable_typeface(&labelP);
104        labelP.setTextAlign(SkPaint::kCenter_Align);
105
106        SkPaint textP;
107        textP.setAntiAlias(true);
108        textP.setTypeface(fColorType);
109        textP.setTextSize(SkIntToScalar(70));
110
111        const int W = 5;
112
113        SkScalar x0 = 0;
114        SkScalar y0 = 0;
115        SkScalar x = x0, y = y0;
116        for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
117            SkRect r;
118            r.set(x, y, x+w, y+h);
119
120            SkPaint p;
121            p.setStyle(SkPaint::kFill_Style);
122            p.setShader(s);
123            canvas->drawRect(r, p);
124
125            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
126            p.setStyle(SkPaint::kStroke_Style);
127            p.setShader(nullptr);
128            canvas->drawRect(r, p);
129
130            {
131                SkAutoCanvasRestore arc(canvas, true);
132                canvas->clipRect(r);
133                textP.setBlendMode(gModes[i]);
134                textP.setTextEncoding(SkPaint::kUTF32_TextEncoding);
135                const char* text = sk_tool_utils::emoji_sample_text();
136                SkUnichar unichar = SkUTF8_ToUnichar(text);
137                canvas->drawText(&unichar, 4, x+ w/10.f, y + 7.f*h/8.f, textP);
138            }
139#if 1
140            const char* label = SkBlendMode_Name(gModes[i]);
141            canvas->drawString(label, x + w/2, y - labelP.getTextSize()/2, labelP);
142#endif
143            x += w + SkIntToScalar(10);
144            if ((i % W) == W - 1) {
145                x = x0;
146                y += h + SkIntToScalar(30);
147            }
148        }
149    }
150
151private:
152    SkBitmap            fBG;
153    sk_sp<SkTypeface>   fColorType;
154
155    typedef GM INHERITED;
156};
157
158//////////////////////////////////////////////////////////////////////////////
159
160static GM* MyFactory(void*) { return new ColorEmojiBlendModesGM; }
161static GMRegistry reg(MyFactory);
162
163}
164