1aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 2aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com/* 3aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * Copyright 2011 Google Inc. 4aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * 5aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 6aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * found in the LICENSE file. 7aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com */ 8aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SampleCode.h" 9aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkView.h" 10aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkCanvas.h" 11aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkPath.h" 12aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkRandom.h" 13aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 14aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comclass HairCurvesView : public SampleView { 15aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.compublic: 16aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com HairCurvesView() { 17aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 18ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 19aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comprotected: 20aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com // overrides from SkEventSink 21aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com virtual bool onQuery(SkEvent* evt) { 22aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (SampleCode::TitleQ(*evt)) { 23aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SampleCode::TitleR(evt, "HairCurves"); 24aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com return true; 25aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 26aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com return this->INHERITED::onQuery(evt); 27aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 28aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 29aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 30aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com virtual void onDrawContent(SkCanvas* canvas) { 31aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkPaint paint; 32aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setAntiAlias(true); 33aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setStyle(SkPaint::kStroke_Style); 34a308883003e36cbff4d1c4c2d2e7fceb3eea95b1egdaniel@google.com paint.setStrokeWidth(0); 35aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com canvas->save(); 36aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com canvas->scale(1000 * SK_Scalar1, 1000 * SK_Scalar1); 37e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 38e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom randW; 39aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkPath curves; 40aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkPath hulls; 41aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkPath ctrlPts; 42aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com for (int i = 0; i < 100; ++i) { 43aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkScalar pts[] = { 44aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 45aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 46aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 47aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1() 48aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com }; 49aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.moveTo(pts[0], pts[1]); 50aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.cubicTo(pts[2], pts[3], 51aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com pts[4], pts[5], 52aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com pts[6], pts[7]); 53aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 54aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.moveTo(pts[0], pts[1]); 55aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.lineTo(pts[2], pts[3]); 56aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.lineTo(pts[4], pts[5]); 57aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.lineTo(pts[6], pts[7]); 58aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 59aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200); 60aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200); 61aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200); 62aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[6], pts[7], SK_Scalar1 / 200); 63aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 64aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com for (int i = 0; i < 100; ++i) { 65aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkScalar pts[] = { 66aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 67aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 68aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 69aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com }; 70aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.moveTo(pts[0], pts[1]); 71aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.quadTo(pts[2], pts[3], 72aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com pts[4], pts[5]); 73aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 74aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.moveTo(pts[0], pts[1]); 75aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.lineTo(pts[2], pts[3]); 76aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com hulls.lineTo(pts[4], pts[5]); 77aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 78aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200); 79aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200); 80aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200); 813f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com } 823f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com for (int i = 0; i < 100; ++i) { 833f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com SkScalar pts[] = { 843f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com rand.nextUScalar1(), rand.nextUScalar1(), 853f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com rand.nextUScalar1(), rand.nextUScalar1(), 863f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com rand.nextUScalar1(), rand.nextUScalar1(), 873f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com }; 883f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com SkScalar weight = randW.nextUScalar1() * 2.0f; 893f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 903f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com curves.moveTo(pts[0], pts[1]); 913f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com curves.conicTo(pts[2], pts[3], 923f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com pts[4], pts[5], 933f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com weight); 943f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 953f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com hulls.moveTo(pts[0], pts[1]); 963f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com hulls.lineTo(pts[2], pts[3]); 973f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com hulls.lineTo(pts[4], pts[5]); 983f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 993f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200); 1003f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200); 1013f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200); 102aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 103aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com for (int i = 0; i < 100; ++i) { 104aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com SkScalar pts[] = { 105aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 106aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com rand.nextUScalar1(), rand.nextUScalar1(), 107aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com }; 108aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.moveTo(pts[0], pts[1]); 109aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com curves.lineTo(pts[2], pts[3]); 110aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 111aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200); 112aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200); 113aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 114aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 115aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setColor(SK_ColorBLACK); 116aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com canvas->drawPath(curves, paint); 117aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setColor(SK_ColorRED); 118aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com //canvas->drawPath(hulls, paint); 119aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setStyle(SkPaint::kFill_Style); 120aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com paint.setColor(SK_ColorBLUE); 121aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com //canvas->drawPath(ctrlPts, paint); 122aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 123aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com canvas->restore(); 124aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 125aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 126aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comprivate: 127aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com typedef SampleView INHERITED; 128aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com}; 129aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 130aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 131aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 132aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comstatic SkView* MyFactory() { return new HairCurvesView; } 133aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comstatic SkViewRegister reg(MyFactory); 134