Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: gm/SkAnimTimer.h

Issue 1811613004: Change SkTime::GetMSecs to double; ensure values stored in SkMSec do not overflow. (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Rebase. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « dm/DM.cpp ('k') | include/animator/SkAnimator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkTime.h" 8 #include "SkTime.h"
9 9
10 #ifndef SkAnimTimer_DEFINED 10 #ifndef SkAnimTimer_DEFINED
(...skipping 11 matching lines...) Expand all
22 public: 22 public:
23 enum State { 23 enum State {
24 kStopped_State, 24 kStopped_State,
25 kPaused_State, 25 kPaused_State,
26 kRunning_State 26 kRunning_State
27 }; 27 };
28 28
29 /** 29 /**
30 * Class begins in the "stopped" state. 30 * Class begins in the "stopped" state.
31 */ 31 */
32 SkAnimTimer() : fBaseTime(0), fCurrTime(0), fState(kStopped_State) {} 32 SkAnimTimer() : fBaseTimeNanos(0), fCurrTimeNanos(0), fState(kStopped_State) {}
33 33
34 bool isStopped() const { return kStopped_State == fState; } 34 bool isStopped() const { return kStopped_State == fState; }
35 bool isRunning() const { return kRunning_State == fState; } 35 bool isRunning() const { return kRunning_State == fState; }
36 bool isPaused() const { return kPaused_State == fState; } 36 bool isPaused() const { return kPaused_State == fState; }
37 37
38 /** 38 /**
39 * Stops the timer, and resets it, such that the next call to run or toggle PauseResume 39 * Stops the timer, and resets it, such that the next call to run or toggle PauseResume
40 * will begin at time 0. 40 * will begin at time 0.
41 */ 41 */
42 void stop() { 42 void stop() {
(...skipping 20 matching lines...) Expand all
63 63
64 /** 64 /**
65 * Call this each time you want to sample the clock for the timer. This is NOT done 65 * Call this each time you want to sample the clock for the timer. This is NOT done
66 * automatically, so that repeated calls to msec() or secs() will always re turn the 66 * automatically, so that repeated calls to msec() or secs() will always re turn the
67 * same value. 67 * same value.
68 * 68 *
69 * This may safely be called with the timer in any state. 69 * This may safely be called with the timer in any state.
70 */ 70 */
71 void updateTime() { 71 void updateTime() {
72 if (kRunning_State == fState) { 72 if (kRunning_State == fState) {
73 fCurrTime = SkTime::GetMSecs(); 73 fCurrTimeNanos = SkTime::GetNSecs();
74 } 74 }
75 } 75 }
76 76
77 /** 77 /**
78 * Return the time in milliseconds the timer has been in the running state. 78 * Return the time in milliseconds the timer has been in the running state.
79 * Returns 0 if the timer is stopped. 79 * Returns 0 if the timer is stopped. Behavior is undefined if the timer
80 * has been running longer than SK_MSecMax.
80 */ 81 */
81 SkMSec msec() const { return fCurrTime - fBaseTime; } 82 SkMSec msec() const {
83 const double msec = (fCurrTimeNanos - fBaseTimeNanos) * 1e-6;
84 SkASSERT(SK_MSecMax >= msec);
85 return static_cast<SkMSec>(msec);
86 }
82 87
83 /** 88 /**
84 * Return the time in seconds the timer has been in the running state. 89 * Return the time in seconds the timer has been in the running state.
85 * Returns 0 if the timer is stopped. 90 * Returns 0 if the timer is stopped.
86 */ 91 */
87 double secs() const { 92 double secs() const { return (fCurrTimeNanos - fBaseTimeNanos) * 1e-9; }
88 return this->msec() * 0.001;
89 }
90 93
91 /** 94 /**
92 * Return the time in seconds the timer has been in the running state, 95 * Return the time in seconds the timer has been in the running state,
93 * scaled by "speed" and (if not zero) mod by period. 96 * scaled by "speed" and (if not zero) mod by period.
94 * Returns 0 if the timer is stopped. 97 * Returns 0 if the timer is stopped.
95 */ 98 */
96 SkScalar scaled(SkScalar speed, SkScalar period = 0) const { 99 SkScalar scaled(SkScalar speed, SkScalar period = 0) const {
97 double value = this->secs() * speed; 100 double value = this->secs() * speed;
98 if (period) { 101 if (period) {
99 value = ::fmod(value, SkScalarToDouble(period)); 102 value = ::fmod(value, SkScalarToDouble(period));
100 } 103 }
101 return SkDoubleToScalar(value); 104 return SkDoubleToScalar(value);
102 } 105 }
103 106
104 private: 107 private:
105 SkMSec fBaseTime; 108 double fBaseTimeNanos;
106 SkMSec fCurrTime; 109 double fCurrTimeNanos;
107 State fState; 110 State fState;
108 111
109 void setState(State newState) { 112 void setState(State newState) {
110 switch (newState) { 113 switch (newState) {
111 case kStopped_State: 114 case kStopped_State:
112 fBaseTime = fCurrTime = 0; 115 fBaseTimeNanos = fCurrTimeNanos = 0;
113 fState = kStopped_State; 116 fState = kStopped_State;
114 break; 117 break;
115 case kPaused_State: 118 case kPaused_State:
116 if (kRunning_State == fState) { 119 if (kRunning_State == fState) {
117 fState = kPaused_State; 120 fState = kPaused_State;
118 } // else stay stopped or paused 121 } // else stay stopped or paused
119 break; 122 break;
120 case kRunning_State: 123 case kRunning_State:
121 switch (fState) { 124 switch (fState) {
122 case kStopped_State: 125 case kStopped_State:
123 fBaseTime = fCurrTime = SkTime::GetMSecs(); 126 fBaseTimeNanos = fCurrTimeNanos = SkTime::GetNSecs();
124 break; 127 break;
125 case kPaused_State: {// they want "resume" 128 case kPaused_State: {// they want "resume"
126 SkMSec now = SkTime::GetMSecs(); 129 double now = SkTime::GetNSecs();
127 fBaseTime += now - fCurrTime; 130 fBaseTimeNanos += now - fCurrTimeNanos;
128 fCurrTime = now; 131 fCurrTimeNanos = now;
129 } break; 132 } break;
130 case kRunning_State: 133 case kRunning_State:
131 break; 134 break;
132 } 135 }
133 fState = kRunning_State; 136 fState = kRunning_State;
134 break; 137 break;
135 } 138 }
136 } 139 }
137 }; 140 };
138 141
139 #endif 142 #endif
OLDNEW
« no previous file with comments | « dm/DM.cpp ('k') | include/animator/SkAnimator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698