// Copyright 2014 The Chromium Authors // 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>> { … }; // SyncedProperty's delta-based conflict resolution logic makes sense for any // mathematical group. In practice, there are two that are useful: // 1. Numbers/classes with addition and subtraction operations, and // identity = constructor() (like gfx::Vector2dF for scroll offset and // scroll delta) // 2. Real numbers with multiplication and division operations, and // identity = 1 (like page scale) template <typename BaseT, typename DeltaT = BaseT> class AdditionGroup { … }; class ScaleGroup { … }; } // namespace cc #endif // CC_BASE_SYNCED_PROPERTY_H_