coloremoji_blendmodes.cpp revision 2ad1aa67c6894696cdd65ec56057f81031d1c24a
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" 8ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkBitmap.h" 9ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkGradientShader.h" 10ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkShader.h" 11ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "SkXfermode.h" 12ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#include "../src/fonts/SkGScalerContext.h" 13ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 14ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielnamespace skiagm { 15ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 16ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 17ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 18ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielclass ColorTypeXfermodeGM : public GM { 19ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielpublic: 20ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const static int W = 64; 21ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const static int H = 64; 22b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen ColorTypeXfermodeGM() 2396fcdcc219d2a0d3579719b84b28bede76efba64halcanary : fColorType(nullptr) { 24b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen } 25b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen 26b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen virtual ~ColorTypeXfermodeGM() { 27b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen SkSafeUnref(fColorType); 28b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen } 29b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen 30b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunenprotected: 31b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen void onOnceBeforeDraw() override { 32ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const SkColor colors[] = { 33ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, 34ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW 35ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel }; 36ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkMatrix local; 37ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel local.setRotate(180); 38ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkPaint paint; 39ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel paint.setAntiAlias(true); 402ad1aa67c6894696cdd65ec56057f81031d1c24areed paint.setShader(SkGradientShader::MakeSweep(0, 0, colors, nullptr, SK_ARRAY_COUNT(colors), 412ad1aa67c6894696cdd65ec56057f81031d1c24areed 0, &local)); 42ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 432ad1aa67c6894696cdd65ec56057f81031d1c24areed SkTypeface* orig = sk_tool_utils::create_portable_typeface("serif", SkTypeface::kBold); 4496fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == orig) { 45ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel orig = SkTypeface::RefDefault(); 46ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 47385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary fColorType = new SkGTypeface(orig, paint); 48ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel orig->unref(); 49ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 50b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, 51b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen kOpaque_SkAlphaType), gData, 4); 52ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 53ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 5436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein virtual SkString onShortName() override { 55ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel return SkString("colortype_xfermodes"); 56ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 57ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein virtual SkISize onISize() override { 59ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel return SkISize::Make(400, 640); 60ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 61ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein virtual void onDraw(SkCanvas* canvas) override { 63ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 64ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 65ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const struct { 66ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkXfermode::Mode fMode; 67ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const char* fLabel; 68ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } gModes[] = { 69ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kClear_Mode, "Clear" }, 70ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSrc_Mode, "Src" }, 71ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDst_Mode, "Dst" }, 72ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSrcOver_Mode, "SrcOver" }, 73ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDstOver_Mode, "DstOver" }, 74ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSrcIn_Mode, "SrcIn" }, 75ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDstIn_Mode, "DstIn" }, 76ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSrcOut_Mode, "SrcOut" }, 77ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDstOut_Mode, "DstOut" }, 78ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSrcATop_Mode, "SrcATop" }, 79ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDstATop_Mode, "DstATop" }, 80ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 81ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kXor_Mode, "Xor" }, 82ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kPlus_Mode, "Plus" }, 83ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kModulate_Mode, "Modulate" }, 84ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kScreen_Mode, "Screen" }, 85ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kOverlay_Mode, "Overlay" }, 86ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDarken_Mode, "Darken" }, 87ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kLighten_Mode, "Lighten" }, 88ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kColorDodge_Mode, "ColorDodge" }, 89ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kColorBurn_Mode, "ColorBurn" }, 90ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kHardLight_Mode, "HardLight" }, 91ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSoftLight_Mode, "SoftLight" }, 92ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kDifference_Mode, "Difference" }, 93ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kExclusion_Mode, "Exclusion" }, 94ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kMultiply_Mode, "Multiply" }, 95ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kHue_Mode, "Hue" }, 96ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kSaturation_Mode, "Saturation" }, 97ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kColor_Mode, "Color" }, 98ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel { SkXfermode::kLuminosity_Mode, "Luminosity" }, 99ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel }; 100ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 101ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const SkScalar w = SkIntToScalar(W); 102ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const SkScalar h = SkIntToScalar(H); 103ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkMatrix m; 104ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 1052ad1aa67c6894696cdd65ec56057f81031d1c24areed auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode, 1062ad1aa67c6894696cdd65ec56057f81031d1c24areed SkShader::kRepeat_TileMode, &m); 107ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 108ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkPaint labelP; 109ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel labelP.setAntiAlias(true); 1101818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&labelP); 111ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel labelP.setTextAlign(SkPaint::kCenter_Align); 112ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 113ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkPaint textP; 114ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel textP.setAntiAlias(true); 115ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel textP.setTypeface(fColorType); 116ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel textP.setTextSize(SkIntToScalar(70)); 117ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 118ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel const int W = 5; 119ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 120ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkScalar x0 = 0; 121ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkScalar y0 = 0; 122ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkScalar x = x0, y = y0; 123ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 124ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 125ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkAutoUnref aur(mode); 126ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkRect r; 127ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel r.set(x, y, x+w, y+h); 128ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 129ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkPaint p; 130ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel p.setStyle(SkPaint::kFill_Style); 131ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel p.setShader(s); 132ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel canvas->drawRect(r, p); 133ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 134ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 135ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel p.setStyle(SkPaint::kStroke_Style); 13696fcdcc219d2a0d3579719b84b28bede76efba64halcanary p.setShader(nullptr); 137ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel canvas->drawRect(r, p); 138ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 139ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel textP.setXfermode(mode); 140ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel canvas->drawText("H", 1, x+ w/10.f, y + 7.f*h/8.f, textP); 141ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#if 1 142ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), 143ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel x + w/2, y - labelP.getTextSize()/2, labelP); 144ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel#endif 145ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel x += w + SkIntToScalar(10); 146ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel if ((i % W) == W - 1) { 147ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel x = x0; 148ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel y += h + SkIntToScalar(30); 149ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 150ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 151ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel } 152ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 153ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielprivate: 154b4a797f3aa8c10387f01cf51a65dd1a8aa5eec9dkkinnunen SkBitmap fBG; 155ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel SkTypeface* fColorType; 156ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 157ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel typedef GM INHERITED; 158ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel}; 159ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 160ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel////////////////////////////////////////////////////////////////////////////// 161ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 162ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic GM* MyFactory(void*) { return new ColorTypeXfermodeGM; } 163ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdanielstatic GMRegistry reg(MyFactory); 164ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel 165ed3af6648ffe1044d6fb3f6deac53711cb1280c8egdaniel} 166