SampleArc.cpp revision 7e76bff26e7c74902841ca4f607eb0b24a833a4a
1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8#include "SampleCode.h" 9#include "SkView.h" 10#include "SkCanvas.h" 11#include "SkGradientShader.h" 12#include "SkPath.h" 13#include "SkRegion.h" 14#include "SkShader.h" 15#include "SkUtils.h" 16#include "SkComposeShader.h" 17#include "Sk1DPathEffect.h" 18#include "SkCornerPathEffect.h" 19#include "SkPathMeasure.h" 20#include "SkRandom.h" 21#include "SkColorPriv.h" 22#include "SkColorFilter.h" 23#include "SkLayerRasterizer.h" 24 25#include "SkCanvasDrawable.h" 26 27#include "SkParsePath.h" 28static void testparse() { 29 SkRect r; 30 r.set(0, 0, 10, 10.5f); 31 SkPath p, p2; 32 SkString str, str2; 33 34 p.addRect(r); 35 SkParsePath::ToSVGString(p, &str); 36 SkParsePath::FromSVGString(str.c_str(), &p2); 37 SkParsePath::ToSVGString(p2, &str2); 38} 39 40#include "SkPictureRecorder.h" 41static void test_pictbounds(SkCanvas* canvas) { 42 SkRect r = SkRect::MakeXYWH(100, 50, 100, 100); 43 SkPictureRecorder recorder; 44 { 45 SkCanvas* c = recorder.beginRecording(r, NULL, 0); 46 c->drawOval(r, SkPaint()); 47 48 SkIRect ir; 49 c->getClipDeviceBounds(&ir); 50 SkDebugf("devbounds [%d %d %d %d]\n", ir.left(), ir.top(), ir.right(), ir.bottom()); 51 52 SkASSERT(!c->quickReject(r)); 53 } 54 SkPicture* pic = recorder.endRecording(); 55 56 canvas->drawPicture(pic); 57 SkASSERT(pic->cullRect() == r); 58 pic->unref(); 59} 60 61class ArcsView : public SampleView { 62 class MyDrawable : public SkCanvasDrawable { 63 SkRect fR; 64 SkScalar fSweep; 65 public: 66 MyDrawable(const SkRect& r) : fR(r), fSweep(0) { 67 } 68 69 void setSweep(SkScalar sweep) { 70 if (fSweep != sweep) { 71 fSweep = sweep; 72 this->notifyDrawingChanged(); 73 } 74 } 75 76 void onDraw(SkCanvas* canvas) SK_OVERRIDE { 77 SkPaint paint; 78 paint.setAntiAlias(true); 79 paint.setStrokeWidth(SkIntToScalar(2)); 80 81 paint.setStyle(SkPaint::kFill_Style); 82 paint.setColor(0x800000FF); 83 canvas->drawArc(fR, 0, fSweep, true, paint); 84 85 paint.setColor(0x800FF000); 86 canvas->drawArc(fR, 0, fSweep, false, paint); 87 88 paint.setStyle(SkPaint::kStroke_Style); 89 paint.setColor(SK_ColorRED); 90 canvas->drawArc(fR, 0, fSweep, true, paint); 91 92 paint.setStrokeWidth(0); 93 paint.setColor(SK_ColorBLUE); 94 canvas->drawArc(fR, 0, fSweep, false, paint); 95 } 96 97 SkRect onGetBounds() SK_OVERRIDE { 98 SkRect r(fR); 99 r.outset(2, 2); 100 return r; 101 } 102 }; 103 104public: 105 SkRect fRect; 106 MyDrawable* fDrawable; 107 108 ArcsView() { 109 testparse(); 110 fSweep = SkIntToScalar(100); 111 this->setBGColor(0xFFDDDDDD); 112 113 fRect.set(0, 0, SkIntToScalar(200), SkIntToScalar(200)); 114 fRect.offset(SkIntToScalar(20), SkIntToScalar(20)); 115 fDrawable = SkNEW_ARGS(MyDrawable, (fRect)); 116 } 117 118 virtual ~ArcsView() SK_OVERRIDE { 119 fDrawable->unref(); 120 } 121 122protected: 123 // overrides from SkEventSink 124 virtual bool onQuery(SkEvent* evt) { 125 if (SampleCode::TitleQ(*evt)) { 126 SampleCode::TitleR(evt, "Arcs"); 127 return true; 128 } 129 return this->INHERITED::onQuery(evt); 130 } 131 132 static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 133 canvas->drawRect(r, p); 134 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); 135 canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); 136 canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); 137 canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); 138 } 139 140 static void draw_label(SkCanvas* canvas, const SkRect& rect, 141 int start, int sweep) { 142 SkPaint paint; 143 144 paint.setAntiAlias(true); 145 paint.setTextAlign(SkPaint::kCenter_Align); 146 147 SkString str; 148 149 str.appendS32(start); 150 str.append(", "); 151 str.appendS32(sweep); 152 canvas->drawText(str.c_str(), str.size(), rect.centerX(), 153 rect.fBottom + paint.getTextSize() * 5/4, paint); 154 } 155 156 static void drawArcs(SkCanvas* canvas) { 157 SkPaint paint; 158 SkRect r; 159 SkScalar w = SkIntToScalar(75); 160 SkScalar h = SkIntToScalar(50); 161 162 r.set(0, 0, w, h); 163 paint.setAntiAlias(true); 164 paint.setStyle(SkPaint::kStroke_Style); 165 166 canvas->save(); 167 canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); 168 169 paint.setStrokeWidth(SkIntToScalar(1)); 170 171 static const int gAngles[] = { 172 0, 360, 173 0, 45, 174 0, -45, 175 720, 135, 176 -90, 269, 177 -90, 270, 178 -90, 271, 179 -180, -270, 180 225, 90 181 }; 182 183 for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) { 184 paint.setColor(SK_ColorBLACK); 185 drawRectWithLines(canvas, r, paint); 186 187 paint.setColor(SK_ColorRED); 188 canvas->drawArc(r, SkIntToScalar(gAngles[i]), 189 SkIntToScalar(gAngles[i+1]), false, paint); 190 191 draw_label(canvas, r, gAngles[i], gAngles[i+1]); 192 193 canvas->translate(w * 8 / 7, 0); 194 } 195 196 canvas->restore(); 197 } 198 199 virtual void onDrawContent(SkCanvas* canvas) { 200 if (true) { test_pictbounds(canvas); return; } 201 202 fDrawable->setSweep(SampleCode::GetAnimScalar(SkIntToScalar(360)/24, 203 SkIntToScalar(360))); 204 205 SkPaint paint; 206 paint.setAntiAlias(true); 207 paint.setStrokeWidth(SkIntToScalar(2)); 208 paint.setStyle(SkPaint::kStroke_Style); 209 210 drawRectWithLines(canvas, fRect, paint); 211 212 canvas->EXPERIMENTAL_drawDrawable(fDrawable); 213 214 drawArcs(canvas); 215 this->inval(NULL); 216 } 217 218 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, 219 unsigned modi) { 220 // fSweep += SK_Scalar1; 221 this->inval(NULL); 222 return this->INHERITED::onFindClickHandler(x, y, modi); 223 } 224 225 virtual bool onClick(Click* click) { 226 return this->INHERITED::onClick(click); 227 } 228 229private: 230 SkScalar fSweep; 231 232 typedef SampleView INHERITED; 233}; 234 235////////////////////////////////////////////////////////////////////////////// 236 237static SkView* MyFactory() { return new ArcsView; } 238static SkViewRegister reg(MyFactory); 239