1ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel/*
2ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * Copyright 2014 Google Inc.
3ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel *
4ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * Use of this source code is governed by a BSD-style license that can be
5ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel * found in the LICENSE file.
6ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel */
7ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "gm.h"
833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
9ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkBitmap.h"
10ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkGradientShader.h"
11ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkShader.h"
12ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett#include "SkUtils.h"
13ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
14ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielnamespace skiagm {
15ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
16ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
17ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
18ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarettclass ColorEmojiBlendModesGM : public GM {
19ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielpublic:
20ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    const static int W = 64;
21ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    const static int H = 64;
22ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett    ColorEmojiBlendModesGM() {}
23b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen
24b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunenprotected:
25b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen    void onOnceBeforeDraw() override {
26ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkColor colors[] = {
27ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
28ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW
29ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        };
30ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkMatrix local;
31ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        local.setRotate(180);
32ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint paint;
33ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        paint.setAntiAlias(true);
342ad1aa67c6894696cdd65ec56057f81031d1c24areed        paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors),
352ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                    0, &local));
36ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
37ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc        sk_sp<SkTypeface> orig(sk_tool_utils::create_portable_typeface("serif",
38713195071dc7bdeddec2d1c9fab9b3720f049f07Ben Wagner                                                                       SkFontStyle::Bold()));
3996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == orig) {
4013b9c95295f4c5732e34574789e721a6bc08f7b4bungeman            orig = SkTypeface::MakeDefault();
41ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        }
42ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett        fColorType = sk_tool_utils::emoji_typeface();
43ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
44b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
45b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen                                            kOpaque_SkAlphaType), gData, 4);
46ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
47ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual SkString onShortName() override {
49ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett        SkString name("coloremoji_blendmodes");
50f436fbc4229f95aaa59d0cd54750ed4d14e65169Mike Klein        name.append(sk_tool_utils::platform_font_manager());
51ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett        return name;
52ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
53ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
5436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual SkISize onISize() override {
55ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        return SkISize::Make(400, 640);
56ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
57ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual void onDraw(SkCanvas* canvas) override {
59ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
60ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
61d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman        const SkBlendMode gModes[] = {
62d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kClear,
63d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrc,
64d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDst,
65d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcOver,
66d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstOver,
67d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcIn,
68d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstIn,
69d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcOut,
70d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstOut,
71d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcATop,
72d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstATop,
73d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman
74d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kXor,
75d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kPlus,
76d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kModulate,
77d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kScreen,
78d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kOverlay,
79d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDarken,
80d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kLighten,
81d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kColorDodge,
82d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kColorBurn,
83d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kHardLight,
84d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSoftLight,
85d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDifference,
86d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kExclusion,
87d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kMultiply,
88d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kHue,
89d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSaturation,
90d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kColor,
91d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kLuminosity,
92ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        };
93ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
94ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkScalar w = SkIntToScalar(W);
95ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const SkScalar h = SkIntToScalar(H);
96ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkMatrix m;
97ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
982ad1aa67c6894696cdd65ec56057f81031d1c24areed        auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode,
992ad1aa67c6894696cdd65ec56057f81031d1c24areed                                            SkShader::kRepeat_TileMode, &m);
100ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
101ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint labelP;
102ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        labelP.setAntiAlias(true);
1031818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&labelP);
104ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        labelP.setTextAlign(SkPaint::kCenter_Align);
105ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
106ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkPaint textP;
107ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setAntiAlias(true);
108ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setTypeface(fColorType);
109ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        textP.setTextSize(SkIntToScalar(70));
110ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
111ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        const int W = 5;
112ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
113ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar x0 = 0;
114ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar y0 = 0;
115ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        SkScalar x = x0, y = y0;
116ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
117ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkRect r;
118ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            r.set(x, y, x+w, y+h);
119ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
120ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            SkPaint p;
121ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setStyle(SkPaint::kFill_Style);
122ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setShader(s);
123ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawRect(r, p);
124ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
125ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
126ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            p.setStyle(SkPaint::kStroke_Style);
12796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            p.setShader(nullptr);
128ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            canvas->drawRect(r, p);
129ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
130ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett            {
131ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                SkAutoCanvasRestore arc(canvas, true);
132ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                canvas->clipRect(r);
133ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                textP.setBlendMode(gModes[i]);
134ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                textP.setTextEncoding(SkPaint::kUTF32_TextEncoding);
135ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                const char* text = sk_tool_utils::emoji_sample_text();
136ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                SkUnichar unichar = SkUTF8_ToUnichar(text);
137ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett                canvas->drawText(&unichar, 4, x+ w/10.f, y + 7.f*h/8.f, textP);
138ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett            }
139ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#if 1
140d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            const char* label = SkBlendMode_Name(gModes[i]);
1412a475eae622adc1e8fa29206be1eaf862c23548eCary Clark            canvas->drawString(label, x + w/2, y - labelP.getTextSize()/2, labelP);
142ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#endif
143ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            x += w + SkIntToScalar(10);
144ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            if ((i % W) == W - 1) {
145ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel                x = x0;
146ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel                y += h + SkIntToScalar(30);
147ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel            }
148ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel        }
149ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    }
150ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
151ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielprivate:
15213b9c95295f4c5732e34574789e721a6bc08f7b4bungeman    SkBitmap            fBG;
15313b9c95295f4c5732e34574789e721a6bc08f7b4bungeman    sk_sp<SkTypeface>   fColorType;
154ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
155ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel    typedef GM INHERITED;
156ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel};
157ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
158ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel//////////////////////////////////////////////////////////////////////////////
159ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
160ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarettstatic GM* MyFactory(void*) { return new ColorEmojiBlendModesGM; }
161ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic GMRegistry reg(MyFactory);
162ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel
163ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel}
164