1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 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 "include/core/SkBitmap.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h" 12cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 13cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRegion.h" 16cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 17cb93a386Sopenharmony_ci#include "include/core/SkTime.h" 18cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 19cb93a386Sopenharmony_ci#include "include/effects/SkCornerPathEffect.h" 20cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 21cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 22cb93a386Sopenharmony_ci#include "include/utils/SkTextUtils.h" 23cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 24cb93a386Sopenharmony_ci#include "src/core/SkBlurMask.h" 25cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h" 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h" 28cb93a386Sopenharmony_ci#include "include/core/SkMaskFilter.h" 29cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_cistatic void setNamedTypeface(SkFont* font, const char name[]) { 32cb93a386Sopenharmony_ci font->setTypeface(SkTypeface::MakeFromName(name, SkFontStyle())); 33cb93a386Sopenharmony_ci} 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cistatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciclass XfermodesBlurView : public Sample { 38cb93a386Sopenharmony_ci SkBitmap fBG; 39cb93a386Sopenharmony_ci SkBitmap fSrcB, fDstB; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) { 42cb93a386Sopenharmony_ci SkPaint p; 43cb93a386Sopenharmony_ci p.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 44cb93a386Sopenharmony_ci SkBlurMask::ConvertRadiusToSigma(5))); 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci SkScalar ww = SkIntToScalar(W); 47cb93a386Sopenharmony_ci SkScalar hh = SkIntToScalar(H); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci // draw a circle covering the upper 50cb93a386Sopenharmony_ci // left three quarters of the canvas 51cb93a386Sopenharmony_ci p.setColor(0xFFCC44FF); 52cb93a386Sopenharmony_ci SkRect r; 53cb93a386Sopenharmony_ci r.setLTRB(0, 0, ww*3/4, hh*3/4); 54cb93a386Sopenharmony_ci r.offset(x, y); 55cb93a386Sopenharmony_ci canvas->drawOval(r, p); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci p.setBlendMode(mode); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci // draw a square overlapping the circle 60cb93a386Sopenharmony_ci // in the lower right of the canvas 61cb93a386Sopenharmony_ci p.setColor(0x00AA6633 | alpha << 24); 62cb93a386Sopenharmony_ci r.setLTRB(ww/3, hh/3, ww*19/20, hh*19/20); 63cb93a386Sopenharmony_ci r.offset(x, y); 64cb93a386Sopenharmony_ci canvas->drawRect(r, p); 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_cipublic: 68cb93a386Sopenharmony_ci const static int W = 64; 69cb93a386Sopenharmony_ci const static int H = 64; 70cb93a386Sopenharmony_ci XfermodesBlurView() { 71cb93a386Sopenharmony_ci fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType), 72cb93a386Sopenharmony_ci gBG, 4); 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ciprotected: 76cb93a386Sopenharmony_ci SkString name() override { return SkString("XfermodesBlur"); } 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 79cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci const SkBlendMode gModes[] = { 82cb93a386Sopenharmony_ci SkBlendMode::kClear, 83cb93a386Sopenharmony_ci SkBlendMode::kSrc, 84cb93a386Sopenharmony_ci SkBlendMode::kDst, 85cb93a386Sopenharmony_ci SkBlendMode::kSrcOver, 86cb93a386Sopenharmony_ci SkBlendMode::kDstOver, 87cb93a386Sopenharmony_ci SkBlendMode::kSrcIn, 88cb93a386Sopenharmony_ci SkBlendMode::kDstIn, 89cb93a386Sopenharmony_ci SkBlendMode::kSrcOut, 90cb93a386Sopenharmony_ci SkBlendMode::kDstOut, 91cb93a386Sopenharmony_ci SkBlendMode::kSrcATop, 92cb93a386Sopenharmony_ci SkBlendMode::kDstATop, 93cb93a386Sopenharmony_ci SkBlendMode::kXor, 94cb93a386Sopenharmony_ci SkBlendMode::kPlus, 95cb93a386Sopenharmony_ci }; 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci const SkScalar w = SkIntToScalar(W); 98cb93a386Sopenharmony_ci const SkScalar h = SkIntToScalar(H); 99cb93a386Sopenharmony_ci SkMatrix m; 100cb93a386Sopenharmony_ci m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 101cb93a386Sopenharmony_ci auto s = fBG.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions(), m); 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci SkFont font; 104cb93a386Sopenharmony_ci font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 105cb93a386Sopenharmony_ci setNamedTypeface(&font, "Menlo Regular"); 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci const int kWrap = 5; 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci SkScalar x0 = 0; 110cb93a386Sopenharmony_ci for (int twice = 0; twice < 2; twice++) { 111cb93a386Sopenharmony_ci SkScalar x = x0, y = 0; 112cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 113cb93a386Sopenharmony_ci SkRect r; 114cb93a386Sopenharmony_ci r.setLTRB(x, y, x+w, y+h); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci SkPaint p; 117cb93a386Sopenharmony_ci p.setStyle(SkPaint::kFill_Style); 118cb93a386Sopenharmony_ci p.setShader(s); 119cb93a386Sopenharmony_ci canvas->drawRect(r, p); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci canvas->saveLayer(&r, nullptr); 122cb93a386Sopenharmony_ci draw_mode(canvas, gModes[i], twice ? 0x88 : 0xFF, r.fLeft, r.fTop); 123cb93a386Sopenharmony_ci canvas->restore(); 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 126cb93a386Sopenharmony_ci p.setStyle(SkPaint::kStroke_Style); 127cb93a386Sopenharmony_ci p.setShader(nullptr); 128cb93a386Sopenharmony_ci canvas->drawRect(r, p); 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci const char* label = SkBlendMode_Name(gModes[i]); 131cb93a386Sopenharmony_ci SkTextUtils::DrawString(canvas, label, x + w/2, y - font.getSize()/2, font, SkPaint(), 132cb93a386Sopenharmony_ci SkTextUtils::kCenter_Align); 133cb93a386Sopenharmony_ci x += w + SkIntToScalar(10); 134cb93a386Sopenharmony_ci if ((i % kWrap) == kWrap - 1) { 135cb93a386Sopenharmony_ci x = x0; 136cb93a386Sopenharmony_ci y += h + SkIntToScalar(30); 137cb93a386Sopenharmony_ci } 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci x0 += SkIntToScalar(400); 140cb93a386Sopenharmony_ci } 141cb93a386Sopenharmony_ci } 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ciprivate: 144cb93a386Sopenharmony_ci using INHERITED = Sample; 145cb93a386Sopenharmony_ci}; 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_ciDEF_SAMPLE( return new XfermodesBlurView(); ) 150