diff options
author | jvanverth@google.com <jvanverth@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-17 19:52:05 +0000 |
---|---|---|
committer | jvanverth@google.com <jvanverth@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-17 19:52:05 +0000 |
commit | dcd36f3c9db6ff415834276d5f4b5fa1ced8ba25 (patch) | |
tree | 3308f79c4bbc5442d683adfb6230eabc892fa0e0 /samplecode | |
parent | b352627436da6fa27ea90ffcc58d6b51adfe82d7 (diff) |
Add Clock Sample.
There are two possible rendering methods: paths (default) or primitives.
At the moment the rrect primitive only supports axis-aligned rrects for
GPU acceleration, so that will not be a win on GPU.
R=reed@google.com
Review URL: https://codereview.chromium.org/23876008
git-svn-id: http://skia.googlecode.com/svn/trunk@11330 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode')
-rw-r--r-- | samplecode/SampleClock.cpp | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/samplecode/SampleClock.cpp b/samplecode/SampleClock.cpp new file mode 100644 index 0000000000..17ddc834af --- /dev/null +++ b/samplecode/SampleClock.cpp @@ -0,0 +1,229 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SampleCode.h" + +#include "SkCanvas.h" +#include "SkRandom.h" +#include "SkRRect.h" +#include "SkTime.h" + +// Implementation in C++ of Mozilla Canvas2D benchmark Canvas Clock Test +// See https://code.google.com/p/skia/issues/detail?id=1626 + +#define USE_PATH 1 + +class ClockView : public SampleView { +public: + ClockView() {} + +protected: + // overrides from SkEventSink + virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "Clock"); + return true; + } + return this->INHERITED::onQuery(evt); + } + + virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { + SkPaint paintFill; + SkPaint paintStroke; + SkPath path; + + canvas->save(); + canvas->translate(150, 150); + canvas->scale(0.4f, 0.4f); + canvas->rotate(-180.f/2.f); + + paintFill.setAntiAlias(true); + paintFill.setColor(SK_ColorBLACK); + paintStroke.setAntiAlias(true); + paintStroke.setStyle(SkPaint::kStroke_Style); + paintStroke.setColor(SK_ColorBLACK); + paintStroke.setStrokeWidth(8); + paintStroke.setStrokeCap(SkPaint::kRound_Cap); + + // Hour marks + SkRect rect; +#ifndef USE_PATH + rect = SkRect::MakeLTRB(200-4, -4, 240+4, 4); + SkRRect rrect; + SkVector radii[4] = {{4,4}, {4,4}, {4,4}, {4,4}}; + rrect.setRectRadii(rect, radii); +#endif + canvas->save(); + for (int i=0;i<12;i++){ + canvas->rotate(180.f/6.f); +#ifdef USE_PATH + path.reset(); + path.moveTo(200,0); + path.lineTo(240,0); + canvas->drawPath(path, paintStroke); +#else + canvas->drawRRect(rrect, paintFill); +#endif + } + canvas->restore(); + + // Minute marks + canvas->save(); +#ifdef USE_PATH + paintStroke.setStrokeWidth(5); +#else + rect = SkRect::MakeLTRB(231.5f, -2.5f, 242.5, 2.5f); + radii[0] = SkPoint::Make(2.5f,2.5f); + radii[1] = SkPoint::Make(2.5f,2.5f); + radii[2] = SkPoint::Make(2.5f,2.5f); + radii[3] = SkPoint::Make(2.5f,2.5f); + rrect.setRectRadii(rect, radii); +#endif + for (int i=0;i<60;i++){ + if (i%5 == 0) { + canvas->rotate(180.f/30.f); + continue; + } +#ifdef USE_PATH + path.reset(); + path.moveTo(234,0); + path.lineTo(240,0); + canvas->drawPath(path, paintStroke); +#else + canvas->drawRRect(rrect, paintFill); +#endif + canvas->rotate(180.f/30.f); + } + canvas->restore(); + + SkTime::DateTime time; + SkTime::GetDateTime(&time); + time.fHour = time.fHour >= 12 ? time.fHour-12 : time.fHour; + paintFill.setColor(SK_ColorBLACK); + + // Write hours + canvas->save(); + canvas->rotate(time.fHour*(180.f/6.f) + time.fMinute*(180.f/360.f) + + time.fSecond*(180.f/21600.f) ); +#ifdef USE_PATH + paintStroke.setStrokeWidth(14); + path.reset(); + path.moveTo(-20,0); + path.lineTo(80,0); + canvas->drawPath(path, paintStroke); +#else + rect = SkRect::MakeLTRB(-20-7, -7, 80+7, 7); + radii[0] = SkPoint::Make(7,7); + radii[1] = SkPoint::Make(7,7); + radii[2] = SkPoint::Make(7,7); + radii[3] = SkPoint::Make(7,7); + rrect.setRectRadii(rect, radii); + canvas->drawRRect(rrect, paintFill); +#endif + canvas->restore(); + + // Write minutes + canvas->save(); + canvas->rotate(time.fMinute*(180.f/30.f) + + time.fSecond*(180.f/1800.f) ); +#ifdef USE_PATH + paintStroke.setStrokeWidth(10); + path.reset(); + path.moveTo(-56,0); + path.lineTo(224,0); + canvas->drawPath(path, paintStroke); +#else + rect = SkRect::MakeLTRB(-56-5, -5, 224+5, 5); + radii[0] = SkPoint::Make(5,5); + radii[1] = SkPoint::Make(5,5); + radii[2] = SkPoint::Make(5,5); + radii[3] = SkPoint::Make(5,5); + rrect.setRectRadii(rect, radii); + canvas->drawRRect(rrect, paintFill); +#endif + canvas->restore(); + + // Write seconds + canvas->save(); + canvas->rotate(time.fSecond*(180.f/30.f)); + paintFill.setColor(0xffd40000); + paintStroke.setColor(0xffd40000); + paintStroke.setStrokeWidth(6); +#ifdef USE_PATH + path.reset(); + path.moveTo(-60,0); + path.lineTo(166,0); + canvas->drawPath(path, paintStroke); +#else + rect = SkRect::MakeLTRB(-60-3, -3, 166+3, 3); + radii[0] = SkPoint::Make(3,3); + radii[1] = SkPoint::Make(3,3); + radii[2] = SkPoint::Make(3,3); + radii[3] = SkPoint::Make(3,3); + rrect.setRectRadii(rect, radii); + canvas->drawRRect(rrect, paintFill); +#endif + rect = SkRect::MakeLTRB(-20, -20, 20, 20); +#ifdef USE_PATH + path.reset(); + path.arcTo(rect, 0, 0, false); + path.addOval(rect, SkPath::kCCW_Direction); + path.arcTo(rect, 360, 0, true); + canvas->drawPath(path, paintFill); +#else + canvas->drawOval(rect, paintFill); +#endif + rect = SkRect::MakeLTRB(-20+190, -20, 20+190, 20); +#ifdef USE_PATH + path.reset(); + path.arcTo(rect, 0, 0, false); + path.addOval(rect, SkPath::kCCW_Direction); + path.arcTo(rect, 360, 0, true); + canvas->drawPath(path, paintStroke); +#else + canvas->drawOval(rect, paintStroke); +#endif + paintFill.setColor(0xff505050); +#ifdef USE_PATH + rect = SkRect::MakeLTRB(-6, -6, 6, 6); + path.arcTo(rect, 0, 0, false); + path.addOval(rect, SkPath::kCCW_Direction); + path.arcTo(rect, 360, 0, true); + canvas->drawPath(path, paintFill); +#else + canvas->drawOval(rect, paintFill); + rect = SkRect::MakeLTRB(-6, -6, 6, 6); + canvas->drawOval(rect, paintFill); +#endif + canvas->restore(); + + paintStroke.setStrokeWidth(18); + paintStroke.setColor(0xff325FA2); + rect = SkRect::MakeLTRB(-284, -284, 284, 284); +#ifdef USE_PATH + path.reset(); + path.arcTo(rect, 0, 0, false); + path.addOval(rect, SkPath::kCCW_Direction); + path.arcTo(rect, 360, 0, true); + canvas->drawPath(path, paintStroke); +#else + canvas->drawOval(rect, paintStroke); +#endif + + canvas->restore(); + + this->inval(NULL); + } + +private: + + typedef SampleView INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new ClockView; } +static SkViewRegister reg(MyFactory); |