void Axis::OverscrollBy(CSSCoord aOverscroll) { MOZ_ASSERT(CanScroll()); aOverscroll = ApplyResistance(aOverscroll); if (aOverscroll > 0) { #ifdef DEBUG if (!FuzzyEqualsAdditive(GetCompositionEnd().value, GetPageEnd().value, COORDINATE_EPSILON)) { nsPrintfCString message("composition end (%f) is not within COORDINATE_EPISLON of page end (%f)\n", GetCompositionEnd().value, GetPageEnd().value); NS_ASSERTION(false, message.get()); MOZ_CRASH(); } #endif MOZ_ASSERT(mOverscroll >= 0); } else if (aOverscroll < 0) { #ifdef DEBUG if (!FuzzyEqualsAdditive(GetOrigin().value, GetPageStart().value, COORDINATE_EPSILON)) { nsPrintfCString message("composition origin (%f) is not within COORDINATE_EPISLON of page origin (%f)\n", GetOrigin().value, GetPageStart().value); NS_ASSERTION(false, message.get()); MOZ_CRASH(); } #endif MOZ_ASSERT(mOverscroll <= 0); } mOverscroll += aOverscroll; }
bool ClientTiledPaintedLayer::IsScrollingOnCompositor(const FrameMetrics& aParentMetrics) { CompositorChild* compositor = nullptr; if (Manager() && Manager()->AsClientLayerManager()) { compositor = Manager()->AsClientLayerManager()->GetCompositorChild(); } if (!compositor) { return false; } FrameMetrics compositorMetrics; if (!compositor->LookupCompositorFrameMetrics(aParentMetrics.GetScrollId(), compositorMetrics)) { return false; } // 1 is a tad high for a fuzzy equals epsilon however if our scroll delta // is so small then we have nothing to gain from using paint heuristics. float COORDINATE_EPSILON = 1.f; return !FuzzyEqualsAdditive(compositorMetrics.GetScrollOffset().x, aParentMetrics.GetScrollOffset().x, COORDINATE_EPSILON) || !FuzzyEqualsAdditive(compositorMetrics.GetScrollOffset().y, aParentMetrics.GetScrollOffset().y, COORDINATE_EPSILON); }
void Axis::OverscrollBy(CSSCoord aOverscroll) { MOZ_ASSERT(CanScroll()); aOverscroll = ApplyResistance(aOverscroll); if (aOverscroll > 0) { MOZ_ASSERT(FuzzyEqualsAdditive(GetCompositionEnd().value, GetPageEnd().value, COORDINATE_EPSILON)); MOZ_ASSERT(mOverscroll >= 0); } else if (aOverscroll < 0) { MOZ_ASSERT(FuzzyEqualsAdditive(GetOrigin().value, GetPageStart().value, COORDINATE_EPSILON)); MOZ_ASSERT(mOverscroll <= 0); } mOverscroll += aOverscroll; }
SplineConstants() { const float kStartTension = 0.5f; const float kEndTension = 1.0f; const float kP1 = kStartTension * GetInflexion(); const float kP2 = 1.0f - kEndTension * (1.0f - GetInflexion()); float xMin = 0.0f; for (int i = 0; i < kNumSamples; i++) { const float alpha = static_cast<float>(i) / kNumSamples; float xMax = 1.0f; float x, tx, coef; // While the inflexion can be overridden by the user, it's clamped to // [0,1]. For values in this range, the approximation algorithm below // should converge in < 20 iterations. For good measure, we impose an // iteration limit as well. static const int sIterationLimit = 100; int iterations = 0; while (iterations++ < sIterationLimit) { x = xMin + (xMax - xMin) / 2.0f; coef = 3.0f * x * (1.0f - x); tx = coef * ((1.0f - x) * kP1 + x * kP2) + x * x * x; if (FuzzyEqualsAdditive(tx, alpha)) { break; } if (tx > alpha) { xMax = x; } else { xMin = x; } } mSplinePositions[i] = coef * ((1.0f - x) * kStartTension + x) + x * x * x; } mSplinePositions[kNumSamples] = 1.0f; }
void Axis::OverscrollBy(ParentLayerCoord aOverscroll) { MOZ_ASSERT(CanScroll()); // We can get some spurious calls to OverscrollBy() with near-zero values // due to rounding error. Ignore those (they might trip the asserts below.) if (FuzzyEqualsAdditive(aOverscroll.value, 0.0f, COORDINATE_EPSILON)) { return; } EndOverscrollAnimation(); aOverscroll = ApplyResistance(aOverscroll); if (aOverscroll > 0) { #ifdef DEBUG if (!FuzzyEqualsCoordinate(GetCompositionEnd().value, GetPageEnd().value)) { nsPrintfCString message("composition end (%f) is not equal (within error) to page end (%f)\n", GetCompositionEnd().value, GetPageEnd().value); NS_ASSERTION(false, message.get()); MOZ_CRASH("GFX: Overscroll issue > 0"); } #endif MOZ_ASSERT(mOverscroll >= 0); } else if (aOverscroll < 0) { #ifdef DEBUG if (!FuzzyEqualsCoordinate(GetOrigin().value, GetPageStart().value)) { nsPrintfCString message("composition origin (%f) is not equal (within error) to page origin (%f)\n", GetOrigin().value, GetPageStart().value); NS_ASSERTION(false, message.get()); MOZ_CRASH("GFX: Overscroll issue < 0"); } #endif MOZ_ASSERT(mOverscroll <= 0); } mOverscroll += aOverscroll; }
void AndroidFlingPhysics::Init(const ParentLayerPoint& aStartingVelocity, float aPLPPI) { mVelocity = aStartingVelocity.Length(); // We should not have created a fling animation if there is no velocity. MOZ_ASSERT(mVelocity != 0.0f); const double tuningCoeff = ComputeDeceleration(aPLPPI); mTargetDuration = ComputeFlingDuration(mVelocity, tuningCoeff); MOZ_ASSERT(!mTargetDuration.IsZero()); mDurationSoFar = TimeDuration(); mLastPos = ParentLayerPoint(); mCurrentPos = ParentLayerPoint(); float coeffX = mVelocity == 0 ? 1.0f : aStartingVelocity.x / mVelocity; float coeffY = mVelocity == 0 ? 1.0f : aStartingVelocity.y / mVelocity; mTargetDistance = ComputeFlingDistance(mVelocity, tuningCoeff); mTargetPos = ParentLayerPoint(mTargetDistance * coeffX, mTargetDistance * coeffY); const float hyp = mTargetPos.Length(); if (FuzzyEqualsAdditive(hyp, 0.0f)) { mDeltaNorm = ParentLayerPoint(1, 1); } else { mDeltaNorm = ParentLayerPoint(mTargetPos.x / hyp, mTargetPos.y / hyp); } }
bool FuzzyEqualsCoordinate(float aValue1, float aValue2) { return FuzzyEqualsAdditive(aValue1, aValue2, COORDINATE_EPSILON) || FuzzyEqualsMultiplicative(aValue1, aValue2); }