Index: ui/gfx/frame_time.h |
diff --git a/ui/gfx/frame_time.h b/ui/gfx/frame_time.h |
index 8d143eed2c5f51b734917041e97411724f980bc2..2ffa72ee0d026563602985a29cb70161aadb1118 100644 |
--- a/ui/gfx/frame_time.h |
+++ b/ui/gfx/frame_time.h |
@@ -10,26 +10,145 @@ |
namespace gfx { |
-// FrameTime::Now() should be used to get timestamps with a timebase that |
-// is consistent across the graphics stack. |
+// FrameTime should be used for getting the current timestamp in |
+// the same timebase as DisplayTime and for representing things like deadlines |
+// and animation start/end times, which may not occur exactly on a vsync |
+// boundary. |
class FrameTime { |
public: |
- static base::TimeTicks Now() { |
- if (TimestampsAreHighRes()) |
- return base::TimeTicks::HighResNow(); |
- return base::TimeTicks::Now(); |
+ FrameTime() : ticks_(0) { |
} |
#if defined(OS_WIN) |
static base::TimeTicks FromQPCValue(LONGLONG qpc_value) { |
- DCHECK(TimestampsAreHighRes()); |
+ DCHECK(FrameTime::IsHighRes()); |
return base::TimeTicks::FromQPCValue(qpc_value); |
} |
#endif |
- static bool TimestampsAreHighRes() { |
+ static bool IsHighRes() { |
return base::TimeTicks::IsHighResNowFastAndReliable(); |
} |
+ |
+ static FrameTime Now() { |
+ if (IsHighRes()) |
+ return FrameTime(base::TimeTicks::HighResNow().ToInternalValue()); |
+ return FrameTime(base::TimeTicks::Now().ToInternalValue()); |
+ } |
+ |
+ // Returns true if this object has not been initialized. |
+ bool is_null() const { |
+ return ticks_ == 0; |
+ } |
+ |
+ double Unsafe_InSecondsF() const { |
+ return static_cast<double>(ticks_) / base::Time::kMicrosecondsPerSecond; |
+ } |
+ |
+ double Unsafe_InMillisecondsF() const { |
+ return static_cast<double>(ticks_) / |
+ base::Time::kMicrosecondsPerMillisecond; |
+ } |
+ |
+ static FrameTime Unsafe_FromSecondsF(double seconds) { |
+ return FrameTime(seconds * base::Time::kMicrosecondsPerSecond); |
+ } |
+ |
+ static FrameTime Unsafe_FromTimeTicks(base::TimeTicks time_ticks) { |
+ return FrameTime(time_ticks.ToInternalValue()); |
+ } |
+ |
+ |
+ FrameTime& operator=(FrameTime other) { |
+ ticks_ = other.ticks_; |
+ return *this; |
+ } |
+ |
+ // Compute the difference between two times. |
+ base::TimeDelta operator-(FrameTime other) const { |
+ DCHECK(!other.is_null()) << "Please do not convert time to a float."; |
+ return base::TimeDelta::FromInternalValue(ticks_ - other.ticks_); |
+ } |
+ |
+ // Modify by some time delta. |
+ FrameTime& operator+=(base::TimeDelta delta) { |
+ ticks_ += delta.ToInternalValue(); |
+ return *this; |
+ } |
+ FrameTime& operator-=(base::TimeDelta delta) { |
+ ticks_ -= delta.ToInternalValue(); |
+ return *this; |
+ } |
+ |
+ // Return a new FrameTime modified by some delta. |
+ FrameTime operator+(base::TimeDelta delta) const { |
+ return FrameTime(ticks_ + delta.ToInternalValue()); |
+ } |
+ FrameTime operator-(base::TimeDelta delta) const { |
+ return FrameTime(ticks_ - delta.ToInternalValue()); |
+ } |
+ |
+ // Comparison operators |
+ bool operator==(FrameTime other) const { |
+ return ticks_ == other.ticks_; |
+ } |
+ bool operator!=(FrameTime other) const { |
+ return ticks_ != other.ticks_; |
+ } |
+ bool operator<(FrameTime other) const { |
+ return ticks_ < other.ticks_; |
+ } |
+ bool operator<=(FrameTime other) const { |
+ return ticks_ <= other.ticks_; |
+ } |
+ bool operator>(FrameTime other) const { |
+ return ticks_ > other.ticks_; |
+ } |
+ bool operator>=(FrameTime other) const { |
+ return ticks_ >= other.ticks_; |
+ } |
+ |
+ protected: |
+ // Tick count in microseconds. |
+ int64 ticks_; |
+ |
+ // Please use Now() to create a new object. This is for internal use. |
+ // Ticks is in microseconds. |
+ explicit FrameTime(int64 ticks) : ticks_(ticks) { |
+ } |
+ |
+ friend class DisplayTime; |
+}; |
+ |
+// DisplayTime should be used to represent a timestamp that should be aligned |
+// with the display vsync phase. |
+class DisplayTime : public FrameTime { |
+ public: |
+ DisplayTime() : FrameTime(0) { |
+ } |
+ |
+ static DisplayTime Unsafe_CreateFromTimeTicks(base::TimeTicks time_ticks) { |
+ return DisplayTime(time_ticks.ToInternalValue()); |
+ } |
+ |
+ static DisplayTime Unsafe_CreateFromFrameTime(FrameTime fractional) { |
+ return DisplayTime(fractional.ticks_); |
+ } |
+ |
+ protected: |
+ explicit DisplayTime(int64 ticks) |
+ : FrameTime(ticks) {} |
+ |
+ private: |
+ // Hide non const methods of FrameTime |
+ DisplayTime& operator+=(base::TimeDelta delta) { |
+ NOTREACHED(); |
+ return *this; |
+ } |
+ DisplayTime& operator-=(base::TimeDelta delta) { |
+ NOTREACHED(); |
+ return *this; |
+ } |
}; |
} |