convexpaths.cpp revision 495e210eb1b66d8a8fc3f46ca1def3c78c724a38
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 "gm.h" 9#include "SkRandom.h" 10#include "SkTArray.h" 11 12namespace skiagm { 13 14class ConvexPathsGM : public GM { 15public: 16 ConvexPathsGM() { 17 this->setBGColor(0xFFFFFFFF); 18 this->makePaths(); 19 } 20 21protected: 22 virtual SkString onShortName() { 23 return SkString("convexpaths"); 24 } 25 26 27 virtual SkISize onISize() { 28 return make_isize(1200, 900); 29 } 30 31 void makePaths() { 32 fPaths.push_back().addRect(0, 0, 33 100 * SK_Scalar1, 100 * SK_Scalar1, 34 SkPath::kCW_Direction); 35 36 fPaths.push_back().addRect(0, 0, 37 100 * SK_Scalar1, 100 * SK_Scalar1, 38 SkPath::kCCW_Direction); 39 40 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1, 41 50 * SK_Scalar1, SkPath::kCW_Direction); 42 43 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1, 44 40 * SK_Scalar1, SkPath::kCCW_Direction); 45 46 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 47 50 * SK_Scalar1, 48 100 * SK_Scalar1), 49 SkPath::kCW_Direction); 50 51 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 52 100 * SK_Scalar1, 53 50 * SK_Scalar1), 54 SkPath::kCCW_Direction); 55 56 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 57 100 * SK_Scalar1, 58 5 * SK_Scalar1), 59 SkPath::kCCW_Direction); 60 61 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 62 SK_Scalar1, 63 100 * SK_Scalar1), 64 SkPath::kCCW_Direction); 65 66 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0, 67 SK_Scalar1 * 100, 68 SK_Scalar1 * 100), 69 40 * SK_Scalar1, 20 * SK_Scalar1, 70 SkPath::kCW_Direction); 71 72 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0, 73 SK_Scalar1 * 100, 74 SK_Scalar1 * 100), 75 20 * SK_Scalar1, 40 * SK_Scalar1, 76 SkPath::kCCW_Direction); 77 78 // shallow diagonals 79 fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1); 80 fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1); 81 fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1); 82 83 /* 84 It turns out arcTos are not automatically marked as convex and they 85 may in fact be ever so slightly concave. 86 fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0, 87 50 * SK_Scalar1, 88 100 * SK_Scalar1), 89 25 * SK_Scalar1, 130 * SK_Scalar1, false); 90 */ 91 92 // cubics 93 fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1, 94 10 * SK_Scalar1, 90 * SK_Scalar1, 95 0 * SK_Scalar1, 100 * SK_Scalar1); 96 fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1, 97 20 * SK_Scalar1, 100 * SK_Scalar1, 98 0 * SK_Scalar1, 0 * SK_Scalar1); 99 100 // point degenerate 101 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 102 fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1); 103 104 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 105 fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 106 50 * SK_Scalar1, 50 * SK_Scalar1); 107 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 108 fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1, 109 50 * SK_Scalar1, 50 * SK_Scalar1, 110 50 * SK_Scalar1, 50 * SK_Scalar1); 111 112 // line degenerate 113 fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1); 114 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0); 115 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 116 50 * SK_Scalar1, 50 * SK_Scalar1); 117 fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 118 100 * SK_Scalar1, 100 * SK_Scalar1); 119 fPaths.push_back().cubicTo(0, 0, 120 0, 0, 121 100 * SK_Scalar1, 100 * SK_Scalar1); 122 } 123 124 virtual void onDraw(SkCanvas* canvas) { 125 126 SkPaint paint; 127 paint.setAntiAlias(true); 128 SkRandom rand; 129 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1); 130 for (int i = 0; i < fPaths.count(); ++i) { 131 canvas->save(); 132 // position the path, and make it at off-integer coords. 133 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4, 134 SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4); 135 SkColor color = rand.nextU(); 136 color |= 0xff000000; 137 paint.setColor(color); 138 SkASSERT(fPaths[i].isConvex()); 139 canvas->drawPath(fPaths[i], paint); 140 canvas->restore(); 141 } 142 } 143 144private: 145 typedef GM INHERITED; 146 SkTArray<SkPath> fPaths; 147}; 148 149////////////////////////////////////////////////////////////////////////////// 150 151static GM* MyFactory(void*) { return new ConvexPathsGM; } 152static GMRegistry reg(MyFactory); 153 154} 155 156