1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "include/core/SkCanvas.h" 9 #include "include/core/SkColorFilter.h" 10 #include "include/core/SkColorPriv.h" 11 #include "include/core/SkDrawable.h" 12 #include "include/core/SkFont.h" 13 #include "include/core/SkPath.h" 14 #include "include/core/SkPathMeasure.h" 15 #include "include/core/SkPictureRecorder.h" 16 #include "include/core/SkRegion.h" 17 #include "include/core/SkShader.h" 18 #include "include/core/SkString.h" 19 #include "include/effects/Sk1DPathEffect.h" 20 #include "include/effects/SkCornerPathEffect.h" 21 #include "include/effects/SkGradientShader.h" 22 #include "include/utils/SkParsePath.h" 23 #include "include/utils/SkTextUtils.h" 24 #include "src/base/SkRandom.h" 25 #include "src/base/SkUTF.h" 26 #include "tools/fonts/FontToolUtils.h" 27 #include "tools/viewer/Slide.h" 28 29 class ArcsSlide : public Slide { 30 class MyDrawable : public SkDrawable { 31 SkRect fR; 32 SkScalar fSweep; 33 public: MyDrawable(const SkRect & r)34 MyDrawable(const SkRect& r) : fR(r), fSweep(0) {} 35 setSweep(SkScalar sweep)36 void setSweep(SkScalar sweep) { 37 if (fSweep != sweep) { 38 fSweep = sweep; 39 this->notifyDrawingChanged(); 40 } 41 } 42 onDraw(SkCanvas * canvas)43 void onDraw(SkCanvas* canvas) override { 44 SkPaint paint; 45 paint.setAntiAlias(true); 46 paint.setStrokeWidth(SkIntToScalar(2)); 47 48 paint.setStyle(SkPaint::kFill_Style); 49 paint.setColor(0x800000FF); 50 canvas->drawArc(fR, 0, fSweep, true, paint); 51 52 paint.setColor(0x800FF000); 53 canvas->drawArc(fR, 0, fSweep, false, paint); 54 55 paint.setStyle(SkPaint::kStroke_Style); 56 paint.setColor(SK_ColorRED); 57 canvas->drawArc(fR, 0, fSweep, true, paint); 58 59 paint.setStrokeWidth(0); 60 paint.setColor(SK_ColorBLUE); 61 canvas->drawArc(fR, 0, fSweep, false, paint); 62 } 63 onGetBounds()64 SkRect onGetBounds() override { 65 SkRect r(fR); 66 r.outset(2, 2); 67 return r; 68 } 69 }; 70 71 SkRect fRect = {20, 20, 220, 220}; 72 sk_sp<MyDrawable> fAnimatingDrawable; 73 sk_sp<SkDrawable> fRootDrawable; 74 DrawRectWithLines(SkCanvas * canvas,const SkRect & r,const SkPaint & p)75 static void DrawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 76 canvas->drawRect(r, p); 77 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); 78 canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); 79 canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); 80 canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); 81 } 82 DrawLabel(SkCanvas * canvas,const SkRect & rect,SkScalar start,SkScalar sweep)83 static void DrawLabel(SkCanvas* canvas, const SkRect& rect, SkScalar start, SkScalar sweep) { 84 SkFont font = ToolUtils::DefaultFont(); 85 SkString str; 86 str.appendScalar(start); 87 str.append(", "); 88 str.appendScalar(sweep); 89 SkTextUtils::DrawString(canvas, str.c_str(), rect.centerX(), 90 rect.fBottom + font.getSize() * 5/4, font, SkPaint(), 91 SkTextUtils::kCenter_Align); 92 } 93 DrawArcs(SkCanvas * canvas)94 static void DrawArcs(SkCanvas* canvas) { 95 SkPaint paint; 96 SkRect r; 97 SkScalar w = 75; 98 SkScalar h = 50; 99 100 r.setWH(w, h); 101 paint.setAntiAlias(true); 102 paint.setStyle(SkPaint::kStroke_Style); 103 104 canvas->save(); 105 canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); 106 107 paint.setStrokeWidth(SkIntToScalar(1)); 108 109 static const SkScalar gAngles[] = { 110 0, 360, 111 0, 45, 112 0, -45, 113 720, 135, 114 -90, 269, 115 -90, 270, 116 -90, 271, 117 -180, -270, 118 225, 90 119 }; 120 121 for (size_t i = 0; i < std::size(gAngles); i += 2) { 122 paint.setColor(SK_ColorBLACK); 123 DrawRectWithLines(canvas, r, paint); 124 125 paint.setColor(SK_ColorRED); 126 canvas->drawArc(r, gAngles[i], gAngles[i+1], false, paint); 127 128 DrawLabel(canvas, r, gAngles[i], gAngles[i+1]); 129 130 canvas->translate(w * 8 / 7, 0); 131 } 132 133 canvas->restore(); 134 } 135 drawRoot(SkCanvas * canvas)136 void drawRoot(SkCanvas* canvas) { 137 SkPaint paint; 138 paint.setAntiAlias(true); 139 paint.setStrokeWidth(SkIntToScalar(2)); 140 paint.setStyle(SkPaint::kStroke_Style); 141 142 DrawRectWithLines(canvas, fRect, paint); 143 144 canvas->drawDrawable(fAnimatingDrawable.get()); 145 146 DrawArcs(canvas); 147 } 148 149 public: ArcsSlide()150 ArcsSlide() { fName = "Arcs"; } 151 load(SkScalar w,SkScalar h)152 void load(SkScalar w, SkScalar h) override { 153 fAnimatingDrawable = sk_make_sp<MyDrawable>(fRect); 154 155 SkPictureRecorder recorder; 156 this->drawRoot(recorder.beginRecording(SkRect::MakeWH(800, 500))); 157 fRootDrawable = recorder.finishRecordingAsDrawable(); 158 } 159 draw(SkCanvas * canvas)160 void draw(SkCanvas* canvas) override { 161 canvas->clear(0xFFDDDDDD); 162 canvas->drawDrawable(fRootDrawable.get()); 163 } 164 animate(double nanos)165 bool animate(double nanos) override { 166 SkScalar angle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 24, 360)); 167 if (fAnimatingDrawable) { 168 fAnimatingDrawable->setSweep(angle); 169 } 170 return true; 171 } 172 }; 173 174 DEF_SLIDE( return new ArcsSlide(); ) 175