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