• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
EmptyPathGM()17     EmptyPathGM() {}
18 
19 protected:
onShortName()20     SkString onShortName() {
21         return SkString("emptypath");
22     }
23 
onISize()24     SkISize onISize() { return make_isize(600, 280); }
25 
drawEmpty(SkCanvas * canvas,SkColor color,const SkRect & clip,SkPaint::Style style,SkPath::FillType fill)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 
onDraw(SkCanvas * canvas)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         titlePaint.setLCDRenderText(true);
67         titlePaint.setTextSize(15 * SK_Scalar1);
68         const char title[] = "Empty Paths Drawn Into Rectangle Clips With "
69                              "Indicated Style and Fill";
70         canvas->drawText(title, strlen(title),
71                             20 * SK_Scalar1,
72                             20 * SK_Scalar1,
73                             titlePaint);
74 
75         SkRandom rand;
76         SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
77         int i = 0;
78         canvas->save();
79         canvas->translate(10 * SK_Scalar1, 0);
80         canvas->save();
81         for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
82             for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
83                 if (0 == i % 4) {
84                     canvas->restore();
85                     canvas->translate(0, rect.height() + 40 * SK_Scalar1);
86                     canvas->save();
87                 } else {
88                     canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
89                 }
90                 ++i;
91 
92 
93                 SkColor color = rand.nextU();
94                 color = 0xff000000| color; // force solid
95                 this->drawEmpty(canvas, color, rect,
96                                 gStyles[style].fStyle, gFills[fill].fFill);
97 
98                 SkPaint rectPaint;
99                 rectPaint.setColor(SK_ColorBLACK);
100                 rectPaint.setStyle(SkPaint::kStroke_Style);
101                 rectPaint.setStrokeWidth(-1);
102                 rectPaint.setAntiAlias(true);
103                 canvas->drawRect(rect, rectPaint);
104 
105                 SkPaint labelPaint;
106                 labelPaint.setColor(color);
107                 labelPaint.setAntiAlias(true);
108                 labelPaint.setLCDRenderText(true);
109                 labelPaint.setTextSize(12 * SK_Scalar1);
110                 canvas->drawText(gStyles[style].fName,
111                                  strlen(gStyles[style].fName),
112                                  0, rect.height() + 15 * SK_Scalar1,
113                                  labelPaint);
114                 canvas->drawText(gFills[fill].fName,
115                                  strlen(gFills[fill].fName),
116                                  0, rect.height() + 28 * SK_Scalar1,
117                                  labelPaint);
118             }
119         }
120         canvas->restore();
121         canvas->restore();
122     }
123 
124 private:
125     typedef GM INHERITED;
126 };
127 
128 //////////////////////////////////////////////////////////////////////////////
129 
MyFactory(void *)130 static GM* MyFactory(void*) { return new EmptyPathGM; }
131 static GMRegistry reg(MyFactory);
132 
133 }
134