Hardware accelerated CSS transitions appear pixelated when scaled up using transform
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 18:12:52 +0000 (18:12 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 18:12:52 +0000 (18:12 +0000)
commit45e9ca7fb53401abb01888c9f7d69cd314ba616e
treed22eb1120ee886b939485be28c2e352d05335404
parente860759f243f174f830d24aa037c7a0d89bb90cc
Hardware accelerated CSS transitions appear pixelated when scaled up using transform
https://bugs.webkit.org/show_bug.cgi?id=27684
<rdar://problem/6134606>

Source/WebCore:

Reviewed by Dean Jackson.

Take transforms and animations into account when computing the contentsScale
for a layer, so that scaled-up layers remain sharp most of the time.

In its recursiveCommitChanges() tree walk, GraphicsLayerCA now tracks
a root-relative transform, and extracts from that transform the X and Y
scales which it uses to scale the backing store.

If the layer has transform animations on it, we keep around
a transformation matrix for the animation endpoints (or keyframes),
pick up the state that has the larger impact on the root-relative scale,
and use that as the layer's transform, and the transform when recursing
over descendants.

Tests: compositing/contents-scale/animating.html
       compositing/contents-scale/scaled-ancestor.html
       compositing/contents-scale/simple-scale.html
       compositing/contents-scale/z-translate.html

* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::maxScaleFromTransform): Decompose the transform if necesssary
to extract the X and Y scale components.
(WebCore::GraphicsLayerCA::GraphicsLayerCA): Initialize m_rootRelativeScaleFactor.
(WebCore::GraphicsLayerCA::flushCompositingState): Supply a TransformationMatrix
for the root of the recursion.
(WebCore::GraphicsLayerCA::layerTransform): This code was factored out of
computeVisibleRect(), and optionally takes a custom transform.
(WebCore::GraphicsLayerCA::computeVisibleRect): Use the layerTransform() function.
(WebCore::GraphicsLayerCA::updateRootRelativeScale): Given a transform from the root,
find the max scale factor by multiplying the various animation endpoint matrices and picking
the one with the biggest impact on scale. Use this to set m_rootRelativeScaleFactor, and
set the flag to say that we need to update contentsScale.
(WebCore::GraphicsLayerCA::recursiveCommitChanges):
(WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers): After updating
animations, call updateRootRelativeScale() to update m_rootRelativeScaleFactor.
(WebCore::GraphicsLayerCA::updateAnimations): We have a side table of animation name to
TransformationMatrix, so figure out which entries can be removed from that side table,
and remove them.
(WebCore::GraphicsLayerCA::setAnimationOnLayer):
(WebCore::GraphicsLayerCA::appendToUncommittedAnimations): Store the matrices for
animation endpoints/keyframes in the m_animationTransforms side table. We don't store
them directly in LayerPropertyAnimation because we just want the final matrix for
a transform list, and using a side table makes ownership easier to manage.
(WebCore::GraphicsLayerCA::getTransformFromAnimationsWithMaxScaleImpact):
goes through the matrices for the running animation endpoints/keyframes, and
multiplies each with the transform up to this layer to find the matrix with the
larger impact on scale.
(WebCore::GraphicsLayerCA::setTransformAnimationEndpoints): Returns a vector
of TransformationMatrix for the from and to states.
(WebCore::GraphicsLayerCA::setTransformAnimationKeyframes): Returns a vector
of TransformationMatrix for the keyframes.
(WebCore::GraphicsLayerCA::updateContentsScale): Include m_rootRelativeScaleFactor in the
scale factor computation.
(WebCore::GraphicsLayerCA::dumpAdditionalProperties): If we're dumping visible rects,
also dump the contentsScale. Convenient at these are useful to look at together, and I didn't
want to pollute Internals with yet more flags.
* platform/graphics/ca/GraphicsLayerCA.h:
(WebCore::GraphicsLayerCA::LayerPropertyAnimation::LayerPropertyAnimation): Formatting.

LayoutTests:

Reviewed by Dean Jackson.

New tests that dump contentsScale under various scaling scenarios:

* compositing/contents-scale/animating-expected.txt: Added.
* compositing/contents-scale/animating.html: Added.
* compositing/contents-scale/scaled-ancestor-expected.txt: Added.
* compositing/contents-scale/scaled-ancestor.html: Added.
* compositing/contents-scale/simple-scale-expected.txt: Added.
* compositing/contents-scale/simple-scale.html: Added.
* compositing/contents-scale/z-translate-expected.txt: Added.
* compositing/contents-scale/z-translate.html: Added.

These tests had Mac-specific results (which include visible rects and now
contents scale) in the cross-platform directory, so cleaned up the cross-platform
results and moved the Mac results to platform-mac.

* compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants-expected.txt:
* compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants2-expected.txt:
* compositing/visible-rect/2d-transformed-expected.txt:
* compositing/visible-rect/3d-transform-style-expected.txt:
* compositing/visible-rect/3d-transformed-expected.txt:
* compositing/visible-rect/animated-expected.txt:
* compositing/visible-rect/animated-from-none-expected.txt:
* compositing/visible-rect/clipped-by-viewport-expected.txt:
* compositing/visible-rect/clipped-visible-rect-expected.txt:
* compositing/visible-rect/flipped-preserve-3d-expected.txt:
* compositing/visible-rect/iframe-and-layers-expected.txt:
* compositing/visible-rect/nested-transform-expected.txt:
* compositing/visible-rect/scrolled-expected.txt:
* platform/mac/compositing/tiling/rotated-tiled-clamped-expected.txt:
* platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt:
* platform/mac/compositing/tiling/tile-cache-zoomed-expected.txt:
* platform/mac/compositing/visible-rect/2d-transformed-expected.txt: Copied from LayoutTests/compositing/visible-rect/2d-transformed-expected.txt.
* platform/mac/compositing/visible-rect/3d-transform-style-expected.txt: Copied from LayoutTests/compositing/visible-rect/3d-transform-style-expected.txt.
* platform/mac/compositing/visible-rect/3d-transformed-expected.txt: Copied from LayoutTests/compositing/visible-rect/3d-transformed-expected.txt.
* platform/mac/compositing/visible-rect/animated-expected.txt: Copied from LayoutTests/compositing/visible-rect/animated-expected.txt.
* platform/mac/compositing/visible-rect/animated-from-none-expected.txt: Copied from LayoutTests/compositing/visible-rect/animated-from-none-expected.txt.
* platform/mac/compositing/visible-rect/clipped-by-viewport-expected.txt: Copied from LayoutTests/compositing/visible-rect/clipped-by-viewport-expected.txt.
* platform/mac/compositing/visible-rect/clipped-visible-rect-expected.txt: Copied from LayoutTests/compositing/visible-rect/clipped-visible-rect-expected.txt.
* platform/mac/compositing/visible-rect/flipped-preserve-3d-expected.txt: Copied from LayoutTests/compositing/visible-rect/flipped-preserve-3d-expected.txt.
* platform/mac/compositing/visible-rect/iframe-and-layers-expected.txt: Copied from LayoutTests/compositing/visible-rect/iframe-and-layers-expected.txt.
* platform/mac/compositing/visible-rect/iframe-no-layers-expected.txt:
* platform/mac/compositing/visible-rect/nested-transform-expected.txt: Copied from LayoutTests/compositing/visible-rect/nested-transform-expected.txt.
* platform/mac/compositing/visible-rect/scrolled-expected.txt: Copied from LayoutTests/compositing/visible-rect/scrolled-expected.txt.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155977 268f45cc-cd09-0410-ab3c-d52691b4dbfc
42 files changed:
LayoutTests/ChangeLog
LayoutTests/compositing/contents-scale/animating-expected.txt [new file with mode: 0644]
LayoutTests/compositing/contents-scale/animating.html [new file with mode: 0644]
LayoutTests/compositing/contents-scale/scaled-ancestor-expected.txt [new file with mode: 0644]
LayoutTests/compositing/contents-scale/scaled-ancestor.html [new file with mode: 0644]
LayoutTests/compositing/contents-scale/simple-scale-expected.txt [new file with mode: 0644]
LayoutTests/compositing/contents-scale/simple-scale.html [new file with mode: 0644]
LayoutTests/compositing/contents-scale/z-translate-expected.txt [new file with mode: 0644]
LayoutTests/compositing/contents-scale/z-translate.html [new file with mode: 0644]
LayoutTests/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants-expected.txt
LayoutTests/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants2-expected.txt
LayoutTests/compositing/visible-rect/2d-transformed-expected.txt
LayoutTests/compositing/visible-rect/3d-transform-style-expected.txt
LayoutTests/compositing/visible-rect/3d-transformed-expected.txt
LayoutTests/compositing/visible-rect/animated-expected.txt
LayoutTests/compositing/visible-rect/animated-from-none-expected.txt
LayoutTests/compositing/visible-rect/clipped-by-viewport-expected.txt
LayoutTests/compositing/visible-rect/clipped-visible-rect-expected.txt
LayoutTests/compositing/visible-rect/flipped-preserve-3d-expected.txt
LayoutTests/compositing/visible-rect/iframe-and-layers-expected.txt
LayoutTests/compositing/visible-rect/nested-transform-expected.txt
LayoutTests/compositing/visible-rect/scrolled-expected.txt
LayoutTests/platform/mac/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants2-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/tiling/rotated-tiled-clamped-expected.txt
LayoutTests/platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt
LayoutTests/platform/mac/compositing/tiling/tile-cache-zoomed-expected.txt
LayoutTests/platform/mac/compositing/visible-rect/2d-transformed-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/3d-transform-style-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/3d-transformed-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/animated-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/animated-from-none-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/clipped-by-viewport-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/clipped-visible-rect-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/flipped-preserve-3d-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/iframe-and-layers-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/iframe-no-layers-expected.txt
LayoutTests/platform/mac/compositing/visible-rect/nested-transform-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/compositing/visible-rect/scrolled-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp
Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h