зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1737722. r=botond
Differential Revision: https://phabricator.services.mozilla.com/D145721
This commit is contained in:
Родитель
b88de56b32
Коммит
24843e3503
|
@ -12,6 +12,7 @@
|
||||||
#include "mozilla/webrender/WebRenderAPI.h"
|
#include "mozilla/webrender/WebRenderAPI.h"
|
||||||
#include "nsDebug.h" // for NS_ASSERTION
|
#include "nsDebug.h" // for NS_ASSERTION
|
||||||
#include "nsIXULRuntime.h" // for FissionAutostart
|
#include "nsIXULRuntime.h" // for FissionAutostart
|
||||||
|
#include "mozilla/gfx/Matrix.h"
|
||||||
|
|
||||||
#define APZCTM_LOG(...) \
|
#define APZCTM_LOG(...) \
|
||||||
MOZ_LOG(APZCTreeManager::sLog, LogLevel::Debug, (__VA_ARGS__))
|
MOZ_LOG(APZCTreeManager::sLog, LogLevel::Debug, (__VA_ARGS__))
|
||||||
|
@ -22,6 +23,53 @@ namespace layers {
|
||||||
using mozilla::gfx::CompositorHitTestFlags;
|
using mozilla::gfx::CompositorHitTestFlags;
|
||||||
using mozilla::gfx::CompositorHitTestInvisibleToHit;
|
using mozilla::gfx::CompositorHitTestInvisibleToHit;
|
||||||
|
|
||||||
|
static bool CheckCloseToIdentity(const gfx::Matrix4x4& aMatrix) {
|
||||||
|
// We allow a factor of 1/2048 in the multiply part of the matrix, so that if
|
||||||
|
// we multiply by a point on a screen of size 2048 we would be off by at most
|
||||||
|
// 1 pixel approximately.
|
||||||
|
const float multiplyEps = 1 / 2048.f;
|
||||||
|
// We allow 1 pixel in the translate part of the matrix.
|
||||||
|
const float translateEps = 1.f;
|
||||||
|
|
||||||
|
if (!FuzzyEqualsAdditive(aMatrix._11, 1.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._12, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._13, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._14, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._21, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._22, 1.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._23, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._24, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._31, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._32, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._33, 1.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._34, 0.f, multiplyEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._41, 0.f, translateEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._42, 0.f, translateEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._43, 0.f, translateEps) ||
|
||||||
|
!FuzzyEqualsAdditive(aMatrix._44, 1.f, multiplyEps)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks that within the constraints of floating point math we can invert it
|
||||||
|
// reasonably enough that multiplying by the computed inverse is close to the
|
||||||
|
// identity.
|
||||||
|
static bool CheckInvertibleWithFinitePrecision(const gfx::Matrix4x4& aMatrix) {
|
||||||
|
auto inverse = aMatrix.MaybeInverse();
|
||||||
|
if (inverse.isNothing()) {
|
||||||
|
// Should we return false?
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!CheckCloseToIdentity(aMatrix * *inverse)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!CheckCloseToIdentity(*inverse * aMatrix)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
IAPZHitTester::HitTestResult WRHitTester::GetAPZCAtPoint(
|
IAPZHitTester::HitTestResult WRHitTester::GetAPZCAtPoint(
|
||||||
const ScreenPoint& aHitTestPoint,
|
const ScreenPoint& aHitTestPoint,
|
||||||
const RecursiveMutexAutoLock& aProofOfTreeLock) {
|
const RecursiveMutexAutoLock& aProofOfTreeLock) {
|
||||||
|
@ -96,6 +144,19 @@ IAPZHitTester::HitTestResult WRHitTester::GetAPZCAtPoint(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CheckInvertibleWithFinitePrecision(
|
||||||
|
mTreeManager->GetScreenToApzcTransform(node->GetApzc())
|
||||||
|
.ToUnknownMatrix())) {
|
||||||
|
APZCTM_LOG("skipping due to check inverse accuracy\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!CheckInvertibleWithFinitePrecision(
|
||||||
|
mTreeManager->GetApzcToGeckoTransform(node->GetApzc())
|
||||||
|
.ToUnknownMatrix())) {
|
||||||
|
APZCTM_LOG("skipping due to check inverse accuracy\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
APZCTM_LOG("selecting as chosen result.\n");
|
APZCTM_LOG("selecting as chosen result.\n");
|
||||||
chosenResult = Some(result);
|
chosenResult = Some(result);
|
||||||
hit.mTargetApzc = node->GetApzc();
|
hit.mTargetApzc = node->GetApzc();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче