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/SkColorFilter.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h" 11cb93a386Sopenharmony_ci#include "include/core/SkDrawable.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPathMeasure.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPictureRecorder.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRegion.h" 16cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 17cb93a386Sopenharmony_ci#include "include/core/SkString.h" 18cb93a386Sopenharmony_ci#include "include/effects/Sk1DPathEffect.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/utils/SkUTF.h" 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci#include "include/utils/SkParsePath.h" 27cb93a386Sopenharmony_cistatic void testparse() { 28cb93a386Sopenharmony_ci SkRect r; 29cb93a386Sopenharmony_ci r.setLTRB(0, 0, 10, 10.5f); 30cb93a386Sopenharmony_ci SkPath p, p2; 31cb93a386Sopenharmony_ci SkString str, str2; 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci p.addRect(r); 34cb93a386Sopenharmony_ci SkParsePath::ToSVGString(p, &str); 35cb93a386Sopenharmony_ci SkParsePath::FromSVGString(str.c_str(), &p2); 36cb93a386Sopenharmony_ci SkParsePath::ToSVGString(p2, &str2); 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciclass ArcsView : public Sample { 40cb93a386Sopenharmony_ci class MyDrawable : public SkDrawable { 41cb93a386Sopenharmony_ci SkRect fR; 42cb93a386Sopenharmony_ci SkScalar fSweep; 43cb93a386Sopenharmony_ci public: 44cb93a386Sopenharmony_ci MyDrawable(const SkRect& r) : fR(r), fSweep(0) {} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci void setSweep(SkScalar sweep) { 47cb93a386Sopenharmony_ci if (fSweep != sweep) { 48cb93a386Sopenharmony_ci fSweep = sweep; 49cb93a386Sopenharmony_ci this->notifyDrawingChanged(); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 54cb93a386Sopenharmony_ci SkPaint paint; 55cb93a386Sopenharmony_ci paint.setAntiAlias(true); 56cb93a386Sopenharmony_ci paint.setStrokeWidth(SkIntToScalar(2)); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kFill_Style); 59cb93a386Sopenharmony_ci paint.setColor(0x800000FF); 60cb93a386Sopenharmony_ci canvas->drawArc(fR, 0, fSweep, true, paint); 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci paint.setColor(0x800FF000); 63cb93a386Sopenharmony_ci canvas->drawArc(fR, 0, fSweep, false, paint); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 66cb93a386Sopenharmony_ci paint.setColor(SK_ColorRED); 67cb93a386Sopenharmony_ci canvas->drawArc(fR, 0, fSweep, true, paint); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci paint.setStrokeWidth(0); 70cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLUE); 71cb93a386Sopenharmony_ci canvas->drawArc(fR, 0, fSweep, false, paint); 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkRect onGetBounds() override { 75cb93a386Sopenharmony_ci SkRect r(fR); 76cb93a386Sopenharmony_ci r.outset(2, 2); 77cb93a386Sopenharmony_ci return r; 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci }; 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci SkRect fRect = {20, 20, 220, 220}; 82cb93a386Sopenharmony_ci sk_sp<MyDrawable> fAnimatingDrawable; 83cb93a386Sopenharmony_ci sk_sp<SkDrawable> fRootDrawable; 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci SkString name() override { return SkString("Arcs"); } 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci static void DrawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 88cb93a386Sopenharmony_ci canvas->drawRect(r, p); 89cb93a386Sopenharmony_ci canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); 90cb93a386Sopenharmony_ci canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); 91cb93a386Sopenharmony_ci canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); 92cb93a386Sopenharmony_ci canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci static void DrawLabel(SkCanvas* canvas, const SkRect& rect, SkScalar start, SkScalar sweep) { 96cb93a386Sopenharmony_ci SkFont font; 97cb93a386Sopenharmony_ci SkString str; 98cb93a386Sopenharmony_ci str.appendScalar(start); 99cb93a386Sopenharmony_ci str.append(", "); 100cb93a386Sopenharmony_ci str.appendScalar(sweep); 101cb93a386Sopenharmony_ci SkTextUtils::DrawString(canvas, str.c_str(), rect.centerX(), 102cb93a386Sopenharmony_ci rect.fBottom + font.getSize() * 5/4, font, SkPaint(), 103cb93a386Sopenharmony_ci SkTextUtils::kCenter_Align); 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci static void DrawArcs(SkCanvas* canvas) { 107cb93a386Sopenharmony_ci SkPaint paint; 108cb93a386Sopenharmony_ci SkRect r; 109cb93a386Sopenharmony_ci SkScalar w = 75; 110cb93a386Sopenharmony_ci SkScalar h = 50; 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci r.setWH(w, h); 113cb93a386Sopenharmony_ci paint.setAntiAlias(true); 114cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci canvas->save(); 117cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci paint.setStrokeWidth(SkIntToScalar(1)); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci static const SkScalar gAngles[] = { 122cb93a386Sopenharmony_ci 0, 360, 123cb93a386Sopenharmony_ci 0, 45, 124cb93a386Sopenharmony_ci 0, -45, 125cb93a386Sopenharmony_ci 720, 135, 126cb93a386Sopenharmony_ci -90, 269, 127cb93a386Sopenharmony_ci -90, 270, 128cb93a386Sopenharmony_ci -90, 271, 129cb93a386Sopenharmony_ci -180, -270, 130cb93a386Sopenharmony_ci 225, 90 131cb93a386Sopenharmony_ci }; 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) { 134cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLACK); 135cb93a386Sopenharmony_ci DrawRectWithLines(canvas, r, paint); 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ci paint.setColor(SK_ColorRED); 138cb93a386Sopenharmony_ci canvas->drawArc(r, gAngles[i], gAngles[i+1], false, paint); 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci DrawLabel(canvas, r, gAngles[i], gAngles[i+1]); 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci canvas->translate(w * 8 / 7, 0); 143cb93a386Sopenharmony_ci } 144cb93a386Sopenharmony_ci 145cb93a386Sopenharmony_ci canvas->restore(); 146cb93a386Sopenharmony_ci } 147cb93a386Sopenharmony_ci 148cb93a386Sopenharmony_ci void drawRoot(SkCanvas* canvas) { 149cb93a386Sopenharmony_ci SkPaint paint; 150cb93a386Sopenharmony_ci paint.setAntiAlias(true); 151cb93a386Sopenharmony_ci paint.setStrokeWidth(SkIntToScalar(2)); 152cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 153cb93a386Sopenharmony_ci 154cb93a386Sopenharmony_ci DrawRectWithLines(canvas, fRect, paint); 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci canvas->drawDrawable(fAnimatingDrawable.get()); 157cb93a386Sopenharmony_ci 158cb93a386Sopenharmony_ci DrawArcs(canvas); 159cb93a386Sopenharmony_ci } 160cb93a386Sopenharmony_ci 161cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 162cb93a386Sopenharmony_ci testparse(); 163cb93a386Sopenharmony_ci this->setBGColor(0xFFDDDDDD); 164cb93a386Sopenharmony_ci 165cb93a386Sopenharmony_ci fAnimatingDrawable = sk_make_sp<MyDrawable>(fRect); 166cb93a386Sopenharmony_ci 167cb93a386Sopenharmony_ci SkPictureRecorder recorder; 168cb93a386Sopenharmony_ci this->drawRoot(recorder.beginRecording(SkRect::MakeWH(800, 500))); 169cb93a386Sopenharmony_ci fRootDrawable = recorder.finishRecordingAsDrawable(); 170cb93a386Sopenharmony_ci } 171cb93a386Sopenharmony_ci 172cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 173cb93a386Sopenharmony_ci canvas->drawDrawable(fRootDrawable.get()); 174cb93a386Sopenharmony_ci } 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_ci bool onAnimate(double nanos) override { 177cb93a386Sopenharmony_ci SkScalar angle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 24, 360)); 178cb93a386Sopenharmony_ci if (fAnimatingDrawable) { 179cb93a386Sopenharmony_ci fAnimatingDrawable->setSweep(angle); 180cb93a386Sopenharmony_ci } 181cb93a386Sopenharmony_ci return true; 182cb93a386Sopenharmony_ci } 183cb93a386Sopenharmony_ci}; 184cb93a386Sopenharmony_ci 185cb93a386Sopenharmony_ciDEF_SAMPLE( return new ArcsView(); ) 186