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