| Index: cc/base/synced_property.h
|
| diff --git a/cc/base/synced_property.h b/cc/base/synced_property.h
|
| deleted file mode 100644
|
| index 6b02e7a651adab571034ae020be658d87667e65c..0000000000000000000000000000000000000000
|
| --- a/cc/base/synced_property.h
|
| +++ /dev/null
|
| @@ -1,187 +0,0 @@
|
| -// Copyright 2014 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.
|
| -
|
| -#ifndef CC_BASE_SYNCED_PROPERTY_H_
|
| -#define CC_BASE_SYNCED_PROPERTY_H_
|
| -
|
| -#include "base/memory/ref_counted.h"
|
| -
|
| -namespace cc {
|
| -
|
| -// This class is the basic primitive used for impl-thread scrolling. Its job is
|
| -// to sanely resolve the case where both the main and impl thread are
|
| -// concurrently updating the same value (for example, when Javascript sets the
|
| -// scroll offset during an ongoing impl-side scroll).
|
| -//
|
| -// There are three trees (main, pending, and active) and therefore also three
|
| -// places with their own idea of the scroll offsets (and analogous properties
|
| -// like page scale). Objects of this class are meant to be held on the Impl
|
| -// side, and contain the canonical reference for the pending and active trees,
|
| -// as well as keeping track of the latest delta sent to the main thread (which
|
| -// is necessary for conflict resolution).
|
| -
|
| -template <typename T>
|
| -class SyncedProperty : public base::RefCounted<SyncedProperty<T>> {
|
| - public:
|
| - SyncedProperty() : clobber_active_value_(false) {}
|
| -
|
| - // Returns the canonical value for the specified tree, including the sum of
|
| - // all deltas. The pending tree should use this for activation purposes and
|
| - // the active tree should use this for drawing.
|
| - typename T::ValueType Current(bool is_active_tree) const {
|
| - if (is_active_tree)
|
| - return active_base_.Combine(active_delta_).get();
|
| - else
|
| - return pending_base_.Combine(PendingDelta()).get();
|
| - }
|
| -
|
| - // Sets the value on the impl thread, due to an impl-thread-originating
|
| - // action. Returns true if this had any effect. This will remain
|
| - // impl-thread-only information at first, and will get pulled back to the main
|
| - // thread on the next call of PullDeltaToMainThread (which happens right
|
| - // before the commit).
|
| - bool SetCurrent(typename T::ValueType current) {
|
| - T delta = T(current).InverseCombine(active_base_);
|
| - if (active_delta_.get() == delta.get())
|
| - return false;
|
| -
|
| - active_delta_ = delta;
|
| - return true;
|
| - }
|
| -
|
| - // Returns the difference between the last value that was committed and
|
| - // activated from the main thread, and the current total value.
|
| - typename T::ValueType Delta() const { return active_delta_.get(); }
|
| -
|
| - // Returns the latest active tree delta and also makes a note that this value
|
| - // was sent to the main thread.
|
| - typename T::ValueType PullDeltaForMainThread() {
|
| - sent_delta_ = active_delta_;
|
| - return active_delta_.get();
|
| - }
|
| -
|
| - // Push the latest value from the main thread onto pending tree-associated
|
| - // state. Returns true if this had any effect.
|
| - bool PushFromMainThread(typename T::ValueType main_thread_value) {
|
| - if (pending_base_.get() == main_thread_value)
|
| - return false;
|
| -
|
| - pending_base_ = T(main_thread_value);
|
| -
|
| - return true;
|
| - }
|
| -
|
| - // Push the value associated with the pending tree to be the active base
|
| - // value. As part of this, subtract the last sent value from the active tree
|
| - // delta (which will make the delta zero at steady state, or make it contain
|
| - // only the difference since the last send).
|
| - bool PushPendingToActive() {
|
| - if (active_base_.get() == pending_base_.get() &&
|
| - sent_delta_.get() == T::Identity().get())
|
| - return false;
|
| -
|
| - active_base_ = pending_base_;
|
| - active_delta_ = PendingDelta();
|
| - sent_delta_ = T::Identity();
|
| - clobber_active_value_ = false;
|
| -
|
| - return true;
|
| - }
|
| -
|
| - // This simulates the consequences of the sent value getting committed and
|
| - // activated. The value sent to the main thread ends up combined with the
|
| - // active value, and the sent_delta is subtracted from the delta.
|
| - void AbortCommit() {
|
| - active_base_ = active_base_.Combine(sent_delta_);
|
| - active_delta_ = PendingDelta();
|
| - sent_delta_ = T::Identity();
|
| - }
|
| -
|
| - // Values as last pushed to the pending or active tree respectively, with no
|
| - // impl-thread delta applied.
|
| - typename T::ValueType PendingBase() const { return pending_base_.get(); }
|
| - typename T::ValueType ActiveBase() const { return active_base_.get(); }
|
| -
|
| - // The new delta we would use if we decide to activate now. This delta
|
| - // excludes the amount that we expect the main thread to reflect back at the
|
| - // impl thread during the commit.
|
| - T PendingDelta() const {
|
| - if (clobber_active_value_)
|
| - return T::Identity();
|
| - return active_delta_.InverseCombine(sent_delta_);
|
| - }
|
| -
|
| - void set_clobber_active_value() { clobber_active_value_ = true; }
|
| -
|
| - private:
|
| - // Value last committed to the pending tree.
|
| - T pending_base_;
|
| - // Value last committed to the active tree (on the last activation).
|
| - T active_base_;
|
| - // The difference between the active_base_ and the user-perceived value.
|
| - T active_delta_;
|
| - // The value sent to the main thread (on the last BeginFrame); this is always
|
| - // identity outside of the BeginFrame-to-activation interval.
|
| - T sent_delta_;
|
| - // When true the pending delta is always identity so that it does not change
|
| - // and will clobber the active value on push.
|
| - bool clobber_active_value_;
|
| -
|
| - friend class base::RefCounted<SyncedProperty<T>>;
|
| - ~SyncedProperty() {}
|
| -};
|
| -
|
| -// SyncedProperty's delta-based conflict resolution logic makes sense for any
|
| -// mathematical group. In practice, there are two that are useful:
|
| -// 1. Numbers/vectors with addition and identity = 0 (like scroll offsets)
|
| -// 2. Real numbers with multiplication and identity = 1 (like page scale)
|
| -
|
| -template <class V>
|
| -class AdditionGroup {
|
| - public:
|
| - typedef V ValueType;
|
| -
|
| - AdditionGroup() : value_(Identity().get()) {}
|
| - explicit AdditionGroup(V value) : value_(value) {}
|
| -
|
| - V& get() { return value_; }
|
| - const V& get() const { return value_; }
|
| -
|
| - static AdditionGroup<V> Identity() { return AdditionGroup(V()); } // zero
|
| - AdditionGroup<V> Combine(AdditionGroup<V> p) const {
|
| - return AdditionGroup<V>(value_ + p.value_);
|
| - }
|
| - AdditionGroup<V> InverseCombine(AdditionGroup<V> p) const {
|
| - return AdditionGroup<V>(value_ - p.value_);
|
| - }
|
| -
|
| - private:
|
| - V value_;
|
| -};
|
| -
|
| -class ScaleGroup {
|
| - public:
|
| - typedef float ValueType;
|
| -
|
| - ScaleGroup() : value_(Identity().get()) {}
|
| - explicit ScaleGroup(float value) : value_(value) {}
|
| -
|
| - float& get() { return value_; }
|
| - const float& get() const { return value_; }
|
| -
|
| - static ScaleGroup Identity() { return ScaleGroup(1.f); }
|
| - ScaleGroup Combine(ScaleGroup p) const {
|
| - return ScaleGroup(value_ * p.value_);
|
| - }
|
| - ScaleGroup InverseCombine(ScaleGroup p) const {
|
| - return ScaleGroup(value_ / p.value_);
|
| - }
|
| -
|
| - private:
|
| - float value_;
|
| -};
|
| -
|
| -} // namespace cc
|
| -
|
| -#endif // CC_BASE_SYNCED_PROPERTY_H_
|
|
|