blob: 9b1e3e04994bffd5958219600c9c16160aa8c78b [file] [log] [blame]
jvanverth@google.comdcd36f32013-09-17 19:52:05 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#include "SampleCode.h"
8
9#include "SkCanvas.h"
bungemand3ebb482015-08-05 13:57:49 -070010#include "SkPath.h"
jvanverth@google.comdcd36f32013-09-17 19:52:05 +000011#include "SkRandom.h"
12#include "SkRRect.h"
13#include "SkTime.h"
14
15// Implementation in C++ of Mozilla Canvas2D benchmark Canvas Clock Test
16// See https://code.google.com/p/skia/issues/detail?id=1626
17
18#define USE_PATH 1
19
20class ClockView : public SampleView {
21public:
22 ClockView() {}
23
24protected:
25 // overrides from SkEventSink
mtklein36352bf2015-03-25 18:17:31 -070026 bool onQuery(SkEvent* evt) override {
jvanverth@google.comdcd36f32013-09-17 19:52:05 +000027 if (SampleCode::TitleQ(*evt)) {
28 SampleCode::TitleR(evt, "Clock");
29 return true;
30 }
31 return this->INHERITED::onQuery(evt);
32 }
33
mtklein36352bf2015-03-25 18:17:31 -070034 void onDrawContent(SkCanvas* canvas) override {
jvanverth@google.comdcd36f32013-09-17 19:52:05 +000035 SkPaint paintFill;
36 SkPaint paintStroke;
37 SkPath path;
38
39 canvas->save();
40 canvas->translate(150, 150);
41 canvas->scale(0.4f, 0.4f);
42 canvas->rotate(-180.f/2.f);
43
44 paintFill.setAntiAlias(true);
45 paintFill.setColor(SK_ColorBLACK);
46 paintStroke.setAntiAlias(true);
47 paintStroke.setStyle(SkPaint::kStroke_Style);
48 paintStroke.setColor(SK_ColorBLACK);
49 paintStroke.setStrokeWidth(8);
50 paintStroke.setStrokeCap(SkPaint::kRound_Cap);
51
52 // Hour marks
53 SkRect rect;
54#ifndef USE_PATH
55 rect = SkRect::MakeLTRB(200-4, -4, 240+4, 4);
56 SkRRect rrect;
57 SkVector radii[4] = {{4,4}, {4,4}, {4,4}, {4,4}};
58 rrect.setRectRadii(rect, radii);
59#endif
60 canvas->save();
61 for (int i=0;i<12;i++){
62 canvas->rotate(180.f/6.f);
63#ifdef USE_PATH
64 path.reset();
65 path.moveTo(200,0);
66 path.lineTo(240,0);
67 canvas->drawPath(path, paintStroke);
68#else
69 canvas->drawRRect(rrect, paintFill);
70#endif
71 }
72 canvas->restore();
73
74 // Minute marks
75 canvas->save();
76#ifdef USE_PATH
77 paintStroke.setStrokeWidth(5);
78#else
79 rect = SkRect::MakeLTRB(231.5f, -2.5f, 242.5, 2.5f);
80 radii[0] = SkPoint::Make(2.5f,2.5f);
81 radii[1] = SkPoint::Make(2.5f,2.5f);
82 radii[2] = SkPoint::Make(2.5f,2.5f);
83 radii[3] = SkPoint::Make(2.5f,2.5f);
84 rrect.setRectRadii(rect, radii);
85#endif
86 for (int i=0;i<60;i++){
87 if (i%5 == 0) {
88 canvas->rotate(180.f/30.f);
89 continue;
90 }
91#ifdef USE_PATH
92 path.reset();
93 path.moveTo(234,0);
94 path.lineTo(240,0);
95 canvas->drawPath(path, paintStroke);
96#else
97 canvas->drawRRect(rrect, paintFill);
98#endif
99 canvas->rotate(180.f/30.f);
100 }
101 canvas->restore();
102
103 SkTime::DateTime time;
104 SkTime::GetDateTime(&time);
105 time.fHour = time.fHour >= 12 ? time.fHour-12 : time.fHour;
106 paintFill.setColor(SK_ColorBLACK);
107
108 // Write hours
109 canvas->save();
110 canvas->rotate(time.fHour*(180.f/6.f) + time.fMinute*(180.f/360.f)
111 + time.fSecond*(180.f/21600.f) );
112#ifdef USE_PATH
113 paintStroke.setStrokeWidth(14);
114 path.reset();
115 path.moveTo(-20,0);
116 path.lineTo(80,0);
117 canvas->drawPath(path, paintStroke);
118#else
119 rect = SkRect::MakeLTRB(-20-7, -7, 80+7, 7);
120 radii[0] = SkPoint::Make(7,7);
121 radii[1] = SkPoint::Make(7,7);
122 radii[2] = SkPoint::Make(7,7);
123 radii[3] = SkPoint::Make(7,7);
124 rrect.setRectRadii(rect, radii);
125 canvas->drawRRect(rrect, paintFill);
126#endif
127 canvas->restore();
128
129 // Write minutes
130 canvas->save();
131 canvas->rotate(time.fMinute*(180.f/30.f)
132 + time.fSecond*(180.f/1800.f) );
133#ifdef USE_PATH
134 paintStroke.setStrokeWidth(10);
135 path.reset();
136 path.moveTo(-56,0);
137 path.lineTo(224,0);
138 canvas->drawPath(path, paintStroke);
139#else
140 rect = SkRect::MakeLTRB(-56-5, -5, 224+5, 5);
141 radii[0] = SkPoint::Make(5,5);
142 radii[1] = SkPoint::Make(5,5);
143 radii[2] = SkPoint::Make(5,5);
144 radii[3] = SkPoint::Make(5,5);
145 rrect.setRectRadii(rect, radii);
146 canvas->drawRRect(rrect, paintFill);
147#endif
148 canvas->restore();
149
150 // Write seconds
151 canvas->save();
152 canvas->rotate(time.fSecond*(180.f/30.f));
153 paintFill.setColor(0xffd40000);
154 paintStroke.setColor(0xffd40000);
155 paintStroke.setStrokeWidth(6);
156#ifdef USE_PATH
157 path.reset();
158 path.moveTo(-60,0);
159 path.lineTo(166,0);
160 canvas->drawPath(path, paintStroke);
161#else
162 rect = SkRect::MakeLTRB(-60-3, -3, 166+3, 3);
163 radii[0] = SkPoint::Make(3,3);
164 radii[1] = SkPoint::Make(3,3);
165 radii[2] = SkPoint::Make(3,3);
166 radii[3] = SkPoint::Make(3,3);
167 rrect.setRectRadii(rect, radii);
168 canvas->drawRRect(rrect, paintFill);
169#endif
170 rect = SkRect::MakeLTRB(-20, -20, 20, 20);
171#ifdef USE_PATH
172 path.reset();
173 path.arcTo(rect, 0, 0, false);
174 path.addOval(rect, SkPath::kCCW_Direction);
175 path.arcTo(rect, 360, 0, true);
176 canvas->drawPath(path, paintFill);
177#else
178 canvas->drawOval(rect, paintFill);
179#endif
180 rect = SkRect::MakeLTRB(-20+190, -20, 20+190, 20);
181#ifdef USE_PATH
182 path.reset();
183 path.arcTo(rect, 0, 0, false);
184 path.addOval(rect, SkPath::kCCW_Direction);
185 path.arcTo(rect, 360, 0, true);
186 canvas->drawPath(path, paintStroke);
187#else
188 canvas->drawOval(rect, paintStroke);
189#endif
190 paintFill.setColor(0xff505050);
191#ifdef USE_PATH
192 rect = SkRect::MakeLTRB(-6, -6, 6, 6);
193 path.arcTo(rect, 0, 0, false);
194 path.addOval(rect, SkPath::kCCW_Direction);
195 path.arcTo(rect, 360, 0, true);
196 canvas->drawPath(path, paintFill);
197#else
198 canvas->drawOval(rect, paintFill);
199 rect = SkRect::MakeLTRB(-6, -6, 6, 6);
200 canvas->drawOval(rect, paintFill);
201#endif
202 canvas->restore();
203
204 paintStroke.setStrokeWidth(18);
205 paintStroke.setColor(0xff325FA2);
206 rect = SkRect::MakeLTRB(-284, -284, 284, 284);
207#ifdef USE_PATH
208 path.reset();
209 path.arcTo(rect, 0, 0, false);
210 path.addOval(rect, SkPath::kCCW_Direction);
211 path.arcTo(rect, 360, 0, true);
212 canvas->drawPath(path, paintStroke);
213#else
214 canvas->drawOval(rect, paintStroke);
215#endif
216
217 canvas->restore();
218
219 this->inval(NULL);
220 }
221
222private:
223
224 typedef SampleView INHERITED;
225};
226
227//////////////////////////////////////////////////////////////////////////////
228
229static SkView* MyFactory() { return new ClockView; }
230static SkViewRegister reg(MyFactory);