1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2012 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/SkPath.h" 16cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 17cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 18cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 19cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 20cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 21cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 22cb93a386Sopenharmony_ci#include "include/core/SkString.h" 23cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 24cb93a386Sopenharmony_ci#include "include/core/SkTileMode.h" 25cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 26cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 27cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 28cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci#define W SkIntToScalar(80) 31cb93a386Sopenharmony_ci#define H SkIntToScalar(60) 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_citypedef void (*PaintProc)(SkPaint*); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cistatic void identity_paintproc(SkPaint* paint) { 36cb93a386Sopenharmony_ci paint->setShader(nullptr); 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_cistatic void gradient_paintproc(SkPaint* paint) { 40cb93a386Sopenharmony_ci const SkColor colors[] = { SK_ColorGREEN, SK_ColorBLUE }; 41cb93a386Sopenharmony_ci const SkPoint pts[] = { { 0, 0 }, { W, H } }; 42cb93a386Sopenharmony_ci paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors), 43cb93a386Sopenharmony_ci SkTileMode::kClamp)); 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_citypedef void (*Proc)(SkCanvas*, const SkPaint&, const SkFont&); 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_cistatic void draw_hair(SkCanvas* canvas, const SkPaint& paint, const SkFont&) { 49cb93a386Sopenharmony_ci SkPaint p(paint); 50cb93a386Sopenharmony_ci p.setStrokeWidth(0); 51cb93a386Sopenharmony_ci canvas->drawLine(0, 0, W, H, p); 52cb93a386Sopenharmony_ci} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_cistatic void draw_thick(SkCanvas* canvas, const SkPaint& paint, const SkFont&) { 55cb93a386Sopenharmony_ci SkPaint p(paint); 56cb93a386Sopenharmony_ci p.setStrokeWidth(H/5); 57cb93a386Sopenharmony_ci canvas->drawLine(0, 0, W, H, p); 58cb93a386Sopenharmony_ci} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_cistatic void draw_rect(SkCanvas* canvas, const SkPaint& paint, const SkFont&) { 61cb93a386Sopenharmony_ci canvas->drawRect(SkRect::MakeWH(W, H), paint); 62cb93a386Sopenharmony_ci} 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_cistatic void draw_oval(SkCanvas* canvas, const SkPaint& paint, const SkFont&) { 65cb93a386Sopenharmony_ci canvas->drawOval(SkRect::MakeWH(W, H), paint); 66cb93a386Sopenharmony_ci} 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_cistatic void draw_text(SkCanvas* canvas, const SkPaint& paint, const SkFont& font) { 69cb93a386Sopenharmony_ci canvas->drawString("Hamburge", 0, H*2/3, font, paint); 70cb93a386Sopenharmony_ci} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciclass SrcModeGM : public skiagm::GM { 73cb93a386Sopenharmony_ci SkPath fPath; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { this->setBGColor(SK_ColorBLACK); } 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("srcmode"); } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci SkISize onISize() override { return {640, 760}; } 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci void drawContent(SkCanvas* canvas) { 82cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci SkPaint paint; 85cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), H / 4); 86cb93a386Sopenharmony_ci paint.setColor(0x80F60000); 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci const Proc procs[] = { 89cb93a386Sopenharmony_ci draw_hair, draw_thick, draw_rect, draw_oval, draw_text 90cb93a386Sopenharmony_ci }; 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci const SkBlendMode modes[] = { 93cb93a386Sopenharmony_ci SkBlendMode::kSrcOver, SkBlendMode::kSrc, SkBlendMode::kClear 94cb93a386Sopenharmony_ci }; 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci const PaintProc paintProcs[] = { 97cb93a386Sopenharmony_ci identity_paintproc, gradient_paintproc 98cb93a386Sopenharmony_ci }; 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci for (int aa = 0; aa <= 1; ++aa) { 101cb93a386Sopenharmony_ci paint.setAntiAlias(SkToBool(aa)); 102cb93a386Sopenharmony_ci font.setEdging(SkToBool(aa) ? SkFont::Edging::kAntiAlias : SkFont::Edging::kAlias); 103cb93a386Sopenharmony_ci canvas->save(); 104cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(paintProcs); ++i) { 105cb93a386Sopenharmony_ci paintProcs[i](&paint); 106cb93a386Sopenharmony_ci for (size_t x = 0; x < SK_ARRAY_COUNT(modes); ++x) { 107cb93a386Sopenharmony_ci paint.setBlendMode(modes[x]); 108cb93a386Sopenharmony_ci canvas->save(); 109cb93a386Sopenharmony_ci for (size_t y = 0; y < SK_ARRAY_COUNT(procs); ++y) { 110cb93a386Sopenharmony_ci procs[y](canvas, paint, font); 111cb93a386Sopenharmony_ci canvas->translate(0, H * 5 / 4); 112cb93a386Sopenharmony_ci } 113cb93a386Sopenharmony_ci canvas->restore(); 114cb93a386Sopenharmony_ci canvas->translate(W * 5 / 4, 0); 115cb93a386Sopenharmony_ci } 116cb93a386Sopenharmony_ci } 117cb93a386Sopenharmony_ci canvas->restore(); 118cb93a386Sopenharmony_ci canvas->translate(0, (H * 5 / 4) * SK_ARRAY_COUNT(procs)); 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci } 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci static sk_sp<SkSurface> compat_surface(SkCanvas* canvas, const SkISize& size) { 123cb93a386Sopenharmony_ci SkImageInfo info = SkImageInfo::MakeN32Premul(size); 124cb93a386Sopenharmony_ci sk_sp<SkSurface> surface = canvas->makeSurface(info); 125cb93a386Sopenharmony_ci if (nullptr == surface) { 126cb93a386Sopenharmony_ci // picture canvas will return null, so fall-back to raster 127cb93a386Sopenharmony_ci surface = SkSurface::MakeRaster(info); 128cb93a386Sopenharmony_ci } 129cb93a386Sopenharmony_ci return surface; 130cb93a386Sopenharmony_ci } 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 133cb93a386Sopenharmony_ci auto surf(compat_surface(canvas, this->getISize())); 134cb93a386Sopenharmony_ci surf->getCanvas()->drawColor(SK_ColorWHITE); 135cb93a386Sopenharmony_ci this->drawContent(surf->getCanvas()); 136cb93a386Sopenharmony_ci surf->draw(canvas, 0, 0); 137cb93a386Sopenharmony_ci } 138cb93a386Sopenharmony_ci}; 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ciDEF_GM(return new SrcModeGM;) 143