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