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 "SkCanvas.h" 10 #include "SkPaint.h" 11 #include "SkRandom.h" 12 13 namespace skiagm { 14 15 class EmptyPathGM : public GM { 16 public: 17 EmptyPathGM() {} 18 19 protected: 20 SkString onShortName() { 21 return SkString("emptypath"); 22 } 23 24 SkISize onISize() { return SkISize::Make(600, 280); } 25 26 void drawEmpty(SkCanvas* canvas, 27 SkColor color, 28 const SkRect& clip, 29 SkPaint::Style style, 30 SkPath::FillType fill) { 31 SkPath path; 32 path.setFillType(fill); 33 SkPaint paint; 34 paint.setColor(color); 35 paint.setStyle(style); 36 canvas->save(); 37 canvas->clipRect(clip); 38 canvas->drawPath(path, paint); 39 canvas->restore(); 40 } 41 42 virtual void onDraw(SkCanvas* canvas) { 43 struct FillAndName { 44 SkPath::FillType fFill; 45 const char* fName; 46 }; 47 static const FillAndName gFills[] = { 48 {SkPath::kWinding_FillType, "Winding"}, 49 {SkPath::kEvenOdd_FillType, "Even / Odd"}, 50 {SkPath::kInverseWinding_FillType, "Inverse Winding"}, 51 {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}, 52 }; 53 struct StyleAndName { 54 SkPaint::Style fStyle; 55 const char* fName; 56 }; 57 static const StyleAndName gStyles[] = { 58 {SkPaint::kFill_Style, "Fill"}, 59 {SkPaint::kStroke_Style, "Stroke"}, 60 {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 61 }; 62 63 SkPaint titlePaint; 64 titlePaint.setColor(SK_ColorBLACK); 65 titlePaint.setAntiAlias(true); 66 sk_tool_utils::set_portable_typeface(&titlePaint); 67 titlePaint.setLCDRenderText(true); 68 titlePaint.setTextSize(15 * SK_Scalar1); 69 const char title[] = "Empty Paths Drawn Into Rectangle Clips With " 70 "Indicated Style and Fill"; 71 canvas->drawText(title, strlen(title), 72 20 * SK_Scalar1, 73 20 * SK_Scalar1, 74 titlePaint); 75 76 SkLCGRandom rand; 77 SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 78 int i = 0; 79 canvas->save(); 80 canvas->translate(10 * SK_Scalar1, 0); 81 canvas->save(); 82 for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 83 for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 84 if (0 == i % 4) { 85 canvas->restore(); 86 canvas->translate(0, rect.height() + 40 * SK_Scalar1); 87 canvas->save(); 88 } else { 89 canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 90 } 91 ++i; 92 93 94 SkColor color = rand.nextU(); 95 color = 0xff000000| color; // force solid 96 this->drawEmpty(canvas, color, rect, 97 gStyles[style].fStyle, gFills[fill].fFill); 98 99 SkPaint rectPaint; 100 rectPaint.setColor(SK_ColorBLACK); 101 rectPaint.setStyle(SkPaint::kStroke_Style); 102 rectPaint.setStrokeWidth(-1); 103 rectPaint.setAntiAlias(true); 104 canvas->drawRect(rect, rectPaint); 105 106 SkPaint labelPaint; 107 labelPaint.setColor(color); 108 labelPaint.setAntiAlias(true); 109 sk_tool_utils::set_portable_typeface(&labelPaint); 110 labelPaint.setLCDRenderText(true); 111 labelPaint.setTextSize(12 * SK_Scalar1); 112 canvas->drawText(gStyles[style].fName, 113 strlen(gStyles[style].fName), 114 0, rect.height() + 15 * SK_Scalar1, 115 labelPaint); 116 canvas->drawText(gFills[fill].fName, 117 strlen(gFills[fill].fName), 118 0, rect.height() + 28 * SK_Scalar1, 119 labelPaint); 120 } 121 } 122 canvas->restore(); 123 canvas->restore(); 124 } 125 126 private: 127 typedef GM INHERITED; 128 }; 129 130 ////////////////////////////////////////////////////////////////////////////// 131 132 static GM* MyFactory(void*) { return new EmptyPathGM; } 133 static GMRegistry reg(MyFactory); 134 135 } 136