1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBlendMode.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 13cb93a386Sopenharmony_ci#include "include/core/SkImageInfo.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 15cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 17cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 18cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 19cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 20cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 21cb93a386Sopenharmony_ci#include "include/core/SkString.h" 22cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 23cb93a386Sopenharmony_ci#include "include/core/SkTileMode.h" 24cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 25cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 26cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 27cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace skiagm { 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciconstexpr int kColWidth = 180; 32cb93a386Sopenharmony_ciconstexpr int kNumCols = 4; 33cb93a386Sopenharmony_ciconstexpr int kWidth = kColWidth * kNumCols; 34cb93a386Sopenharmony_ciconstexpr int kHeight = 750; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_cistatic sk_sp<SkShader> make_shader(const SkRect& bounds) { 37cb93a386Sopenharmony_ci const SkPoint pts[] = { 38cb93a386Sopenharmony_ci { bounds.left(), bounds.top() }, 39cb93a386Sopenharmony_ci { bounds.right(), bounds.bottom() }, 40cb93a386Sopenharmony_ci }; 41cb93a386Sopenharmony_ci const SkColor colors[] = { 42cb93a386Sopenharmony_ci SK_ColorRED, SK_ColorGREEN, 43cb93a386Sopenharmony_ci }; 44cb93a386Sopenharmony_ci return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors), 45cb93a386Sopenharmony_ci SkTileMode::kRepeat); 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ciclass LcdBlendGM : public skiagm::GM { 49cb93a386Sopenharmony_cipublic: 50cb93a386Sopenharmony_ci LcdBlendGM() { 51cb93a386Sopenharmony_ci const int kPointSize = 25; 52cb93a386Sopenharmony_ci fTextHeight = SkIntToScalar(kPointSize); 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciprotected: 56cb93a386Sopenharmony_ci SkString onShortName() override { 57cb93a386Sopenharmony_ci return SkString("lcdblendmodes"); 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 61cb93a386Sopenharmony_ci fCheckerboard = ToolUtils::create_checkerboard_shader(SK_ColorBLACK, SK_ColorWHITE, 4); 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 67cb93a386Sopenharmony_ci SkPaint p; 68cb93a386Sopenharmony_ci p.setAntiAlias(false); 69cb93a386Sopenharmony_ci p.setStyle(SkPaint::kFill_Style); 70cb93a386Sopenharmony_ci p.setShader(fCheckerboard); 71cb93a386Sopenharmony_ci SkRect r = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 72cb93a386Sopenharmony_ci canvas->drawRect(r, p); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight); 75cb93a386Sopenharmony_ci SkSurfaceProps props = SkSurfaceProps(0, kRGB_H_SkPixelGeometry); 76cb93a386Sopenharmony_ci auto surface(ToolUtils::makeSurface(canvas, info, &props)); 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci SkCanvas* surfCanvas = surface->getCanvas(); 79cb93a386Sopenharmony_ci this->drawColumn(surfCanvas, SK_ColorBLACK, SK_ColorWHITE, false); 80cb93a386Sopenharmony_ci surfCanvas->translate(SkIntToScalar(kColWidth), 0); 81cb93a386Sopenharmony_ci this->drawColumn(surfCanvas, SK_ColorWHITE, SK_ColorBLACK, false); 82cb93a386Sopenharmony_ci surfCanvas->translate(SkIntToScalar(kColWidth), 0); 83cb93a386Sopenharmony_ci this->drawColumn(surfCanvas, SK_ColorGREEN, SK_ColorMAGENTA, false); 84cb93a386Sopenharmony_ci surfCanvas->translate(SkIntToScalar(kColWidth), 0); 85cb93a386Sopenharmony_ci this->drawColumn(surfCanvas, SK_ColorCYAN, SK_ColorMAGENTA, true); 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci SkPaint surfPaint; 88cb93a386Sopenharmony_ci surfPaint.setBlendMode(SkBlendMode::kSrcOver); 89cb93a386Sopenharmony_ci surface->draw(canvas, 0, 0, SkSamplingOptions(), &surfPaint); 90cb93a386Sopenharmony_ci } 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor, bool useGrad) { 93cb93a386Sopenharmony_ci const SkBlendMode gModes[] = { 94cb93a386Sopenharmony_ci SkBlendMode::kClear, 95cb93a386Sopenharmony_ci SkBlendMode::kSrc, 96cb93a386Sopenharmony_ci SkBlendMode::kDst, 97cb93a386Sopenharmony_ci SkBlendMode::kSrcOver, 98cb93a386Sopenharmony_ci SkBlendMode::kDstOver, 99cb93a386Sopenharmony_ci SkBlendMode::kSrcIn, 100cb93a386Sopenharmony_ci SkBlendMode::kDstIn, 101cb93a386Sopenharmony_ci SkBlendMode::kSrcOut, 102cb93a386Sopenharmony_ci SkBlendMode::kDstOut, 103cb93a386Sopenharmony_ci SkBlendMode::kSrcATop, 104cb93a386Sopenharmony_ci SkBlendMode::kDstATop, 105cb93a386Sopenharmony_ci SkBlendMode::kXor, 106cb93a386Sopenharmony_ci SkBlendMode::kPlus, 107cb93a386Sopenharmony_ci SkBlendMode::kModulate, 108cb93a386Sopenharmony_ci SkBlendMode::kScreen, 109cb93a386Sopenharmony_ci SkBlendMode::kOverlay, 110cb93a386Sopenharmony_ci SkBlendMode::kDarken, 111cb93a386Sopenharmony_ci SkBlendMode::kLighten, 112cb93a386Sopenharmony_ci SkBlendMode::kColorDodge, 113cb93a386Sopenharmony_ci SkBlendMode::kColorBurn, 114cb93a386Sopenharmony_ci SkBlendMode::kHardLight, 115cb93a386Sopenharmony_ci SkBlendMode::kSoftLight, 116cb93a386Sopenharmony_ci SkBlendMode::kDifference, 117cb93a386Sopenharmony_ci SkBlendMode::kExclusion, 118cb93a386Sopenharmony_ci SkBlendMode::kMultiply, 119cb93a386Sopenharmony_ci SkBlendMode::kHue, 120cb93a386Sopenharmony_ci SkBlendMode::kSaturation, 121cb93a386Sopenharmony_ci SkBlendMode::kColor, 122cb93a386Sopenharmony_ci SkBlendMode::kLuminosity, 123cb93a386Sopenharmony_ci }; 124cb93a386Sopenharmony_ci // Draw background rect 125cb93a386Sopenharmony_ci SkPaint backgroundPaint; 126cb93a386Sopenharmony_ci backgroundPaint.setColor(backgroundColor); 127cb93a386Sopenharmony_ci canvas->drawRect(SkRect::MakeIWH(kColWidth, kHeight), backgroundPaint); 128cb93a386Sopenharmony_ci SkScalar y = fTextHeight; 129cb93a386Sopenharmony_ci for (size_t m = 0; m < SK_ARRAY_COUNT(gModes); m++) { 130cb93a386Sopenharmony_ci SkPaint paint; 131cb93a386Sopenharmony_ci paint.setColor(textColor); 132cb93a386Sopenharmony_ci paint.setBlendMode(gModes[m]); 133cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), fTextHeight); 134cb93a386Sopenharmony_ci font.setSubpixel(true); 135cb93a386Sopenharmony_ci font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 136cb93a386Sopenharmony_ci if (useGrad) { 137cb93a386Sopenharmony_ci SkRect r; 138cb93a386Sopenharmony_ci r.setXYWH(0, y - fTextHeight, SkIntToScalar(kColWidth), fTextHeight); 139cb93a386Sopenharmony_ci paint.setShader(make_shader(r)); 140cb93a386Sopenharmony_ci } 141cb93a386Sopenharmony_ci SkString string(SkBlendMode_Name(gModes[m])); 142cb93a386Sopenharmony_ci canvas->drawString(string, 0, y, font, paint); 143cb93a386Sopenharmony_ci y+=fTextHeight; 144cb93a386Sopenharmony_ci } 145cb93a386Sopenharmony_ci } 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ciprivate: 148cb93a386Sopenharmony_ci SkScalar fTextHeight; 149cb93a386Sopenharmony_ci sk_sp<SkShader> fCheckerboard; 150cb93a386Sopenharmony_ci using INHERITED = skiagm::GM; 151cb93a386Sopenharmony_ci}; 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ciDEF_GM( return new LcdBlendGM; ) 156cb93a386Sopenharmony_ci} // namespace skiagm 157