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