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::Bold())); 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_font_manager()); 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