bool VisualViewport::magnifyScaleAroundAnchor(float magnifyDelta, const FloatPoint& anchor) { const float oldPageScale = scale(); const float newPageScale = frameHost().chromeClient().clampPageScaleFactorToLimits( magnifyDelta * oldPageScale); if (newPageScale == oldPageScale) return false; if (!mainFrame() || !mainFrame()->view()) return false; // Keep the center-of-pinch anchor in a stable position over the course // of the magnify. FloatPoint anchorAtOldScale = anchor.scaledBy(1.f / oldPageScale); FloatPoint anchorAtNewScale = anchor.scaledBy(1.f / newPageScale); FloatSize anchorDelta = anchorAtOldScale - anchorAtNewScale; // First try to use the anchor's delta to scroll the FrameView. FloatSize anchorDeltaUnusedByScroll = anchorDelta; if (!frameHost().settings().invertViewportScrollOrder()) { FrameView* view = mainFrame()->view(); DoublePoint oldPosition = view->scrollPositionDouble(); view->scrollBy(DoubleSize(anchorDelta.width(), anchorDelta.height()), UserScroll); DoublePoint newPosition = view->scrollPositionDouble(); anchorDeltaUnusedByScroll -= toFloatSize(newPosition - oldPosition); } // Manually bubble any remaining anchor delta up to the visual viewport. FloatPoint newLocation(location() + anchorDeltaUnusedByScroll); setScaleAndLocation(newPageScale, newLocation); return true; }
bool VisualViewport::magnifyScaleAroundAnchor(float magnifyDelta, const FloatPoint& anchor) { const float oldPageScale = scale(); const float newPageScale = frameHost().chromeClient().clampPageScaleFactorToLimits(magnifyDelta * oldPageScale); if (newPageScale == oldPageScale) return false; if (!mainFrame() || !mainFrame()->view()) return false; // Keep the center-of-pinch anchor in a stable position over the course // of the magnify. FloatPoint anchorAtOldScale = anchor.scaledBy(1.f / oldPageScale); FloatPoint anchorAtNewScale = anchor.scaledBy(1.f / newPageScale); FloatSize anchorDelta = anchorAtOldScale - anchorAtNewScale; // First try to use the anchor's delta to scroll the FrameView. FloatSize anchorDeltaUnusedByScroll = anchorDelta; // Manually bubble any remaining anchor delta up to the visual viewport. FloatPoint newLocation(FloatPoint(getScrollOffset()) + anchorDeltaUnusedByScroll); setScaleAndLocation(newPageScale, newLocation); return true; }
void VisualViewport::setScale(float scale) { setScaleAndLocation(scale, m_offset); }
void VisualViewport::setLocation(const FloatPoint& newLocation) { setScaleAndLocation(m_scale, newLocation); }
void VisualViewport::reset() { setScaleAndLocation(1, FloatPoint()); }
void VisualViewport::setScale(float scale) { setScaleAndLocation(scale, FloatPoint(m_offset)); }