1b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org/* 2b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * Copyright 2012 Google Inc. 3b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * 4b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 5b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * found in the LICENSE file. 6b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org */ 7b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 8b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SampleCode.h" 9b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkView.h" 10b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkCanvas.h" 11b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkRandom.h" 1261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkRRect.h" 1361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkColorPriv.h" 14b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 15b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic void rotateAbout(SkCanvas* canvas, SkScalar degrees, 16b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkScalar cx, SkScalar cy) { 17b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->translate(cx, cy); 18b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->rotate(degrees); 19b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->translate(-cx, -cy); 20b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org} 21b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 22b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgclass RotateCirclesView : public SampleView { 23b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgpublic: 24b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org RotateCirclesView() { 25b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org this->setBGColor(SK_ColorLTGRAY); 2615ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com 27b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org fAngle = 0; 28b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org } 29b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 30b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgprotected: 31b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org // overrides from SkEventSink 32b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org virtual bool onQuery(SkEvent* evt) { 33b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org if (SampleCode::TitleQ(*evt)) { 34b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SampleCode::TitleR(evt, "RotateCircles"); 35b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org return true; 36b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org } 37b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org return this->INHERITED::onQuery(evt); 38b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org } 39b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 40b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org virtual void onDrawContent(SkCanvas* canvas) { 41e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 42b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkPaint paint; 43b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setAntiAlias(true); 44b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setStrokeWidth(20); 45b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 46b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkScalar cx = 240; 47b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkScalar cy = 240; 48b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkScalar DX = 240 * 2; 49b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org SkColor color = 0; 50b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 51b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org float scale = 1; 52b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org float sign = 0.3f; 53b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org for (SkScalar rad = 200; rad >= 20; rad -= 15) { 54b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org sign = -sign; 55b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org scale += 0.2f; 56b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 57b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setColor(rand.nextU()); 58b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setAlpha(0xFF); 59b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org color = ~color; 6015ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com 61b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setStyle(SkPaint::kFill_Style); 62b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 63b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->save(); 64b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org rotateAbout(canvas, fAngle * scale * sign, cx, cy); 65b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->drawCircle(cx, cy, rad, paint); 66b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->restore(); 67b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 68b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setStyle(SkPaint::kStroke_Style); 69b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org paint.setStrokeWidth(rad*2); 702157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 71b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->save(); 72b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org rotateAbout(canvas, fAngle * scale * sign, cx + DX, cy); 73b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->drawCircle(cx + DX, cy, 10, paint); 74b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org canvas->restore(); 7515ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com 7661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->save(); 7761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org rotateAbout(canvas, fAngle * scale * sign, cx + DX, cy + DX); 7861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawCircle(cx + DX, cy + DX, 10, paint); 7961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->restore(); 802157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 81b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org } 8215ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com 83b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org fAngle = (fAngle + 1) % 360; 84b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org this->inval(NULL); 85b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org } 86b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 87b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgprivate: 88b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org int fAngle; 89b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org typedef SkView INHERITED; 90b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org}; 91b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org 9261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgclass TestCirclesView : public SampleView { 9361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgpublic: 9461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org TestCirclesView() { 9561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 962157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 9761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprotected: 9861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 9961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (SampleCode::TitleQ(*evt)) { 10061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SampleCode::TitleR(evt, "RotateCircles2"); 10161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return true; 10261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 10361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return this->INHERITED::onQuery(evt); 10461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 10561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 10661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org void draw_real_circle(SkCanvas* canvas, SkScalar radius) { 10761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int w = SkScalarCeilToInt(radius * 2); 10861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int h = w; 1092157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 11061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkBitmap bm; 111a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocN32Pixels(w, h); 11261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org bm.eraseColor(0); 1132157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 11461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkAutoLockPixels alp(bm); 11561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 11661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar cx = radius; 11761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar cy = radius; 11861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org for (int y = 0; y < h; y += 1) { 11961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org for (int x = 0; x < w; x += 1) { 12061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org float d = sqrtf((x - cx)*(x - cx) + (y - cy)*(y - cy)); 12161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (d <= radius) { 12261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org *bm.getAddr32(x, y) = SkPackARGB32(0xFF, 0, 0, 0); 12361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 12461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 12561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 1262157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 12761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawBitmap(bm, 0, 0, NULL); 12861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 12961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 13061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org virtual void onDrawContent(SkCanvas* canvas) { 13161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar radius = 256; 13261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->translate(10, 10); 13361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 13461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_real_circle(canvas, radius); 1352157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 13661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint paint; 13761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setAntiAlias(true); 13861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 13961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(0x80FF0000); 14061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawCircle(radius, radius, radius, paint); 14161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 14261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setStyle(SkPaint::kStroke_Style); 14361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setStrokeWidth(radius); 14461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(0x8000FF00); 14561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawCircle(radius, radius, radius/2, paint); 14661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 1472157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 14861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprivate: 14961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org typedef SkView INHERITED; 15061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org}; 15161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 15261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic bool hittest(const SkPoint& target, SkScalar x, SkScalar y) { 15361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org const SkScalar TOL = 7; 15461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return SkPoint::Distance(target, SkPoint::Make(x, y)) <= TOL; 15561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org} 15661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 15761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic int getOnCurvePoints(const SkPath& path, SkPoint storage[]) { 15861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPath::RawIter iter(path); 15961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPoint pts[4]; 16061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPath::Verb verb; 16161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 16261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int count = 0; 16361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 16461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org switch (verb) { 16561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org case SkPath::kMove_Verb: 16661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org case SkPath::kLine_Verb: 16761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org case SkPath::kQuad_Verb: 16861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org case SkPath::kCubic_Verb: 16961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org storage[count++] = pts[0]; 17061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org break; 17161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org default: 17261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org break; 17361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 17461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 17561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return count; 17661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org} 17761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 17861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkPathMeasure.h" 17961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 18061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgclass TestStrokeView : public SampleView { 18161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org enum { 18261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SKELETON_COLOR = 0xFF0000FF, 18361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org WIREFRAME_COLOR = 0x80FF0000 18461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org }; 18561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 18661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org enum { 18761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org kCount = 9 18861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org }; 18961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPoint fPts[kCount]; 19061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar fWidth, fDWidth; 19161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgpublic: 19261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org TestStrokeView() { 19361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org this->setBGColor(SK_ColorLTGRAY); 19461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 19561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[0].set(50, 200); 19661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[1].set(50, 100); 19761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[2].set(150, 50); 19861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[3].set(300, 50); 1992157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 20061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[4].set(350, 200); 20161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[5].set(350, 100); 20261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[6].set(450, 50); 2032157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 20461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[7].set(200, 200); 20561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fPts[8].set(400, 400); 2062157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 20761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fWidth = 50; 20861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fDWidth = 0.25f; 20961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 2102157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 21161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprotected: 21261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 21361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (SampleCode::TitleQ(*evt)) { 21461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SampleCode::TitleR(evt, "RotateCircles3"); 21561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return true; 21661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 21761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return this->INHERITED::onQuery(evt); 21861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 21961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 22061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org void draw_points(SkCanvas* canvas, const SkPath& path, SkColor color, 22161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org bool show_lines) { 22261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint paint; 22361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(color); 22461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setAlpha(0x80); 2252157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 22661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int n = path.countPoints(); 22761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkAutoSTArray<32, SkPoint> pts(n); 22861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (show_lines) { 22961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.getPoints(pts.get(), n); 23061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawPoints(SkCanvas::kPolygon_PointMode, n, pts.get(), paint); 23161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } else { 23261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org n = getOnCurvePoints(path, pts.get()); 23361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 23461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setStrokeWidth(5); 23561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts.get(), paint); 23661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 23761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 23861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org void draw_ribs(SkCanvas* canvas, const SkPath& path, SkScalar width, 23961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkColor color) { 24061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org const SkScalar radius = width / 2; 24161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 24261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPathMeasure meas(path, false); 24361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar total = meas.getLength(); 2442157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 24561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar delta = 8; 24661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint paint; 24761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(color); 24861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 24961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPoint pos, tan; 25061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org for (SkScalar dist = 0; dist <= total; dist += delta) { 251140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com if (meas.getPosTan(dist, &pos, &tan)) { 252140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com tan.scale(radius); 253140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com tan.rotateCCW(); 254140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com canvas->drawLine(pos.x() + tan.x(), pos.y() + tan.y(), 255140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com pos.x() - tan.x(), pos.y() - tan.y(), paint); 256140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com } 25761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 25861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 25961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 26061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org void draw_stroke(SkCanvas* canvas, const SkPath& path, SkScalar width) { 26161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint paint; 26261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setAntiAlias(true); 26361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setStyle(SkPaint::kStroke_Style); 26461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 26561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(SKELETON_COLOR); 26661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawPath(path, paint); 26761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_points(canvas, path, SKELETON_COLOR, true); 26861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 26961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_ribs(canvas, path, width, 0xFF00FF00); 27061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 27161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPath fill; 27261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 27361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint p; 27461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org p.setStyle(SkPaint::kStroke_Style); 27561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org p.setStrokeWidth(width); 27661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org p.getFillPath(path, &fill); 27761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 27861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(WIREFRAME_COLOR); 27961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawPath(fill, paint); 28061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_points(canvas, fill, WIREFRAME_COLOR, false); 28161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 28261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 28361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org virtual void onDrawContent(SkCanvas* canvas) { 28461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPath path; 28561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar width = fWidth; 2862157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 28761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.moveTo(fPts[0]); 28861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.cubicTo(fPts[1], fPts[2], fPts[3]); 28961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_stroke(canvas, path, width); 29061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 29161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.reset(); 29261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.moveTo(fPts[4]); 29361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.quadTo(fPts[5], fPts[6]); 29461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_stroke(canvas, path, width); 29561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 29661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkScalar rad = 32; 29761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkRect r; 29861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org r.set(&fPts[7], 2); 29961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.reset(); 30061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkRRect rr; 30161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org rr.setRectXY(r, rad, rad); 30261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.addRRect(rr); 30361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org draw_stroke(canvas, path, width); 3042157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 30561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.reset(); 30661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkRRect rr2; 30761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org rr.inset(width/2, width/2, &rr2); 30861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.addRRect(rr2, SkPath::kCCW_Direction); 30961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org rr.inset(-width/2, -width/2, &rr2); 31061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org path.addRRect(rr2, SkPath::kCW_Direction); 31161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org SkPaint paint; 31261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setAntiAlias(true); 31361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org paint.setColor(0x40FF8844); 31461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org canvas->drawPath(path, paint); 3152157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 31661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fWidth += fDWidth; 31761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (fDWidth > 0 && fWidth > 100) { 31861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fDWidth = -fDWidth; 31961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } else if (fDWidth < 0 && fWidth < 10) { 32061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org fDWidth = -fDWidth; 32161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 32261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org this->inval(NULL); 32361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 32461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 32561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org class MyClick : public Click { 32661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org public: 32761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int fIndex; 32861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org MyClick(SkView* target, int index) : Click(target), fIndex(index) {} 32961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org }; 33061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 3314d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, 3324d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com unsigned modi) SK_OVERRIDE { 33361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org for (size_t i = 0; i < SK_ARRAY_COUNT(fPts); ++i) { 33461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org if (hittest(fPts[i], x, y)) { 3357fa2a65c0cfc714364490cb715171461143024e0reed@google.com return new MyClick(this, (int)i); 33661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 33761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 3384d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com return this->INHERITED::onFindClickHandler(x, y, modi); 33961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 3402157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com 34161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org virtual bool onClick(Click* click) { 34261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org int index = ((MyClick*)click)->fIndex; 3439c81bd5540119b61756239a540216b108c11b6c5jvanverth@google.com fPts[index].offset(SkIntToScalar(click->fICurr.fX - click->fIPrev.fX), 3449c81bd5540119b61756239a540216b108c11b6c5jvanverth@google.com SkIntToScalar(click->fICurr.fY - click->fIPrev.fY)); 34561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org this->inval(NULL); 34661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org return true; 34761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org } 34861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 34961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprivate: 35061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org typedef SkView INHERITED; 35161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org}; 35261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 35361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 35461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org 355b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic SkView* F0() { return new RotateCirclesView; } 356b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic SkViewRegister gR0(F0); 35761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkView* F1() { return new TestCirclesView; } 35861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkViewRegister gR1(F1); 35961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkView* F2() { return new TestStrokeView; } 36061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkViewRegister gR2(F2); 361