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/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPathMeasure.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRegion.h" 13cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 14cb93a386Sopenharmony_ci#include "include/effects/Sk1DPathEffect.h" 15cb93a386Sopenharmony_ci#include "include/effects/SkCornerPathEffect.h" 16cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 17cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 18cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 19cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h" 20cb93a386Sopenharmony_ci#include "tools/timer/TimeUtils.h" 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci#define CORNER_RADIUS 12 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cistatic const int gXY[] = { 25cb93a386Sopenharmony_ci 4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4 26cb93a386Sopenharmony_ci}; 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_cistatic sk_sp<SkPathEffect> make_pe(int flags, SkScalar phase) { 29cb93a386Sopenharmony_ci if (flags == 1) { 30cb93a386Sopenharmony_ci return SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS)); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci SkPath path; 34cb93a386Sopenharmony_ci path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1])); 35cb93a386Sopenharmony_ci for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) 36cb93a386Sopenharmony_ci path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1])); 37cb93a386Sopenharmony_ci path.close(); 38cb93a386Sopenharmony_ci path.offset(SkIntToScalar(-6), 0); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci auto outer = SkPath1DPathEffect::Make(path, 12, phase, SkPath1DPathEffect::kRotate_Style); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci if (flags == 2) 43cb93a386Sopenharmony_ci return outer; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS)); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci return SkPathEffect::MakeCompose(outer, inner); 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cistatic sk_sp<SkPathEffect> make_warp_pe(SkScalar phase) { 51cb93a386Sopenharmony_ci SkPath path; 52cb93a386Sopenharmony_ci path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1])); 53cb93a386Sopenharmony_ci for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) { 54cb93a386Sopenharmony_ci path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1])); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci path.close(); 57cb93a386Sopenharmony_ci path.offset(SkIntToScalar(-6), 0); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci auto outer = SkPath1DPathEffect::Make( 60cb93a386Sopenharmony_ci path, 12, phase, SkPath1DPathEffect::kMorph_Style); 61cb93a386Sopenharmony_ci auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS)); 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci return SkPathEffect::MakeCompose(outer, inner); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////// 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h" 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ciclass PathEffectView : public Sample { 71cb93a386Sopenharmony_ci SkPath fPath; 72cb93a386Sopenharmony_ci SkPoint fClickPt; 73cb93a386Sopenharmony_ci SkScalar fPhase; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_cipublic: 76cb93a386Sopenharmony_ci PathEffectView() : fPhase(0) { 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ciprotected: 80cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 81cb93a386Sopenharmony_ci SkRandom rand; 82cb93a386Sopenharmony_ci int steps = 20; 83cb93a386Sopenharmony_ci SkScalar dist = SkIntToScalar(400); 84cb93a386Sopenharmony_ci SkScalar x = SkIntToScalar(20); 85cb93a386Sopenharmony_ci SkScalar y = SkIntToScalar(50); 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci fPath.moveTo(x, y); 88cb93a386Sopenharmony_ci for (int i = 0; i < steps; i++) { 89cb93a386Sopenharmony_ci x += dist/steps; 90cb93a386Sopenharmony_ci SkScalar tmpY = y + SkIntToScalar(rand.nextS() % 25); 91cb93a386Sopenharmony_ci if (i == steps/2) { 92cb93a386Sopenharmony_ci fPath.moveTo(x, tmpY); 93cb93a386Sopenharmony_ci } else { 94cb93a386Sopenharmony_ci fPath.lineTo(x, tmpY); 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci { 99cb93a386Sopenharmony_ci SkRect oval; 100cb93a386Sopenharmony_ci oval.setLTRB(20, 30, 100, 60); 101cb93a386Sopenharmony_ci oval.offset(x, 0); 102cb93a386Sopenharmony_ci fPath.addRoundRect(oval, SkIntToScalar(8), SkIntToScalar(8)); 103cb93a386Sopenharmony_ci } 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci fClickPt.set(SkIntToScalar(200), SkIntToScalar(200)); 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci this->setBGColor(0xFFDDDDDD); 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci SkString name() override { return SkString("PathEffects"); } 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 113cb93a386Sopenharmony_ci SkPaint paint; 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci canvas->translate(0, 50); 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLUE); 118cb93a386Sopenharmony_ci paint.setPathEffect(make_pe(2, fPhase)); 119cb93a386Sopenharmony_ci canvas->drawPath(fPath, paint); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci canvas->translate(0, 50); 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci paint.setARGB(0xFF, 0, 0xBB, 0); 124cb93a386Sopenharmony_ci paint.setPathEffect(make_pe(3, fPhase)); 125cb93a386Sopenharmony_ci canvas->drawPath(fPath, paint); 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci canvas->translate(0, 50); 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci paint.setARGB(0xFF, 0, 0, 0); 130cb93a386Sopenharmony_ci paint.setPathEffect(make_warp_pe(fPhase)); 131cb93a386Sopenharmony_ci canvas->drawPath(fPath, paint); 132cb93a386Sopenharmony_ci } 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci bool onAnimate(double nanos) override { 135cb93a386Sopenharmony_ci fPhase = TimeUtils::Scaled(1e-9 * nanos, 40); 136cb93a386Sopenharmony_ci return true; 137cb93a386Sopenharmony_ci } 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ciprivate: 140cb93a386Sopenharmony_ci using INHERITED = Sample; 141cb93a386Sopenharmony_ci}; 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 144cb93a386Sopenharmony_ci 145cb93a386Sopenharmony_ciDEF_SAMPLE( return new PathEffectView(); ) 146