Commit 5193e675 authored by simon.fraser@apple.com's avatar simon.fraser@apple.com
Browse files

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: http://svn.webkit.org/repository/webkit/trunk@155998 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent fe6bd743
2013-09-17 Simon Fraser <simon.fraser@apple.com>
Hardware accelerated CSS transitions appear pixelated when scaled up using transform
https://bugs.webkit.org/show_bug.cgi?id=27684
<rdar://problem/6134606>
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/iframe-no-layers-expected.txt:
* compositing/visible-rect/nested-transform-expected.txt:
* compositing/visible-rect/scrolled-expected.txt:
* platform/mac-wk2/compositing/visible-rect/iframe-no-layers-expected.txt: Removed.
* platform/mac-wk2/tiled-drawing/fixed-background/fixed-body-background-zoomed-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-coverage-after-scroll-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-coverage-after-scroll-speculative-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-coverage-scroll-to-bottom-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-coverage-slow-scrolling-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-coverage-speculative-expected.txt:
* platform/mac-wk2/tiled-drawing/tile-size-slow-zoomed-expected.txt:
* platform/mac-wk2/tiled-drawing/tiled-drawing-scroll-position-page-cache-restoration-expected.txt:
* platform/mac-wk2/tiled-drawing/tiled-drawing-zoom-expected.txt:
* platform/mac-wk2/tiled-drawing/tiled-drawing-zoom-scrolled-expected.txt:
* platform/mac-wk2/tiled-drawing/use-tiled-drawing-expected.txt:
* platform/mac/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants-expected.txt: Copied from LayoutTests/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants-expected.txt.
* platform/mac/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants2-expected.txt: Copied from LayoutTests/compositing/overflow/clipping-behaviour-change-is-not-propagated-to-descendants2-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.
2013-09-17 Commit Queue <commit-queue@webkit.org>
 
