| epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 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 | */ | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 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" | 
| reed@android.com | 64ad966 | 2008-12-19 19:15:15 +0000 | [diff] [blame] | 16 | #include "SkComposeShader.h" | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 17 | #include "Sk1DPathEffect.h" | 
|  | 18 | #include "SkCornerPathEffect.h" | 
|  | 19 | #include "SkPathMeasure.h" | 
|  | 20 | #include "SkRandom.h" | 
|  | 21 | #include "SkColorPriv.h" | 
|  | 22 | #include "SkColorFilter.h" | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 23 | #include "SkLayerRasterizer.h" | 
|  | 24 |  | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 25 | #include "SkCanvasDrawable.h" | 
|  | 26 |  | 
| reed@android.com | bbff1d5 | 2009-06-05 16:21:03 +0000 | [diff] [blame] | 27 | #include "SkParsePath.h" | 
|  | 28 | static void testparse() { | 
|  | 29 | SkRect r; | 
| commit-bot@chromium.org | 4b413c8 | 2013-11-25 19:44:07 +0000 | [diff] [blame] | 30 | r.set(0, 0, 10, 10.5f); | 
| reed@android.com | bbff1d5 | 2009-06-05 16:21:03 +0000 | [diff] [blame] | 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 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 40 | class ArcsView : public SampleView { | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 41 | class MyDrawable : public SkCanvasDrawable { | 
|  | 42 | SkRect   fR; | 
|  | 43 | SkScalar fSweep; | 
|  | 44 | public: | 
|  | 45 | MyDrawable(const SkRect& r) : fR(r), fSweep(0) { | 
|  | 46 | } | 
|  | 47 |  | 
|  | 48 | void setSweep(SkScalar sweep) { | 
|  | 49 | if (fSweep != sweep) { | 
|  | 50 | fSweep = sweep; | 
|  | 51 | this->notifyDrawingChanged(); | 
|  | 52 | } | 
|  | 53 | } | 
|  | 54 |  | 
|  | 55 | void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 
|  | 56 | SkPaint paint; | 
|  | 57 | paint.setAntiAlias(true); | 
|  | 58 | paint.setStrokeWidth(SkIntToScalar(2)); | 
|  | 59 |  | 
|  | 60 | paint.setStyle(SkPaint::kFill_Style); | 
|  | 61 | paint.setColor(0x800000FF); | 
|  | 62 | canvas->drawArc(fR, 0, fSweep, true, paint); | 
|  | 63 |  | 
|  | 64 | paint.setColor(0x800FF000); | 
|  | 65 | canvas->drawArc(fR, 0, fSweep, false, paint); | 
|  | 66 |  | 
|  | 67 | paint.setStyle(SkPaint::kStroke_Style); | 
|  | 68 | paint.setColor(SK_ColorRED); | 
|  | 69 | canvas->drawArc(fR, 0, fSweep, true, paint); | 
|  | 70 |  | 
|  | 71 | paint.setStrokeWidth(0); | 
|  | 72 | paint.setColor(SK_ColorBLUE); | 
|  | 73 | canvas->drawArc(fR, 0, fSweep, false, paint); | 
|  | 74 | } | 
| reed | 6be2aa9 | 2014-11-18 11:08:05 -0800 | [diff] [blame^] | 75 |  | 
|  | 76 | SkRect onGetBounds() SK_OVERRIDE { | 
|  | 77 | SkRect r(fR); | 
|  | 78 | r.outset(2, 2); | 
|  | 79 | return r; | 
|  | 80 | } | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 81 | }; | 
|  | 82 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 83 | public: | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 84 | SkRect fRect; | 
|  | 85 | MyDrawable* fDrawable; | 
|  | 86 |  | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 87 | ArcsView() { | 
| reed@android.com | bbff1d5 | 2009-06-05 16:21:03 +0000 | [diff] [blame] | 88 | testparse(); | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 89 | fSweep = SkIntToScalar(100); | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 90 | this->setBGColor(0xFFDDDDDD); | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 91 |  | 
|  | 92 | fRect.set(0, 0, SkIntToScalar(200), SkIntToScalar(200)); | 
|  | 93 | fRect.offset(SkIntToScalar(20), SkIntToScalar(20)); | 
|  | 94 | fDrawable = SkNEW_ARGS(MyDrawable, (fRect)); | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | virtual ~ArcsView() SK_OVERRIDE { | 
|  | 98 | fDrawable->unref(); | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 99 | } | 
|  | 100 |  | 
|  | 101 | protected: | 
|  | 102 | // overrides from SkEventSink | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 103 | virtual bool onQuery(SkEvent* evt) { | 
|  | 104 | if (SampleCode::TitleQ(*evt)) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 105 | SampleCode::TitleR(evt, "Arcs"); | 
|  | 106 | return true; | 
|  | 107 | } | 
|  | 108 | return this->INHERITED::onQuery(evt); | 
|  | 109 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 110 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 111 | static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 112 | canvas->drawRect(r, p); | 
|  | 113 | canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p); | 
|  | 114 | canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p); | 
|  | 115 | canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p); | 
|  | 116 | canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p); | 
|  | 117 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 118 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 119 | static void draw_label(SkCanvas* canvas, const SkRect& rect, | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 120 | int start, int sweep) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 121 | SkPaint paint; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 122 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 123 | paint.setAntiAlias(true); | 
|  | 124 | paint.setTextAlign(SkPaint::kCenter_Align); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 125 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 126 | SkString    str; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 127 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 128 | str.appendS32(start); | 
|  | 129 | str.append(", "); | 
|  | 130 | str.appendS32(sweep); | 
|  | 131 | canvas->drawText(str.c_str(), str.size(), rect.centerX(), | 
|  | 132 | rect.fBottom + paint.getTextSize() * 5/4, paint); | 
|  | 133 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 134 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 135 | static void drawArcs(SkCanvas* canvas) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 136 | SkPaint paint; | 
|  | 137 | SkRect  r; | 
|  | 138 | SkScalar w = SkIntToScalar(75); | 
|  | 139 | SkScalar h = SkIntToScalar(50); | 
|  | 140 |  | 
|  | 141 | r.set(0, 0, w, h); | 
|  | 142 | paint.setAntiAlias(true); | 
|  | 143 | paint.setStyle(SkPaint::kStroke_Style); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 144 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 145 | canvas->save(); | 
|  | 146 | canvas->translate(SkIntToScalar(10), SkIntToScalar(300)); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 147 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 148 | paint.setStrokeWidth(SkIntToScalar(1)); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 149 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 150 | static const int gAngles[] = { | 
|  | 151 | 0, 360, | 
|  | 152 | 0, 45, | 
|  | 153 | 0, -45, | 
|  | 154 | 720, 135, | 
|  | 155 | -90, 269, | 
|  | 156 | -90, 270, | 
|  | 157 | -90, 271, | 
|  | 158 | -180, -270, | 
|  | 159 | 225, 90 | 
|  | 160 | }; | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 161 |  | 
| senorblanco@chromium.org | 64cc579 | 2011-05-19 19:58:58 +0000 | [diff] [blame] | 162 | for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 163 | paint.setColor(SK_ColorBLACK); | 
|  | 164 | drawRectWithLines(canvas, r, paint); | 
|  | 165 |  | 
|  | 166 | paint.setColor(SK_ColorRED); | 
|  | 167 | canvas->drawArc(r, SkIntToScalar(gAngles[i]), | 
|  | 168 | SkIntToScalar(gAngles[i+1]), false, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 169 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 170 | draw_label(canvas, r, gAngles[i], gAngles[i+1]); | 
|  | 171 |  | 
|  | 172 | canvas->translate(w * 8 / 7, 0); | 
|  | 173 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 174 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 175 | canvas->restore(); | 
|  | 176 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 177 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 178 | virtual void onDrawContent(SkCanvas* canvas) { | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 179 | fDrawable->setSweep(SampleCode::GetAnimScalar(SkIntToScalar(360)/24, | 
|  | 180 | SkIntToScalar(360))); | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 181 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 182 | SkPaint paint; | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 183 | paint.setAntiAlias(true); | 
|  | 184 | paint.setStrokeWidth(SkIntToScalar(2)); | 
|  | 185 | paint.setStyle(SkPaint::kStroke_Style); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 186 |  | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 187 | drawRectWithLines(canvas, fRect, paint); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 188 |  | 
| reed | 6a070dc | 2014-11-11 19:36:09 -0800 | [diff] [blame] | 189 | canvas->EXPERIMENTAL_drawDrawable(fDrawable); | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 190 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 191 | drawArcs(canvas); | 
|  | 192 | this->inval(NULL); | 
|  | 193 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 194 |  | 
| reed@google.com | 4d5c26d | 2013-01-08 16:17:50 +0000 | [diff] [blame] | 195 | virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, | 
|  | 196 | unsigned modi) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 197 | //   fSweep += SK_Scalar1; | 
|  | 198 | this->inval(NULL); | 
| reed@google.com | 4d5c26d | 2013-01-08 16:17:50 +0000 | [diff] [blame] | 199 | return this->INHERITED::onFindClickHandler(x, y, modi); | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 200 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 201 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 202 | virtual bool onClick(Click* click) { | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 203 | return this->INHERITED::onClick(click); | 
|  | 204 | } | 
| rmistry@google.com | ae933ce | 2012-08-23 18:19:56 +0000 | [diff] [blame] | 205 |  | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 206 | private: | 
|  | 207 | SkScalar fSweep; | 
|  | 208 |  | 
| reed@google.com | 961ddb0 | 2011-05-05 14:03:48 +0000 | [diff] [blame] | 209 | typedef SampleView INHERITED; | 
| reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 210 | }; | 
|  | 211 |  | 
|  | 212 | ////////////////////////////////////////////////////////////////////////////// | 
|  | 213 |  | 
|  | 214 | static SkView* MyFactory() { return new ArcsView; } | 
|  | 215 | static SkViewRegister reg(MyFactory); |