Bug 1148350 - Have ConvertToGecko use a live screen-to-apzc transform to avoid transform mismatches. r=botond

This commit is contained in:
Kartikaya Gupta 2015-04-30 14:30:38 -04:00
Родитель 03de57ce9a
Коммит 87abd92743
3 изменённых файлов: 16 добавлений и 15 удалений

Просмотреть файл

@ -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<LayoutDevicePixel>(transformToGecko, aPoint);
LayoutDevicePoint layoutPoint = TransformTo<LayoutDevicePixel>(
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<GeckoContentController> 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<GeckoContentController> 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());
}
}

Просмотреть файл

@ -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();

Просмотреть файл

@ -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);
}