Closed Bug 993525 (apz-css-transforms) Opened 11 years ago Closed 10 years ago

[meta] Make APZ play nicely with CSS transforms

Categories

(Core :: Panning and Zooming, defect)

All
Gonk (Firefox OS)
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: kats, Assigned: botond)

References

Details

(Keywords: meta)

Although we have consider CSS transforms interacting with APZ in some areas of the code, it seems to be mostly ad-hoc and not well defined. I think we need to spend some time thinking about an overall design for how this should work, and make sure everybody understands it.
When working on this bug, please note the comment in ClientTiledThebesLayer::BeginPaint() [1] that says: // Note that below we use GetZoomToParent() in a number of places. Because this // code runs on the client side, the mTransformScale field of the FrameMetrics // will not have been set. This can result in incorrect values being returned // by GetZoomToParent() when we have CSS transforms set on some of these layers. // This code should be audited and updated as part of fixing bug 993525. [1] http://mxr.mozilla.org/mozilla-central/source/gfx/layers/client/ClientTiledThebesLayer.cpp?rev=e26cfd8267fa#145
No longer blocks: 1035598
No longer blocks: 989403
Alias: apz-css-transforms
Assignee: nobody → botond
No longer blocks: 1027633
Depends on: 1066259
After a lot of thinking, trying things out, and discussions, I've identified three deficiencies in the handling of CSS transforms (and particularly, of the resolutions they induce) by APZ and Layout: 1) The resolution induced by a CSS scale transform on a scrollable layer or any ancestor layer thereof (henceforth, "css-driven resolution") is not taken into account by anything in the FrameMetrics of that scrollable layer. In particular, I believe it should be included in FrameMetrics::mCumulativeResolution. 2) In cases where Layout chooses to paint a scrollable layer at a resolution different from the scale of a CSS transform on that layer, the additional scale (i.e. the portion of the transform:scale which is not already reflected in the resolution) is not taken into account by anything in the FrameMetrics of that scrollable layer. Taking this into account wouldn't be very straightforward, because the relevant information is not readily accessible in ComputeFrameMetrics(). However, I've identified that this scenario only happens when we build a container layer for the scroll frame; it doesn't happen with containerless scrolling. Since multi-layer-apz (bug 967844), we've been during containerless scrolling for scroll frames that are not root scroll frames. Since we're planning to switch to containerless scrolling for root scroll frames as well, I'm going to treat that as the fix for this issue. 3) APZ code assumes that the resolution at which a layer is painted has the same x- and y- components, and accordingly the various scales it maintains that can include a resolution (for example, FrameMetrics::mCumulativeResolution) are just a single number. We need to modify these scales to accomodate different x- and y-scales. I'm going to fix this bug in three stages, each fixing one of the above problems. Stage 2 will require some Layout-side changes, for which I'll need Timothy's help.
Blocks: 1052474
No longer depends on: 1052474
No longer blocks: 1055741
Depends on: apz-css-trans-stage1
No longer depends on: 1066259
I'm going to mark this bug as fixed, since all three stages have landed and stuck.
Status: NEW → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.