author | Kartikaya Gupta <kgupta@mozilla.com> |
Wed, 01 Oct 2014 17:49:31 -0400 | |
changeset 208307 | 0b4ff0427b865e41e57139f1562a4a15eb4d56d1 |
parent 208306 | 1c4d997e2260f1e6b972cfdd97dc93425c32fb78 |
child 208308 | 66ad106fcb6896d1399acbaa7fb1c076624d7bae |
push id | 49892 |
push user | kgupta@mozilla.com |
push date | Thu, 02 Oct 2014 01:08:11 +0000 |
treeherder | mozilla-inbound@0b4ff0427b86 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | botond |
bugs | 1043859 |
milestone | 35.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/composite/AsyncCompositionManager.cpp +++ b/gfx/layers/composite/AsyncCompositionManager.cpp @@ -727,25 +727,33 @@ ApplyAsyncTransformToScrollbarForContent Matrix4x4 transform = scrollbarTransform * aScrollbar->GetTransform(); if (aScrollbarIsDescendant) { // If the scrollbar layer is a child of the content it is a scrollbar for, then we // need to do an extra untransform to cancel out the transient async transform on // the content. This is needed because otherwise that transient async transform is // part of the effective transform of this scrollbar, and the scrollbar will jitter // as the content scrolls. - Matrix4x4 transientUntransform = transientTransform.Inverse(); - transform = transform * transientUntransform; + // Since the async transform is applied on top of the content's regular + // transform, we need to make sure to unapply the async transform in the + // same coordinate space. This requires applying the content transform and + // then unapplying it after unapplying the async transform. + Matrix4x4 asyncUntransform = (asyncTransform * apzc->GetOverscrollTransform()).Inverse(); + Matrix4x4 contentTransform = aContent.GetTransform(); + Matrix4x4 contentUntransform = contentTransform.Inverse(); + + Matrix4x4 compensation = contentTransform * asyncUntransform * contentUntransform; + transform = transform * compensation; // We also need to make a corresponding change on the clip rect of all the // layers on the ancestor chain from the scrollbar layer up to but not // including the layer with the async transform. Otherwise the scrollbar // shifts but gets clipped and so appears to flicker. for (Layer* ancestor = aScrollbar; ancestor != aContent.GetLayer(); ancestor = ancestor->GetParent()) { - TransformClipRect(ancestor, transientUntransform); + TransformClipRect(ancestor, compensation); } } // GetTransform already takes the pre- and post-scale into account. Since we // will apply the pre- and post-scale again when computing the effective // transform, we must apply the inverses here. if (ContainerLayer* container = aScrollbar->AsContainerLayer()) { transform.Scale(1.0f/container->GetPreXScale(),