/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
void FrameMetrics::RecalculateLayoutViewportOffset() { // For subframes, the visual and layout viewports coincide, so just // keep the layout viewport offset in sync with the visual one. if (!mIsRootContent) {
mLayoutViewport.MoveTo(GetVisualScrollOffset()); return;
} // For the root, the two viewports can diverge, but the layout // viewport needs to keep enclosing the visual viewport.
KeepLayoutViewportEnclosingVisualViewport(GetVisualViewport(),
mScrollableRect, mLayoutViewport);
}
/* static */ void FrameMetrics::KeepLayoutViewportEnclosingVisualViewport( const CSSRect& aVisualViewport, const CSSRect& aScrollableRect,
CSSRect& aLayoutViewport) { // If the visual viewport is contained within the layout viewport, we don't // need to make any adjustments, so we can exit early. // // Additionally, if the composition bounds changes (due to an orientation // change, window resize, etc.), it may take a few frames for aLayoutViewport // to update and during that time, the visual viewport may be larger than the // layout viewport. In such situations, we take an early exit if the visual // viewport contains the layout viewport. if (aLayoutViewport.Contains(aVisualViewport) ||
aVisualViewport.Contains(aLayoutViewport)) { return;
}
// If visual viewport size is greater than the layout viewport, move the // layout viewport such that it remains inside the visual viewport. Otherwise, // move the layout viewport such that the visual viewport is contained // inside the layout viewport. if ((aLayoutViewport.Width() < aVisualViewport.Width() &&
!FuzzyEqualsMultiplicative(aLayoutViewport.Width(),
aVisualViewport.Width())) ||
(aLayoutViewport.Height() < aVisualViewport.Height() &&
!FuzzyEqualsMultiplicative(aLayoutViewport.Height(),
aVisualViewport.Height()))) { if (aLayoutViewport.X() < aVisualViewport.X()) { // layout viewport moves right
aLayoutViewport.MoveToX(aVisualViewport.X());
} elseif (aVisualViewport.XMost() < aLayoutViewport.XMost()) { // layout viewport moves left
aLayoutViewport.MoveByX(aVisualViewport.XMost() -
aLayoutViewport.XMost());
} if (aLayoutViewport.Y() < aVisualViewport.Y()) { // layout viewport moves down
aLayoutViewport.MoveToY(aVisualViewport.Y());
} elseif (aVisualViewport.YMost() < aLayoutViewport.YMost()) { // layout viewport moves up
aLayoutViewport.MoveByY(aVisualViewport.YMost() -
aLayoutViewport.YMost());
}
} else { if (aVisualViewport.X() < aLayoutViewport.X()) {
aLayoutViewport.MoveToX(aVisualViewport.X());
} elseif (aLayoutViewport.XMost() < aVisualViewport.XMost()) {
aLayoutViewport.MoveByX(aVisualViewport.XMost() -
aLayoutViewport.XMost());
} if (aVisualViewport.Y() < aLayoutViewport.Y()) {
aLayoutViewport.MoveToY(aVisualViewport.Y());
} elseif (aLayoutViewport.YMost() < aVisualViewport.YMost()) {
aLayoutViewport.MoveByY(aVisualViewport.YMost() -
aLayoutViewport.YMost());
}
}
// Regardless of any adjustment above, the layout viewport is not allowed // to go outside the scrollable rect.
aLayoutViewport = aLayoutViewport.MoveInsideAndClamp(aScrollableRect);
}
/* static */
CSSSize FrameMetrics::CalculateCompositedSizeInCssPixels( const ParentLayerRect& aCompositionBounds, const CSSToParentLayerScale& aZoom) { if (aZoom == CSSToParentLayerScale(0)) { return CSSSize(); // avoid division by zero
} return aCompositionBounds.Size() / aZoom;
}
bool FrameMetrics::ApplyScrollUpdateFrom(const ScrollPositionUpdate& aUpdate) {
MOZ_ASSERT(aUpdate.GetType() == ScrollUpdateType::Absolute);
MOZ_ASSERT(aUpdate.GetMode() != ScrollMode::Smooth &&
aUpdate.GetMode() != ScrollMode::SmoothMsd); // In applying a main-thread scroll update, try to preserve the relative // offset between the visual and layout viewports.
CSSPoint relativeOffset = GetVisualScrollOffset() - GetLayoutScrollOffset();
MOZ_ASSERT(IsRootContent() || relativeOffset == CSSPoint()); // We need to set the two offsets together, otherwise a subsequent // RecalculateLayoutViewportOffset() could see divergent layout and // visual offsets. bool offsetChanged = SetLayoutScrollOffset(aUpdate.GetDestination());
offsetChanged |=
ClampAndSetVisualScrollOffset(aUpdate.GetDestination() + relativeOffset); return offsetChanged;
}
void FrameMetrics::UpdatePendingScrollInfo(const ScrollPositionUpdate& aInfo) { // We only get this "pending scroll info" for paint-skip transactions, // but PureRelative position updates always trigger a full paint, so // we should never enter this code with a PureRelative update type. For // the other types, the destination field on the ScrollPositionUpdate will // tell us the final layout scroll position on the main thread.
MOZ_ASSERT(aInfo.GetType() != ScrollUpdateType::PureRelative);
// In applying a main-thread scroll update, try to preserve the relative // offset between the visual and layout viewports.
CSSPoint relativeOffset = GetVisualScrollOffset() - GetLayoutScrollOffset();
MOZ_ASSERT(IsRootContent() || relativeOffset == CSSPoint());
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.