blob: a880877b6053afb591a89b6d506e0729e88ff462 [file] [log] [blame]
// Copyright 2017 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 "cc/animation/scroll_timeline.h"
#include "cc/trees/property_tree.h"
#include "cc/trees/scroll_node.h"
#include "ui/gfx/geometry/scroll_offset.h"
#include "ui/gfx/geometry/size.h"
namespace cc {
ScrollTimeline::ScrollTimeline(ElementId scroller_id,
ScrollDirection orientation,
double time_range)
: scroller_id_(scroller_id),
orientation_(orientation),
time_range_(time_range) {}
std::unique_ptr<ScrollTimeline> ScrollTimeline::CreateImplInstance() const {
return std::make_unique<ScrollTimeline>(scroller_id_, orientation_,
time_range_);
}
double ScrollTimeline::CurrentTime(const ScrollTree& scroll_tree) const {
// If the scroller isn't in the ScrollTree, the element either no longer
// exists or is not currently scrollable. By the spec, return an unresolved
// time value.
if (!scroll_tree.FindNodeFromElementId(scroller_id_))
return std::numeric_limits<double>::quiet_NaN();
gfx::ScrollOffset offset = scroll_tree.current_scroll_offset(scroller_id_);
DCHECK_GE(offset.x(), 0);
DCHECK_GE(offset.y(), 0);
gfx::ScrollOffset scroll_dimensions = scroll_tree.MaxScrollOffset(
scroll_tree.FindNodeFromElementId(scroller_id_)->id);
double current_offset = (orientation_ == Vertical) ? offset.y() : offset.x();
double max_offset = (orientation_ == Vertical) ? scroll_dimensions.y()
: scroll_dimensions.x();
// 3. If current scroll offset is less than startScrollOffset, return an
// unresolved time value if fill is none or forwards, or 0 otherwise.
// TODO(smcgruer): Implement |startScrollOffset| and |fill|.
// 4. If current scroll offset is greater than or equal to endScrollOffset,
// return an unresolved time value if fill is none or backwards, or the
// effective time range otherwise.
// TODO(smcgruer): Implement |endScrollOffset| and |fill|.
// 5. Return the result of evaluating the following expression:
// ((current scroll offset - startScrollOffset) /
// (endScrollOffset - startScrollOffset)) * effective time range
return (std::abs(current_offset) / max_offset) * time_range_;
}
} // namespace cc