author | Botond Ballo <botond@mozilla.com> |
Mon, 10 Mar 2014 19:17:23 -0400 | |
changeset 173074 | 6e71e620511d68fb8d9f42d3f5c957a06b6c6605 |
parent 173073 | 3788d8852f6291079111f6f02ca9ac9c6c376aed |
child 173075 | 8382b9e3a5511ace3003c9a0e61d8b71ec4f47c7 |
push id | 40913 |
push user | bballo@mozilla.com |
push date | Tue, 11 Mar 2014 21:50:24 +0000 |
treeherder | mozilla-inbound@b9982dcb9a00 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | kats |
bugs | 965871 |
milestone | 30.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/ipc/AsyncPanZoomController.cpp +++ b/gfx/layers/ipc/AsyncPanZoomController.cpp @@ -307,16 +307,23 @@ static bool IsCloseToHorizontal(float aA } // As above, but for the vertical axis. static bool IsCloseToVertical(float aAngle, float aThreshold) { return (fabs(aAngle - (M_PI / 2)) < aThreshold); } +template <typename Units> +static bool IsZero(const gfx::PointTyped<Units>& aPoint) +{ + return FuzzyEqualsMultiplicative(aPoint.x, 0.0f) + && FuzzyEqualsMultiplicative(aPoint.y, 0.0f); +} + static inline void LogRendertraceRect(const ScrollableLayerGuid& aGuid, const char* aDesc, const char* aColor, const CSSRect& aRect) { #ifdef APZC_ENABLE_RENDERTRACE static const TimeStamp sRenderStart = TimeStamp::Now(); TimeDuration delta = TimeStamp::Now() - sRenderStart; printf_stderr("(%llu,%lu,%llu)%s RENDERTRACE %f rect %s %f %f %f %f\n", aGuid.mLayersId, aGuid.mPresShellId, aGuid.mScrollId, aDesc, delta.ToMilliseconds(), aColor, @@ -745,18 +752,19 @@ nsEventStatus AsyncPanZoomController::On SetState(NOTHING); return nsEventStatus_eIgnore; case PANNING: case PANNING_LOCKED_X: case PANNING_LOCKED_Y: { // Make a local copy of the tree manager pointer and check if it's not - // null before calling HandleOverscroll(). This is necessary because - // Destroy(), which nulls out mTreeManager, could be called concurrently. + // null before calling FlushRepaintsForOverscrollHandoffChain(). + // This is necessary because Destroy(), which nulls out mTreeManager, + // could be called concurrently. APZCTreeManager* treeManagerLocal = mTreeManager; if (treeManagerLocal) { if (!treeManagerLocal->FlushRepaintsForOverscrollHandoffChain()) { NS_WARNING("Overscroll handoff chain was empty during panning! This should not be the case."); // Graceful handling of error condition FlushRepaintForOverscrollHandoff(); } } @@ -1147,49 +1155,49 @@ void AsyncPanZoomController::AttemptScro ScreenPoint overscroll; // will be used outside monitor block { ReentrantMonitorAutoEnter lock(mMonitor); CSSToScreenScale zoom = mFrameMetrics.mZoom; // Inversely scale the offset by the resolution (when you're zoomed further in, - // a larger swipe should move you a shorter distance). + // the same swipe should move you a shorter distance). CSSPoint cssDisplacement = displacement / zoom; CSSPoint cssOverscroll; - gfx::Point scrollOffset(mX.AdjustDisplacement(cssDisplacement.x, - cssOverscroll.x), - mY.AdjustDisplacement(cssDisplacement.y, - cssOverscroll.y)); + CSSPoint allowedDisplacement(mX.AdjustDisplacement(cssDisplacement.x, + cssOverscroll.x), + mY.AdjustDisplacement(cssDisplacement.y, + cssOverscroll.y)); overscroll = cssOverscroll * zoom; - if (fabs(scrollOffset.x) > EPSILON || fabs(scrollOffset.y) > EPSILON) { - ScrollBy(CSSPoint::FromUnknownPoint(scrollOffset)); + if (!IsZero(allowedDisplacement)) { + ScrollBy(allowedDisplacement); ScheduleComposite(); TimeDuration timePaintDelta = mPaintThrottler.TimeSinceLastRequest(GetFrameTime()); if (timePaintDelta.ToMilliseconds() > gPanRepaintInterval) { RequestContentRepaint(); } UpdateSharedCompositorFrameMetrics(); } } - if (fabs(overscroll.x) > EPSILON || fabs(overscroll.y) > EPSILON) { + if (!IsZero(overscroll)) { // "+ overscroll" rather than "- overscroll" because "overscroll" is what's // left of "displacement", and "displacement" is "start - end". CallDispatchScroll(aEndPoint + overscroll, aEndPoint, aOverscrollHandoffChainIndex + 1); } } void AsyncPanZoomController::CallDispatchScroll(const ScreenPoint& aStartPoint, const ScreenPoint& aEndPoint, uint32_t aOverscrollHandoffChainIndex) { // Make a local copy of the tree manager pointer and check if it's not - // null before calling HandleOverscroll(). This is necessary because + // null before calling DispatchScroll(). This is necessary because // Destroy(), which nulls out mTreeManager, could be called concurrently. APZCTreeManager* treeManagerLocal = mTreeManager; if (treeManagerLocal) { treeManagerLocal->DispatchScroll(this, aStartPoint, aEndPoint, aOverscrollHandoffChainIndex); } } @@ -1247,22 +1255,22 @@ bool FlingAnimation::Sample(FrameMetrics return false; } CSSPoint overscroll; // overscroll is ignored for flings ScreenPoint offset(aDelta.ToMilliseconds() * mX.GetVelocity(), aDelta.ToMilliseconds() * mY.GetVelocity()); // Inversely scale the offset by the resolution (when you're zoomed further in, - // a larger swipe should move you a shorter distance). + // the same swipe should move you a shorter distance). CSSPoint cssOffset = offset / aFrameMetrics.mZoom; - aFrameMetrics.mScrollOffset += CSSPoint::FromUnknownPoint(gfx::Point( + aFrameMetrics.mScrollOffset += CSSPoint( mX.AdjustDisplacement(cssOffset.x, overscroll.x), mY.AdjustDisplacement(cssOffset.y, overscroll.y) - )); + ); return true; } void AsyncPanZoomController::StartAnimation(AsyncPanZoomAnimation* aAnimation) { ReentrantMonitorAutoEnter lock(mMonitor); mAnimation = aAnimation;