diff options
author | benjaminwagner <benjaminwagner@google.com> | 2016-03-25 12:59:53 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-25 12:59:53 -0700 |
commit | ec4d4d784dbb250e572f8e04d18d0fd2ebeee851 (patch) | |
tree | 444d5b0c8e1a54286d9adfc75fbc7d7e27b82fa3 /gm/SkAnimTimer.h | |
parent | 9cf31f40fb5df6b6b914e087394c40b8303e5e32 (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.h | 31 |
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; |