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

Unified Diff: base/time/time.cc

Issue 178103004: Removing the use of base::Time inside the LayerTreeHost system. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changing to a common ToWebKitTime function. Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: base/time/time.cc
diff --git a/base/time/time.cc b/base/time/time.cc
index 9f3c53d6695b1e8b4960dc4911c761dff3b7aa56..dfe4ef04ff7718083ba8917167efc406359d9157 100644
--- a/base/time/time.cc
+++ b/base/time/time.cc
@@ -4,6 +4,7 @@
#include "base/time/time.h"
+#include <cmath>
#include <limits>
#include <ostream>
@@ -213,6 +214,46 @@ TimeTicks TimeTicks::UnixEpoch() {
return leaky_unix_epoch_singleton_instance.Get().unix_epoch();
}
+TimeTicks TimeTicks::FromWebKit(double dt) {
+ // Outside of 2**53 the conversion to/from double isn't presevative.
+
+ if (dt == 0 || IsNaN(dt))
+ return TimeTicks(); // Preserve 0 so we can tell it doesn't exist.
+
+ double dus = dt * static_cast<double>(Time::kMicrosecondsPerSecond);
+
+ // Check double isn't too big for an int64
+ if (dus >= static_cast<double>(std::numeric_limits<int64>::max()))
+ return TimeTicks(std::numeric_limits<int64>::max());
+ if (dus <= static_cast<double>(std::numeric_limits<int64>::min()))
+ return TimeTicks(std::numeric_limits<int64>::min());
+
+ int64 epoch_us = static_cast<int64>(dus);
+
+ // Make sure the Epoch adjustment won't cause over/under flow.
+ if (UnixEpoch().ticks_ > 0 &&
+ epoch_us >= std::numeric_limits<int64>::max() - UnixEpoch().ticks_)
+ return TimeTicks(std::numeric_limits<int64>::max());
+ if (UnixEpoch().ticks_ < 0 &&
+ epoch_us <= std::numeric_limits<int64>::min() - UnixEpoch().ticks_)
+ return TimeTicks(std::numeric_limits<int64>::min());
+
+ return TimeTicks(epoch_us + UnixEpoch().ticks_);
+}
+
+double TimeTicks::ToWebKit() const {
+ if (is_null())
+ return 0; // Preserve 0 so we can tell it doesn't exist.
+
+ if (ticks_ == std::numeric_limits<int64>::max())
+ return std::numeric_limits<double>::infinity();
+ if (ticks_ == std::numeric_limits<int64>::min())
+ return -std::numeric_limits<double>::infinity();
+
+ return (static_cast<double>(ticks_ - UnixEpoch().ticks_) /
+ static_cast<double>(Time::kMicrosecondsPerSecond));
+}
+
// Time::Exploded -------------------------------------------------------------
inline bool is_in_range(int value, int lo, int hi) {

Powered by Google App Engine
This is Rietveld 408576698