blob: 250fbbba3813f2d433081a530392ec986dcef254 [file] [log] [blame]
egdanieled3af662014-10-31 06:55:45 -07001/*
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 */
Ben Wagnercb3d49c2018-03-14 15:07:43 -04007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkFont.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkFontStyle.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkFontTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/core/SkImageInfo.h"
17#include "include/core/SkMatrix.h"
18#include "include/core/SkPaint.h"
19#include "include/core/SkRect.h"
20#include "include/core/SkRefCnt.h"
21#include "include/core/SkScalar.h"
22#include "include/core/SkShader.h"
23#include "include/core/SkSize.h"
24#include "include/core/SkString.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040025#include "include/core/SkTileMode.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050026#include "include/core/SkTypeface.h"
27#include "include/core/SkTypes.h"
28#include "include/effects/SkGradientShader.h"
29#include "include/utils/SkTextUtils.h"
30#include "src/utils/SkUTF.h"
31#include "tools/ToolUtils.h"
egdanieled3af662014-10-31 06:55:45 -070032
Ben Wagner7fde8e12019-05-01 17:28:53 -040033#include <string.h>
34
Hal Canarybd865e22019-07-18 11:51:19 -040035namespace {
egdanieled3af662014-10-31 06:55:45 -070036
37static uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
38
Hal Canarybd865e22019-07-18 11:51:19 -040039class ColorEmojiBlendModesGM : public skiagm::GM {
egdanieled3af662014-10-31 06:55:45 -070040public:
41 const static int W = 64;
42 const static int H = 64;
Matt Sarettee7cb5d2017-04-25 11:09:16 -040043 ColorEmojiBlendModesGM() {}
kkinnunenb4a797f2015-05-21 06:15:28 -070044
45protected:
46 void onOnceBeforeDraw() override {
egdanieled3af662014-10-31 06:55:45 -070047 const SkColor colors[] = {
48 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
49 SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW
50 };
51 SkMatrix local;
52 local.setRotate(180);
egdanieled3af662014-10-31 06:55:45 -070053 SkPaint paint;
54 paint.setAntiAlias(true);
reed2ad1aa62016-03-09 09:50:50 -080055 paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors),
56 0, &local));
egdanieled3af662014-10-31 06:55:45 -070057
Mike Kleinea3f0142019-03-20 11:12:10 -050058 sk_sp<SkTypeface> orig(ToolUtils::create_portable_typeface("serif", SkFontStyle::Bold()));
halcanary96fcdcc2015-08-27 07:41:13 -070059 if (nullptr == orig) {
bungeman13b9c952016-05-12 10:09:30 -070060 orig = SkTypeface::MakeDefault();
egdanieled3af662014-10-31 06:55:45 -070061 }
Mike Kleinea3f0142019-03-20 11:12:10 -050062 fColorType = ToolUtils::emoji_typeface();
kkinnunenb4a797f2015-05-21 06:15:28 -070063
64 fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
65 kOpaque_SkAlphaType), gData, 4);
egdanieled3af662014-10-31 06:55:45 -070066 }
67
Hal Canarybd865e22019-07-18 11:51:19 -040068 SkString onShortName() override {
Mike Kleinbea1f942019-03-08 11:11:55 -060069 return SkString("coloremoji_blendmodes");
egdanieled3af662014-10-31 06:55:45 -070070 }
71
Hal Canarybd865e22019-07-18 11:51:19 -040072 SkISize onISize() override {
73 return {400, 640};
egdanieled3af662014-10-31 06:55:45 -070074 }
75
Hal Canarybd865e22019-07-18 11:51:19 -040076 void onDraw(SkCanvas* canvas) override {
egdanieled3af662014-10-31 06:55:45 -070077 canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
78
Brian Osmand1e67e72017-03-15 12:19:37 -040079 const SkBlendMode gModes[] = {
80 SkBlendMode::kClear,
81 SkBlendMode::kSrc,
82 SkBlendMode::kDst,
83 SkBlendMode::kSrcOver,
84 SkBlendMode::kDstOver,
85 SkBlendMode::kSrcIn,
86 SkBlendMode::kDstIn,
87 SkBlendMode::kSrcOut,
88 SkBlendMode::kDstOut,
89 SkBlendMode::kSrcATop,
90 SkBlendMode::kDstATop,
egdanieled3af662014-10-31 06:55:45 -070091
Brian Osmand1e67e72017-03-15 12:19:37 -040092 SkBlendMode::kXor,
93 SkBlendMode::kPlus,
94 SkBlendMode::kModulate,
95 SkBlendMode::kScreen,
96 SkBlendMode::kOverlay,
97 SkBlendMode::kDarken,
98 SkBlendMode::kLighten,
99 SkBlendMode::kColorDodge,
100 SkBlendMode::kColorBurn,
101 SkBlendMode::kHardLight,
102 SkBlendMode::kSoftLight,
103 SkBlendMode::kDifference,
104 SkBlendMode::kExclusion,
105 SkBlendMode::kMultiply,
106 SkBlendMode::kHue,
107 SkBlendMode::kSaturation,
108 SkBlendMode::kColor,
109 SkBlendMode::kLuminosity,
egdanieled3af662014-10-31 06:55:45 -0700110 };
111
112 const SkScalar w = SkIntToScalar(W);
113 const SkScalar h = SkIntToScalar(H);
114 SkMatrix m;
115 m.setScale(SkIntToScalar(6), SkIntToScalar(6));
Mike Reed50acf8f2019-04-08 13:20:23 -0400116 auto s = fBG.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, &m);
egdanieled3af662014-10-31 06:55:45 -0700117
Mike Kleinea3f0142019-03-20 11:12:10 -0500118 SkFont labelFont(ToolUtils::create_portable_typeface());
egdanieled3af662014-10-31 06:55:45 -0700119
120 SkPaint textP;
121 textP.setAntiAlias(true);
Mike Reedb579f072019-01-03 15:45:53 -0500122 SkFont textFont(fColorType, 70);
egdanieled3af662014-10-31 06:55:45 -0700123
124 const int W = 5;
125
126 SkScalar x0 = 0;
127 SkScalar y0 = 0;
128 SkScalar x = x0, y = y0;
129 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
egdanieled3af662014-10-31 06:55:45 -0700130 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400131 r.setLTRB(x, y, x+w, y+h);
egdanieled3af662014-10-31 06:55:45 -0700132
133 SkPaint p;
134 p.setStyle(SkPaint::kFill_Style);
135 p.setShader(s);
136 canvas->drawRect(r, p);
137
138 r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
139 p.setStyle(SkPaint::kStroke_Style);
halcanary96fcdcc2015-08-27 07:41:13 -0700140 p.setShader(nullptr);
egdanieled3af662014-10-31 06:55:45 -0700141 canvas->drawRect(r, p);
142
Matt Sarettee7cb5d2017-04-25 11:09:16 -0400143 {
144 SkAutoCanvasRestore arc(canvas, true);
145 canvas->clipRect(r);
146 textP.setBlendMode(gModes[i]);
Mike Kleinea3f0142019-03-20 11:12:10 -0500147 const char* text = ToolUtils::emoji_sample_text();
Hal Canaryf107a2f2018-07-25 16:52:48 -0400148 SkUnichar unichar = SkUTF::NextUTF8(&text, text + strlen(text));
149 SkASSERT(unichar >= 0);
Ben Wagner51e15a62019-05-07 15:38:46 -0400150 canvas->drawSimpleText(&unichar, 4, SkTextEncoding::kUTF32,
151 x+ w/10.f, y + 7.f*h/8.f, textFont, textP);
Matt Sarettee7cb5d2017-04-25 11:09:16 -0400152 }
egdanieled3af662014-10-31 06:55:45 -0700153#if 1
Brian Osmand1e67e72017-03-15 12:19:37 -0400154 const char* label = SkBlendMode_Name(gModes[i]);
Ben Wagner51e15a62019-05-07 15:38:46 -0400155 SkTextUtils::DrawString(canvas, label, x + w/2, y - labelFont.getSize()/2,
156 labelFont, SkPaint(), SkTextUtils::kCenter_Align);
egdanieled3af662014-10-31 06:55:45 -0700157#endif
158 x += w + SkIntToScalar(10);
159 if ((i % W) == W - 1) {
160 x = x0;
161 y += h + SkIntToScalar(30);
162 }
163 }
egdanieled3af662014-10-31 06:55:45 -0700164 }
165
egdanieled3af662014-10-31 06:55:45 -0700166private:
bungeman13b9c952016-05-12 10:09:30 -0700167 SkBitmap fBG;
168 sk_sp<SkTypeface> fColorType;
egdanieled3af662014-10-31 06:55:45 -0700169
170 typedef GM INHERITED;
171};
Hal Canarybd865e22019-07-18 11:51:19 -0400172} // namespace
egdanieled3af662014-10-31 06:55:45 -0700173
Hal Canarye964c182019-01-23 10:22:01 -0500174DEF_GM( return new ColorEmojiBlendModesGM; )