Bug 1202050 - Use UntransformTo in a few more places in APZ code. r=botond

We previously believed these matrices could only be 2D, but it turns out
they can potentially be 3D projective transforms, so we need to use
UntransformTo() when applying them.

The patch also removes the unused function APZCTreeManager::TransformCoordinateToGecko().

--HG--
extra : rebase_source : e73862963df275036f35272b688f65c271ca659a
extra : source : b04cab83c7f061b9b934d30f7e5adb831206972e
This commit is contained in:
Kevin Wern 2015-10-05 11:47:01 -04:00
Родитель 0d21d8c3b8
Коммит 98513a1124
3 изменённых файлов: 49 добавлений и 48 удалений

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

@ -680,10 +680,13 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// gecko space should only consist of overscroll-cancelling transforms.
Matrix4x4 transformToGecko = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
MOZ_ASSERT(transformToGecko.Is2D());
ScreenPoint untransformedOrigin = TransformTo<ScreenPixel>(
Maybe<ScreenPoint> untransformedOrigin = UntransformTo<ScreenPixel>(
transformToGecko, wheelInput.mOrigin);
if (!untransformedOrigin) {
return result;
}
result = mInputQueue->ReceiveInputEvent(
apzc,
/* aTargetConfirmed = */ hitResult == HitLayer,
@ -691,7 +694,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// Update the out-parameters so they are what the caller expects.
apzc->GetGuid(aOutTargetGuid);
wheelInput.mOrigin = untransformedOrigin;
wheelInput.mOrigin = *untransformedOrigin;
}
break;
} case PANGESTURE_INPUT: {
@ -717,12 +720,15 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// gecko space should only consist of overscroll-cancelling transforms.
Matrix4x4 transformToGecko = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
MOZ_ASSERT(transformToGecko.Is2D());
ScreenPoint untransformedStartPoint = TransformTo<ScreenPixel>(
Maybe<ScreenPoint> untransformedStartPoint = UntransformTo<ScreenPixel>(
transformToGecko, panInput.mPanStartPoint);
ScreenPoint untransformedDisplacement = TransformVector<ScreenPixel>(
Maybe<ScreenPoint> untransformedDisplacement = UntransformVector<ScreenPixel>(
transformToGecko, panInput.mPanDisplacement, panInput.mPanStartPoint);
if (!untransformedStartPoint || !untransformedDisplacement) {
return result;
}
result = mInputQueue->ReceiveInputEvent(
apzc,
/* aTargetConfirmed = */ hitResult == HitLayer,
@ -730,8 +736,8 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// Update the out-parameters so they are what the caller expects.
apzc->GetGuid(aOutTargetGuid);
panInput.mPanStartPoint = untransformedStartPoint;
panInput.mPanDisplacement = untransformedDisplacement;
panInput.mPanStartPoint = *untransformedStartPoint;
panInput.mPanDisplacement = *untransformedDisplacement;
}
break;
} case PINCHGESTURE_INPUT: { // note: no one currently sends these
@ -741,6 +747,15 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
if (apzc) {
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
Matrix4x4 outTransform = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
Maybe<ScreenPoint> untransformedFocusPoint = UntransformTo<ScreenPixel>(
outTransform, pinchInput.mFocusPoint);
if (!untransformedFocusPoint) {
return result;
}
result = mInputQueue->ReceiveInputEvent(
apzc,
/* aTargetConfirmed = */ hitResult == HitLayer,
@ -748,11 +763,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// Update the out-parameters so they are what the caller expects.
apzc->GetGuid(aOutTargetGuid);
Matrix4x4 outTransform = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
MOZ_ASSERT(outTransform.Is2D());
pinchInput.mFocusPoint = TransformTo<ScreenPixel>(
outTransform, pinchInput.mFocusPoint);
pinchInput.mFocusPoint = *untransformedFocusPoint;
}
break;
} case TAPGESTURE_INPUT: { // note: no one currently sends these
@ -762,6 +773,15 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
if (apzc) {
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
Matrix4x4 outTransform = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
Maybe<ScreenIntPoint> untransformedPoint =
UntransformTo<ScreenPixel>(outTransform, tapInput.mPoint);
if (!untransformedPoint) {
return result;
}
result = mInputQueue->ReceiveInputEvent(
apzc,
/* aTargetConfirmed = */ hitResult == HitLayer,
@ -769,10 +789,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
// Update the out-parameters so they are what the caller expects.
apzc->GetGuid(aOutTargetGuid);
Matrix4x4 outTransform = GetScreenToApzcTransform(apzc)
* GetApzcToGeckoTransform(apzc);
MOZ_ASSERT(outTransform.Is2D());
tapInput.mPoint = TransformTo<ScreenPixel>(outTransform, tapInput.mPoint);
tapInput.mPoint = *untransformedPoint;
}
break;
}
@ -864,12 +881,15 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
Matrix4x4 transformToApzc = GetScreenToApzcTransform(mApzcForInputBlock);
Matrix4x4 transformToGecko = GetApzcToGeckoTransform(mApzcForInputBlock);
Matrix4x4 outTransform = transformToApzc * transformToGecko;
MOZ_ASSERT(outTransform.Is2D());
for (size_t i = 0; i < aInput.mTouches.Length(); i++) {
SingleTouchData& touchData = aInput.mTouches[i];
touchData.mScreenPoint = TransformTo<ScreenPixel>(
Maybe<ScreenIntPoint> untransformedScreenPoint = UntransformTo<ScreenPixel>(
outTransform, touchData.mScreenPoint);
if (!untransformedScreenPoint) {
return nsEventStatus_eIgnore;
}
touchData.mScreenPoint = *untransformedScreenPoint;
}
}
@ -886,21 +906,6 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
return result;
}
void
APZCTreeManager::TransformCoordinateToGecko(const ScreenIntPoint& aPoint,
LayoutDeviceIntPoint* aOutTransformedPoint)
{
MOZ_ASSERT(aOutTransformedPoint);
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(aPoint, nullptr);
if (apzc && aOutTransformedPoint) {
Matrix4x4 transformToApzc = GetScreenToApzcTransform(apzc);
Matrix4x4 transformToGecko = GetApzcToGeckoTransform(apzc);
Matrix4x4 outTransform = transformToApzc * transformToGecko;
MOZ_ASSERT(outTransform.Is2D());
*aOutTransformedPoint = TransformTo<LayoutDevicePixel>(outTransform, aPoint);
}
}
void
APZCTreeManager::UpdateWheelTransaction(WidgetInputEvent& aEvent)
{
@ -966,8 +971,11 @@ APZCTreeManager::ProcessEvent(WidgetInputEvent& aEvent,
Matrix4x4 transformToApzc = GetScreenToApzcTransform(apzc);
Matrix4x4 transformToGecko = GetApzcToGeckoTransform(apzc);
Matrix4x4 outTransform = transformToApzc * transformToGecko;
MOZ_ASSERT(outTransform.Is2D());
aEvent.refPoint = TransformTo<LayoutDevicePixel>(outTransform, aEvent.refPoint);
Maybe<LayoutDeviceIntPoint> untransformedRefPoint =
UntransformTo<LayoutDevicePixel>(outTransform, aEvent.refPoint);
if (untransformedRefPoint) {
aEvent.refPoint = *untransformedRefPoint;
}
}
return result;
}

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

@ -209,15 +209,6 @@ public:
ScrollableLayerGuid* aOutTargetGuid,
uint64_t* aOutInputBlockId);
/**
* A helper for transforming coordinates to gecko coordinate space.
*
* @param aPoint point to transform
* @param aOutTransformedPoint resulting transformed point
*/
void TransformCoordinateToGecko(const ScreenIntPoint& aPoint,
LayoutDeviceIntPoint* aOutTransformedPoint);
/**
* Kicks an animation to zoom to a rect. This may be either a zoom out or zoom
* in. The actual animation is done on the compositor thread after being set

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

@ -1422,13 +1422,15 @@ AsyncPanZoomController::ConvertToGecko(const ScreenIntPoint& aPoint, CSSPoint* a
// NOTE: This isn't *quite* LayoutDevicePoint, we just don't have a name
// for this coordinate space and it maps the closest to LayoutDevicePoint.
MOZ_ASSERT(transformScreenToGecko.Is2D());
LayoutDevicePoint layoutPoint = TransformTo<LayoutDevicePixel>(
Maybe<LayoutDeviceIntPoint> layoutPoint = UntransformTo<LayoutDevicePixel>(
transformScreenToGecko, aPoint);
if (!layoutPoint) {
return false;
}
{ // scoped lock to access mFrameMetrics
ReentrantMonitorAutoEnter lock(mMonitor);
*aOut = layoutPoint / mFrameMetrics.GetDevPixelsPerCSSPixel();
*aOut = LayoutDevicePoint(*layoutPoint) / mFrameMetrics.GetDevPixelsPerCSSPixel();
}
return true;
}