Unreviewed, rolling out r155977.
Box
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(position 18.00 10.00)
(anchor 0.00 0.00)
(bounds 100.00 100.00)
(contentsOpaque 1)
(drawsContent 1)
(transform [1.50 0.00 0.00 0.00] [0.00 1.50 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 100.00 x 100.00)
(contentsScale 3.00)
)
)
)
)
)
<!DOCTYPE html>
<html>
<head>
<style>
#box {
width: 100px;
height: 100px;
margin: 10px;
padding: 10px;
box-sizing: border-box;
background-color: silver;
-webkit-transform-origin: top left;
}
.animating {
-webkit-animation: scale 100000000s infinite linear;
}
@-webkit-keyframes scale {
from { -webkit-transform: scale(1.5); }
to { -webkit-transform: scale(3); }
}
</style>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
function dumpLayers()
{
if (window.internals)
document.getElementById('layers').innerText = internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS)
if (window.testRunner)
testRunner.notifyDone();
}
function doTest()
{
var box = document.getElementById('box');
box.addEventListener('webkitAnimationStart', dumpLayers, false);
box.classList.add('animating');
}
window.addEventListener('load', doTest, false);
</script>
</head>
<body>
<div id="box">Box</div>
<pre id="layers">Layer tree goes here when testing</pre>
</body>
</html>
Box
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(position 8.00 8.00)
(anchor 0.00 0.00)
(bounds 102.00 102.00)
(drawsContent 1)
(transform [2.00 0.00 0.00 0.00] [0.00 2.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 102.00 x 102.00)
(contentsScale 2.00)
(children 1
(GraphicsLayer
(position 11.00 11.00)
(bounds 100.00 100.00)
(contentsOpaque 1)
(drawsContent 1)
(visible rect 0.00, 0.00 100.00 x 100.00)
(contentsScale 2.00)
)
)
)
)
)
)
)
<!DOCTYPE html>
<html>
<head>
<style>
.container {
width: 100px;
height: 100px;
border: 1px solid black;
-webkit-transform: scale3d(2, 2, 1);
-webkit-transform-origin: top left;
}
.box {
width: 100px;
height: 100px;
margin: 10px;
padding: 10px;
box-sizing: border-box;
background-color: silver;
}
.composited {
-webkit-transform: translateZ(0);
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsText();
function doTest()
{
if (window.internals)
document.getElementById('layers').innerText = internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS)
}
window.addEventListener('load', doTest, false);
</script>
</head>
<body>
<div class="container">
<div class="composited box">Box</div>
</div>
<pre id="layers">Layer tree goes here when testing</pre>
</body>
</html>
Box
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(position 18.00 10.00)
(anchor 0.00 0.00)
(bounds 100.00 100.00)
(contentsOpaque 1)
(drawsContent 1)
(transform [2.00 0.00 0.00 0.00] [0.00 2.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 100.00 x 100.00)
(contentsScale 2.00)
)
)
)
)
)
<!DOCTYPE html>
<html>
<head>
<style>
.box {
width: 100px;
height: 100px;
margin: 10px;
padding: 10px;
box-sizing: border-box;
background-color: silver;
-webkit-transform: scale3d(2, 2, 1);
-webkit-transform-origin: top left;
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsText();
function doTest()
{
if (window.internals)
document.getElementById('layers').innerText = internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS)
}
window.addEventListener('load', doTest, false);
</script>
</head>
<body>
<div class="box">Box</div>
<pre id="layers">Layer tree goes here when testing</pre>
</body>
</html>
Box
Box
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(position 8.00 8.00)
(bounds 102.00 102.00)
(childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 -0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 102.00 x 102.00)
(contentsScale 1.00)
(children 1
(GraphicsLayer
(position 11.00 11.00)
(bounds 100.00 100.00)
(contentsOpaque 1)
(preserves3D 1)
(drawsContent 1)
(transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 100.00 1.00])
(visible rect 0.00, 0.00 100.00 x 100.00)
(contentsScale 1.25)
(children 1
(GraphicsLayer
(position 20.00 38.00)
(bounds 100.00 100.00)
(contentsOpaque 1)
(preserves3D 1)
(drawsContent 1)
(transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 100.00 1.00])
(visible rect 0.00, 0.00 100.00 x 100.00)
(contentsScale 1.67)
)
)
)
)
)
)
)
)
)
<!DOCTYPE html>
<html>
<head>
<style>
.container {
width: 100px;
height: 100px;
border: 1px solid black;
-webkit-perspective: 500px;
}
.box {
width: 100px;
height: 100px;
margin: 10px;
padding: 10px;
box-sizing: border-box;
background-color: silver;
-webkit-transform: translateZ(100px);
-webkit-transform-style: preserve-3d;
}
</style>
<script>
if (window.testRunner)
testRunner.dumpAsText();
function doTest()
{
if (window.internals)
document.getElementById('layers').innerText = internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS)
}
window.addEventListener('load', doTest, false);
</script>
</head>
<body>
<div class="container">
<div class="box">Box
<div class="box">Box</div>
</div>
</div>
<pre id="layers">Layer tree goes here when testing</pre>
</body>
</html>
......@@ -5,30 +5,25 @@ Text in the green box should stay visible.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 3
(GraphicsLayer
(position 8.00 96.00)
(bounds 22.00 22.00)
(drawsContent 1)
(visible rect 0.00, 0.00 22.00 x 22.00)
)
(GraphicsLayer
(position 8.00 86.00)
(bounds 102.00 20.00)
(drawsContent 1)
(visible rect 0.00, 0.00 102.00 x 20.00)
)
(GraphicsLayer
(position 0.00 87.00)
(bounds 787.00 18.00)
(drawsContent 1)
(visible rect 0.00, 0.00 787.00 x 18.00)
)
)
)
......
......@@ -5,30 +5,25 @@ Text in the green box should stay visible.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 3
(GraphicsLayer
(position 8.00 96.00)
(bounds 22.00 22.00)
(drawsContent 1)
(visible rect 0.00, 0.00 22.00 x 22.00)
)
(GraphicsLayer
(position 8.00 86.00)
(bounds 102.00 20.00)
(drawsContent 1)
(visible rect 0.00, 0.00 102.00 x 20.00)
)
(GraphicsLayer
(position 9.00 87.00)
(bounds 778.00 18.00)
(drawsContent 1)
(visible rect 0.00, 0.00 778.00 x 18.00)
)
)
)
......
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(position 8.00 8.00)
(bounds 502.00 202.00)
(visible rect 0.00, 0.00 502.00 x 202.00)
(children 1
(GraphicsLayer
(position 1.00 1.00)
(bounds 500.00 200.00)
(visible rect 0.00, 0.00 500.00 x 200.00)
(children 3
(GraphicsLayer
(bounds 200.00 200.00)
(contentsOpaque 1)
(transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [-100.00 0.00 0.00 1.00])
(visible rect 100.00, 0.00 100.00 x 200.00)
)
(GraphicsLayer
(bounds 200.00 200.00)
(contentsOpaque 1)
(transform [0.71 0.71 0.00 0.00] [-0.71 0.71 0.00 0.00] [0.00 0.00 1.00 0.00] [150.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 200.00 x 200.00)
)
(GraphicsLayer
(bounds 200.00 200.00)
(contentsOpaque 1)
(transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [400.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 100.00 x 200.00)
)
)
)
......
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 2
(GraphicsLayer
(position 18.00 10.00)
(bounds 204.00 204.00)
(visible rect 0.00, 0.00 204.00 x 204.00)
(children 1
(GraphicsLayer
(position 2.00 2.00)
(bounds 200.00 200.00)
(childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.07 0.07 1.00 -0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 200.00 x 200.00)
(children 1
(GraphicsLayer
(bounds 200.00 0.00)
(preserves3D 1)
(visible rect 0.00, 0.00 0.00 x 0.00)
(children 1
(GraphicsLayer
(bounds 300.00 300.00)
(contentsOpaque 1)
(transform [1.00 0.00 0.00 0.00] [0.00 0.91 0.42 0.00] [0.00 -0.42 0.91 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 213.67 x 200.68)
)
)
)
......@@ -38,24 +32,20 @@
(GraphicsLayer
(position 18.00 224.00)
(bounds 204.00 204.00)
(visible rect 0.00, 0.00 204.00 x 204.00)
(children 1
(GraphicsLayer
(position 2.00 2.00)
(bounds 200.00 200.00)
(childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.07 0.07 1.00 -0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 200.00 x 200.00)
(children 1
(GraphicsLayer
(bounds 200.00 0.00)
(preserves3D 1)
(visible rect 0.00, 0.00 0.00 x 0.00)
(children 1
(GraphicsLayer
(bounds 300.00 300.00)
(contentsOpaque 1)
(transform [0.91 0.00 0.42 0.00] [0.00 1.00 0.00 0.00] [-0.42 0.00 0.91 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 200.68 x 213.67)
)
)
)
......
(GraphicsLayer
(bounds 800.00 600.00)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 1
(GraphicsLayer
(bounds 800.00 600.00)
(contentsOpaque 1)
(visible rect 0.00, 0.00 800.00 x 600.00)
(children 2
(GraphicsLayer
(position 18.00 10.00)
(bounds 204.00 204.00)
(visible rect 0.00, 0.00 204.00 x 204.00)
(children 1
(GraphicsLayer
(position 2.00 2.00)
(bounds 200.00 200.00)
(childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.07 0.07 1.00 -0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 200.00 x 200.00)
(children 1
(GraphicsLayer
(anchor 0.20 0.20)
(bounds 500.00 500.00)
(contentsOpaque 1)
(transform [1.00 0.00 0.00 0.00] [0.00 0.71 0.71 0.00] [0.00 -0.71 0.71 0.00] [0.00 0.00 0.00 1.00])
(visible rect 0.00, 0.00 220.62 x 218.46)
)
)
)
......@@ -32,20 +27,17 @@
(GraphicsLayer
(position 18.00 224.00)
(bounds 204.00 204.00)
(visible rect 0.00, 0.00 204.00 x 204.00)
(children 1
(GraphicsLayer
(position 2.00 2.00)