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", 38ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc SkFontStyle::FromOldStyle(SkTypeface::kBold))); 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"); 50ee7cb5d9747eae500e7dd5bf8373ef5e9a8ba171Matt Sarett name.append(sk_tool_utils::platform_os_emoji()); 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