1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SampleCode.h" 9ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkView.h" 10ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkCanvas.h" 11ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkGraphics.h" 12ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkRandom.h" 13ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkBlurDrawLooper.h" 14ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#include "SkGradientShader.h" 15ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 16ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comtypedef SkScalar (*MakePathProc)(SkPath*); 17ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 18ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_frame(SkPath* path) { 19ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkRect r = { 10, 10, 630, 470 }; 20ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->addRoundRect(r, 15, 15); 21ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 22ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkPaint paint; 23ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com paint.setStyle(SkPaint::kStroke_Style); 24ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com paint.setStrokeWidth(5); 25ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com paint.getFillPath(*path, path); 26ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return 15; 27ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 28ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 29ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_triangle(SkPath* path) { 30ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com static const int gCoord[] = { 31ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 10, 20, 15, 5, 30, 30 32ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com }; 33ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 34ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 35ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 36ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->close(); 37ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->offset(10, 0); 38ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return SkIntToScalar(30); 39ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 40ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 41ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_rect(SkPath* path) { 42ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkRect r = { 10, 10, 30, 30 }; 43ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->addRect(r); 44ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->offset(10, 0); 45ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return SkIntToScalar(30); 46ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 47ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 48ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_oval(SkPath* path) { 49ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkRect r = { 10, 10, 30, 30 }; 50ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->addOval(r); 51ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->offset(10, 0); 52ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return SkIntToScalar(30); 53ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 54ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 55ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_sawtooth(SkPath* path) { 56ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkScalar x = SkIntToScalar(20); 57ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkScalar y = SkIntToScalar(20); 58ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar x0 = x; 59ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar dx = SK_Scalar1 * 5; 60ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar dy = SK_Scalar1 * 10; 61ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 62ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->moveTo(x, y); 63ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com for (int i = 0; i < 32; i++) { 64ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com x += dx; 65ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(x, y - dy); 66ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com x += dx; 67ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(x, y + dy); 68ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 69ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(x, y + 2 * dy); 70ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(x0, y + 2 * dy); 71ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->close(); 72ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return SkIntToScalar(30); 73ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 74ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 75ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_star(SkPath* path, int n) { 76ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar c = SkIntToScalar(45); 77ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar r = SkIntToScalar(20); 78ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 79ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkScalar rad = -SK_ScalarPI / 2; 80ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 81ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 82ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->moveTo(c, c - r); 83ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com for (int i = 1; i < n; i++) { 84ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com rad += drad; 85ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 86ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r)); 87ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 88ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com path->close(); 89ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return r * 2 * 6 / 5; 90ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com} 91ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 92ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } 93ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } 94ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 95ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic const MakePathProc gProcs[] = { 96ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_frame, 97ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_triangle, 98ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_rect, 99ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_oval, 100ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_sawtooth, 101ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_star_5, 102ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com make_star_13 103ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com}; 104ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 105ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com#define N SK_ARRAY_COUNT(gProcs) 106ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 10703c2ef5473cdffc9ec4ab52b106b3bdebab49de6reed@google.comclass PathFillView : public SampleView { 108ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkPath fPath[N]; 109ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkScalar fDY[N]; 110ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 111ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.compublic: 112ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com PathFillView() { 113ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com for (size_t i = 0; i < N; i++) { 114ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com fDY[i] = gProcs[i](&fPath[i]); 115ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 11603c2ef5473cdffc9ec4ab52b106b3bdebab49de6reed@google.com this->setBGColor(0xFFDDDDDD); 117ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 118ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 119ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comprotected: 120ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com // overrides from SkEventSink 121ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com virtual bool onQuery(SkEvent* evt) { 122ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com if (SampleCode::TitleQ(*evt)) { 123ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SampleCode::TitleR(evt, "PathFill"); 124ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return true; 125ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 126ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com return this->INHERITED::onQuery(evt); 127ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 128ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 12903c2ef5473cdffc9ec4ab52b106b3bdebab49de6reed@google.com virtual void onDrawContent(SkCanvas* canvas) { 130ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com SkPaint paint; 131ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com paint.setAntiAlias(true); 132ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 133ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com for (size_t i = 0; i < N; i++) { 134ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com canvas->drawPath(fPath[i], paint); 135ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com canvas->translate(0, fDY[i]); 136ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 137ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com } 138ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 139ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comprivate: 14003c2ef5473cdffc9ec4ab52b106b3bdebab49de6reed@google.com typedef SampleView INHERITED; 141ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com}; 142ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 143ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com////////////////////////////////////////////////////////////////////////////// 144ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.com 145ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkView* MyFactory() { return new PathFillView; } 146ad89fbd3535cbbb528488c7a5ce98f88c57d2de3reed@google.comstatic SkViewRegister reg(MyFactory); 147