зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1148350
- Have ConvertToGecko use a live screen-to-apzc transform to avoid transform mismatches. r=botond
This commit is contained in:
Родитель
03de57ce9a
Коммит
87abd92743
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче