From 87abd9274340f77a6af8e4dc4a6d375455416369 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Thu, 30 Apr 2015 14:30:38 -0400 Subject: [PATCH] Bug 1148350 - Have ConvertToGecko use a live screen-to-apzc transform to avoid transform mismatches. r=botond --- gfx/layers/apz/src/AsyncPanZoomController.cpp | 19 +++++++++++-------- gfx/layers/apz/src/AsyncPanZoomController.h | 8 ++++---- gfx/layers/apz/src/GestureEventListener.cpp | 4 +--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp index cbdb2e9179c8..1705e83afc7f 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -1395,13 +1395,16 @@ nsEventStatus AsyncPanZoomController::OnScaleEnd(const PinchGestureInput& aEvent } bool -AsyncPanZoomController::ConvertToGecko(const ParentLayerPoint& aPoint, CSSPoint* aOut) +AsyncPanZoomController::ConvertToGecko(const ScreenIntPoint& aPoint, CSSPoint* aOut) { if (APZCTreeManager* treeManagerLocal = GetApzcTreeManager()) { + Matrix4x4 transformToApzc = treeManagerLocal->GetScreenToApzcTransform(this); Matrix4x4 transformToGecko = treeManagerLocal->GetApzcToGeckoTransform(this); // NOTE: This isn't *quite* LayoutDevicePoint, we just don't have a name // for this coordinate space and it maps the closest to LayoutDevicePoint. - LayoutDevicePoint layoutPoint = TransformTo(transformToGecko, aPoint); + LayoutDevicePoint layoutPoint = TransformTo( + transformToApzc * transformToGecko, aPoint); + { // scoped lock to access mFrameMetrics ReentrantMonitorAutoEnter lock(mMonitor); *aOut = layoutPoint / mFrameMetrics.GetDevPixelsPerCSSPixel(); @@ -1732,7 +1735,7 @@ nsEventStatus AsyncPanZoomController::OnLongPress(const TapGestureInput& aEvent) nsRefPtr controller = GetGeckoContentController(); if (controller) { CSSPoint geckoScreenPoint; - if (ConvertToGecko(aEvent.mLocalPoint, &geckoScreenPoint)) { + if (ConvertToGecko(aEvent.mPoint, &geckoScreenPoint)) { if (CurrentTouchBlock()->IsDuringFastMotion()) { APZC_LOG("%p dropping long-press because of fast motion\n", this); return nsEventStatus_eIgnore; @@ -1747,10 +1750,10 @@ nsEventStatus AsyncPanZoomController::OnLongPress(const TapGestureInput& aEvent) nsEventStatus AsyncPanZoomController::OnLongPressUp(const TapGestureInput& aEvent) { APZC_LOG("%p got a long-tap-up in state %d\n", this, mState); - return GenerateSingleTap(aEvent.mLocalPoint, aEvent.modifiers); + return GenerateSingleTap(aEvent.mPoint, aEvent.modifiers); } -nsEventStatus AsyncPanZoomController::GenerateSingleTap(const ParentLayerPoint& aPoint, mozilla::Modifiers aModifiers) { +nsEventStatus AsyncPanZoomController::GenerateSingleTap(const ScreenIntPoint& aPoint, mozilla::Modifiers aModifiers) { nsRefPtr controller = GetGeckoContentController(); if (controller) { CSSPoint geckoScreenPoint; @@ -1786,14 +1789,14 @@ nsEventStatus AsyncPanZoomController::OnSingleTapUp(const TapGestureInput& aEven // If mZoomConstraints.mAllowDoubleTapZoom is true we wait for a call to OnSingleTapConfirmed before // sending event to content if (!(mZoomConstraints.mAllowDoubleTapZoom && CurrentTouchBlock()->TouchActionAllowsDoubleTapZoom())) { - return GenerateSingleTap(aEvent.mLocalPoint, aEvent.modifiers); + return GenerateSingleTap(aEvent.mPoint, aEvent.modifiers); } return nsEventStatus_eIgnore; } nsEventStatus AsyncPanZoomController::OnSingleTapConfirmed(const TapGestureInput& aEvent) { APZC_LOG("%p got a single-tap-confirmed in state %d\n", this, mState); - return GenerateSingleTap(aEvent.mLocalPoint, aEvent.modifiers); + return GenerateSingleTap(aEvent.mPoint, aEvent.modifiers); } nsEventStatus AsyncPanZoomController::OnDoubleTap(const TapGestureInput& aEvent) { @@ -1802,7 +1805,7 @@ nsEventStatus AsyncPanZoomController::OnDoubleTap(const TapGestureInput& aEvent) if (controller) { if (mZoomConstraints.mAllowDoubleTapZoom && CurrentTouchBlock()->TouchActionAllowsDoubleTapZoom()) { CSSPoint geckoScreenPoint; - if (ConvertToGecko(aEvent.mLocalPoint, &geckoScreenPoint)) { + if (ConvertToGecko(aEvent.mPoint, &geckoScreenPoint)) { controller->HandleDoubleTap(geckoScreenPoint, aEvent.modifiers, GetGuid()); } } diff --git a/gfx/layers/apz/src/AsyncPanZoomController.h b/gfx/layers/apz/src/AsyncPanZoomController.h index b8a8f1d000d3..654c8578adac 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.h +++ b/gfx/layers/apz/src/AsyncPanZoomController.h @@ -607,12 +607,12 @@ protected: void FireAsyncScrollOnTimeout(); /** - * Convert ScreenPoint relative to this APZC to CSSPoint relative + * Convert ScreenPoint relative to the screen to CSSPoint relative * to the parent document. This excludes the transient compositor transform. * NOTE: This must be converted to CSSPoint relative to the child - * document before sending over IPC. + * document before sending over IPC to a child process. */ - bool ConvertToGecko(const ParentLayerPoint& aPoint, CSSPoint* aOut); + bool ConvertToGecko(const ScreenIntPoint& aPoint, CSSPoint* aOut); enum AxisLockMode { FREE, /* No locking at all */ @@ -623,7 +623,7 @@ protected: static AxisLockMode GetAxisLockMode(); // Helper function for OnSingleTapUp() and OnSingleTapConfirmed(). - nsEventStatus GenerateSingleTap(const ParentLayerPoint& aPoint, mozilla::Modifiers aModifiers); + nsEventStatus GenerateSingleTap(const ScreenIntPoint& aPoint, mozilla::Modifiers aModifiers); // Common processing at the end of a touch block. void OnTouchEndOrCancel(); diff --git a/gfx/layers/apz/src/GestureEventListener.cpp b/gfx/layers/apz/src/GestureEventListener.cpp index 71b0e8859b40..024c92287584 100644 --- a/gfx/layers/apz/src/GestureEventListener.cpp +++ b/gfx/layers/apz/src/GestureEventListener.cpp @@ -55,9 +55,7 @@ TapGestureInput CreateTapEvent(const MultiTouchInput& aTouch, TapGestureInput::T return TapGestureInput(aType, aTouch.mTime, aTouch.mTimeStamp, - // Use mLocalScreenPoint as this goes directly to APZC - // without being transformed in APZCTreeManager. - aTouch.mTouches[0].mLocalScreenPoint, + aTouch.mTouches[0].mScreenPoint, aTouch.modifiers); }