#include "SampleCode.h" #include "SkView.h" #include "SkCanvas.h" #include "SkGradientShader.h" #include "SkPath.h" #include "SkRegion.h" #include "SkShader.h" #include "SkUtils.h" #include "SkComposeShader.h" #include "Sk1DPathEffect.h" #include "SkCornerPathEffect.h" #include "SkPathMeasure.h" #include "SkRandom.h" #include "SkColorPriv.h" #include "SkColorFilter.h" #include "SkPorterDuff.h" #include "SkLayerRasterizer.h" class ArcsView : public SkView { public: ArcsView() { fSweep = SkIntToScalar(100); } protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { if (SampleCode::TitleQ(*evt)) { SampleCode::TitleR(evt, "Arcs"); return true; } return this->INHERITED::onQuery(evt); } void drawBG(SkCanvas* canvas) { canvas->drawColor(0xFFDDDDDD); } static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { canvas->drawRect(r, p); canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); } static void draw_label(SkCanvas* canvas, const SkRect& rect, int start, int sweep) { SkPaint paint; paint.setAntiAlias(true); paint.setTextAlign(SkPaint::kCenter_Align); SkString str; str.appendS32(start); str.append(", "); str.appendS32(sweep); canvas->drawText(str.c_str(), str.size(), rect.centerX(), rect.fBottom + paint.getTextSize() * 5/4, paint); } static void drawArcs(SkCanvas* canvas) { SkPaint paint; SkRect r; SkScalar w = SkIntToScalar(75); SkScalar h = SkIntToScalar(50); r.set(0, 0, w, h); paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); canvas->save(); canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); paint.setStrokeWidth(SkIntToScalar(1)); static const int gAngles[] = { 0, 360, 0, 45, 0, -45, 720, 135, -90, 269, -90, 270, -90, 271, -180, -270, 225, 90 }; for (int i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) { paint.setColor(SK_ColorBLACK); drawRectWithLines(canvas, r, paint); paint.setColor(SK_ColorRED); canvas->drawArc(r, SkIntToScalar(gAngles[i]), SkIntToScalar(gAngles[i+1]), false, paint); draw_label(canvas, r, gAngles[i], gAngles[i+1]); canvas->translate(w * 8 / 7, 0); } canvas->restore(); } virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); SkRect r; SkPaint paint; paint.setAntiAlias(true); paint.setStrokeWidth(SkIntToScalar(2)); paint.setStyle(SkPaint::kStroke_Style); r.set(0, 0, SkIntToScalar(200), SkIntToScalar(200)); r.offset(SkIntToScalar(20), SkIntToScalar(20)); if (false) { const SkScalar d = SkIntToScalar(3); const SkScalar rad[] = { d, d, d, d, d, d, d, d }; SkPath path; path.addRoundRect(r, rad); canvas->drawPath(path, paint); return; } drawRectWithLines(canvas, r, paint); // printf("----- sweep %g %X\n", SkScalarToFloat(fSweep), SkDegreesToRadians(fSweep)); paint.setStyle(SkPaint::kFill_Style); paint.setColor(0x800000FF); canvas->drawArc(r, 0, fSweep, true, paint); paint.setColor(0x800FF000); canvas->drawArc(r, 0, fSweep, false, paint); paint.setStyle(SkPaint::kStroke_Style); paint.setColor(SK_ColorRED); canvas->drawArc(r, 0, fSweep, true, paint); paint.setStrokeWidth(0); paint.setColor(SK_ColorBLUE); canvas->drawArc(r, 0, fSweep, false, paint); fSweep += SK_Scalar1/4; if (fSweep > SkIntToScalar(360)) fSweep = 0; drawArcs(canvas); this->inval(NULL); } virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { // fSweep += SK_Scalar1; this->inval(NULL); return this->INHERITED::onFindClickHandler(x, y); } virtual bool onClick(Click* click) { return this->INHERITED::onClick(click); } private: SkScalar fSweep; typedef SkView INHERITED; }; ////////////////////////////////////////////////////////////////////////////// static SkView* MyFactory() { return new ArcsView; } static SkViewRegister reg(MyFactory);