summaryrefslogtreecommitdiffstats
path: root/content/common/inter_process_time_ticks_converter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/common/inter_process_time_ticks_converter.cc')
-rw-r--r--content/common/inter_process_time_ticks_converter.cc58
1 files changed, 58 insertions, 0 deletions
diff --git a/content/common/inter_process_time_ticks_converter.cc b/content/common/inter_process_time_ticks_converter.cc
new file mode 100644
index 0000000..09c14f0
--- /dev/null
+++ b/content/common/inter_process_time_ticks_converter.cc
@@ -0,0 +1,58 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/common/inter_process_time_ticks_converter.h"
+
+#include "base/logging.h"
+
+namespace content {
+
+InterProcessTimeTicksConverter::InterProcessTimeTicksConverter(
+ const LocalTimeTicks& local_lower_bound,
+ const LocalTimeTicks& local_upper_bound,
+ const RemoteTimeTicks& remote_lower_bound,
+ const RemoteTimeTicks& remote_upper_bound)
+ : remote_lower_bound_(remote_lower_bound.value_),
+ remote_upper_bound_(remote_upper_bound.value_) {
+ int64 target_range = local_upper_bound.value_ - local_lower_bound.value_;
+ int64 source_range = remote_upper_bound.value_ - remote_lower_bound.value_;
+ if (source_range <= target_range) {
+ // We fit! Just shift the midpoints to match.
+ numerator_ = 1;
+ denominator_ = 1;
+ offset_ = ((local_upper_bound.value_ + local_lower_bound.value_) -
+ (remote_upper_bound.value_ + remote_lower_bound.value_)) / 2;
+ return;
+ }
+ // Set up scaling factors, and then deduce shift.
+ numerator_ = target_range;
+ denominator_ = source_range;
+ // Find out what we need to shift by to make this really work.
+ offset_ = local_lower_bound.value_ - Convert(remote_lower_bound.value_);
+ DCHECK_GE(local_upper_bound.value_, Convert(remote_upper_bound.value_));
+}
+
+LocalTimeTicks InterProcessTimeTicksConverter::ToLocalTimeTicks(
+ const RemoteTimeTicks& remote_ms) {
+ DCHECK_LE(remote_lower_bound_, remote_ms.value_);
+ DCHECK_GE(remote_upper_bound_, remote_ms.value_);
+ RemoteTimeDelta remote_delta = remote_ms - remote_lower_bound_;
+ return LocalTimeTicks(remote_lower_bound_ + offset_ +
+ ToLocalTimeDelta(remote_delta).value_);
+}
+
+LocalTimeDelta InterProcessTimeTicksConverter::ToLocalTimeDelta(
+ const RemoteTimeDelta& remote_delta) {
+ DCHECK_GE(remote_upper_bound_, remote_lower_bound_ + remote_delta.value_);
+ return LocalTimeDelta(Convert(remote_delta.value_));
+}
+
+int64 InterProcessTimeTicksConverter::Convert(int64 value) {
+ if (value <= 0) {
+ return value;
+ }
+ return numerator_ * value / denominator_;
+}
+
+} // namespace content