aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/SkAnimTimer.h
diff options
context:
space:
mode:
authorGravatar benjaminwagner <benjaminwagner@google.com>2016-03-25 12:59:53 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-25 12:59:53 -0700
commitec4d4d784dbb250e572f8e04d18d0fd2ebeee851 (patch)
tree444d5b0c8e1a54286d9adfc75fbc7d7e27b82fa3 /gm/SkAnimTimer.h
parent9cf31f40fb5df6b6b914e087394c40b8303e5e32 (diff)
Change SkTime::GetMSecs to double; ensure values stored in SkMSec do not overflow.
The following are currently unused in Android, Google3, Chromium, and Mozilla: - SkEvent - SkTime::GetMSecs - SK_TIME_FACTOR (also unused in Skia) - SkAutoTime I left uses of SkMSec more-or-less intact for SkEvent, SkAnimator, and SkInterpolator. SkInterpolator is used in Chromium, so I did not want to change the API. The views/ and animator/ code is crufty, so it didn't seem worthwhile to refactor it. Instead, I added SkEvent::GetMSecsSinceStartup, which is likely to be adequate for use in SampleApp. I also left SkMSec where it is used to measure a duration rather than a timestamp. With the exception of SkMovie, which is used in Android, all of the uses appear to measure the execution time of a piece of code, which I would hope does not exceed 2^31 milliseconds. Added skiatest::Timer to support a common idiom in tests where we want to measure the wallclock time in integer milliseconds. (Not used in tests/PathOpsSkpClipTest.cpp because it redefines things in Test.h.) Removed tabs in tests/StrokerTest.cpp. BUG=skia:4632 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1811613004 Review URL: https://codereview.chromium.org/1811613004
Diffstat (limited to 'gm/SkAnimTimer.h')
-rw-r--r--gm/SkAnimTimer.h31
1 files changed, 17 insertions, 14 deletions
diff --git a/gm/SkAnimTimer.h b/gm/SkAnimTimer.h
index 725171a8fe..2c8a723e5b 100644
--- a/gm/SkAnimTimer.h
+++ b/gm/SkAnimTimer.h
@@ -29,7 +29,7 @@ public:
/**
* Class begins in the "stopped" state.
*/
- SkAnimTimer() : fBaseTime(0), fCurrTime(0), fState(kStopped_State) {}
+ SkAnimTimer() : fBaseTimeNanos(0), fCurrTimeNanos(0), fState(kStopped_State) {}
bool isStopped() const { return kStopped_State == fState; }
bool isRunning() const { return kRunning_State == fState; }
@@ -70,23 +70,26 @@ public:
*/
void updateTime() {
if (kRunning_State == fState) {
- fCurrTime = SkTime::GetMSecs();
+ fCurrTimeNanos = SkTime::GetNSecs();
}
}
/**
* Return the time in milliseconds the timer has been in the running state.
- * Returns 0 if the timer is stopped.
+ * Returns 0 if the timer is stopped. Behavior is undefined if the timer
+ * has been running longer than SK_MSecMax.
*/
- SkMSec msec() const { return fCurrTime - fBaseTime; }
+ SkMSec msec() const {
+ const double msec = (fCurrTimeNanos - fBaseTimeNanos) * 1e-6;
+ SkASSERT(SK_MSecMax >= msec);
+ return static_cast<SkMSec>(msec);
+ }
/**
* Return the time in seconds the timer has been in the running state.
* Returns 0 if the timer is stopped.
*/
- double secs() const {
- return this->msec() * 0.001;
- }
+ double secs() const { return (fCurrTimeNanos - fBaseTimeNanos) * 1e-9; }
/**
* Return the time in seconds the timer has been in the running state,
@@ -102,14 +105,14 @@ public:
}
private:
- SkMSec fBaseTime;
- SkMSec fCurrTime;
+ double fBaseTimeNanos;
+ double fCurrTimeNanos;
State fState;
void setState(State newState) {
switch (newState) {
case kStopped_State:
- fBaseTime = fCurrTime = 0;
+ fBaseTimeNanos = fCurrTimeNanos = 0;
fState = kStopped_State;
break;
case kPaused_State:
@@ -120,12 +123,12 @@ private:
case kRunning_State:
switch (fState) {
case kStopped_State:
- fBaseTime = fCurrTime = SkTime::GetMSecs();
+ fBaseTimeNanos = fCurrTimeNanos = SkTime::GetNSecs();
break;
case kPaused_State: {// they want "resume"
- SkMSec now = SkTime::GetMSecs();
- fBaseTime += now - fCurrTime;
- fCurrTime = now;
+ double now = SkTime::GetNSecs();
+ fBaseTimeNanos += now - fCurrTimeNanos;
+ fCurrTimeNanos = now;
} break;
case kRunning_State:
break;