void RootFrameViewport::distributeScrollBetweenViewports(const DoublePoint& offset, ScrollType scrollType, ScrollBehavior behavior) { // Make sure we use the scroll positions as reported by each viewport's ScrollAnimatorBase, since its // ScrollableArea's position may have the fractional part truncated off. DoublePoint oldPosition = scrollOffsetFromScrollAnimators(); DoubleSize delta = offset - oldPosition; if (delta.isZero()) return; DoublePoint targetPosition = visualViewport().clampScrollPosition( visualViewport().scrollAnimator().currentPosition() + delta); visualViewport().setScrollPosition(targetPosition, scrollType, behavior); // Scroll the secondary viewport if all of the scroll was not applied to the // primary viewport. DoublePoint updatedPosition = layoutViewport().scrollAnimator().currentPosition() + FloatPoint(targetPosition); DoubleSize applied = updatedPosition - oldPosition; delta -= applied; if (delta.isZero()) return; targetPosition = layoutViewport().clampScrollPosition(layoutViewport().scrollAnimator().currentPosition() + delta); layoutViewport().setScrollPosition(targetPosition, scrollType, behavior); }
void RootFrameViewport::setScrollOffset(const DoublePoint& offset, ScrollType scrollType) { // Make sure we use the scroll positions as reported by each viewport's ScrollAnimator, since its // ScrollableArea's position may have the fractional part truncated off. DoublePoint oldPosition = scrollOffsetFromScrollAnimators(); DoubleSize delta = offset - oldPosition; if (delta.isZero()) return; ScrollableArea& primary = !m_invertScrollOrder ? layoutViewport() : visualViewport(); ScrollableArea& secondary = !m_invertScrollOrder ? visualViewport() : layoutViewport(); DoublePoint targetPosition = primary.clampScrollPosition(primary.scrollAnimator()->currentPosition() + delta); primary.setScrollPosition(targetPosition, scrollType); DoubleSize applied = scrollOffsetFromScrollAnimators() - oldPosition; delta -= applied; if (delta.isZero()) return; targetPosition = secondary.clampScrollPosition(secondary.scrollAnimator()->currentPosition() + delta); secondary.setScrollPosition(targetPosition, scrollType); }
static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) { if (!object.isBoxModelObject() || !object.hasOverflowClip()) return nullptr; PaintLayer* layer = toLayoutBoxModelObject(object).layer(); ASSERT(layer); DoubleSize scrollOffset = layer->scrollableArea()->scrollOffset(); if (scrollOffset.isZero() && !layer->scrollsOverflow()) return nullptr; RefPtr<TransformPaintPropertyNode> newTransformNodeForScrollTranslation = TransformPaintPropertyNode::create( TransformationMatrix().translate(-scrollOffset.width(), -scrollOffset.height()), FloatPoint3D(), context.currentTransform); context.currentTransform = newTransformNodeForScrollTranslation.get(); return newTransformNodeForScrollTranslation.release(); }
void PaintPropertyTreeBuilder::updateScrollTranslation(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) { if (!object.isBoxModelObject() || !object.hasOverflowClip()) return; PaintLayer* layer = toLayoutBoxModelObject(object).layer(); ASSERT(layer); DoubleSize scrollOffset = layer->getScrollableArea()->scrollOffset(); if (scrollOffset.isZero() && !layer->scrollsOverflow()) return; RefPtr<TransformPaintPropertyNode> scrollTranslation = TransformPaintPropertyNode::create( TransformationMatrix().translate(-scrollOffset.width(), -scrollOffset.height()), FloatPoint3D(), context.currentTransform); context.currentTransform = scrollTranslation.get(); object.getMutableForPainting().ensureObjectPaintProperties().setScrollTranslation(scrollTranslation.release()); }