зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1346777 - Transform layer geometry properly when intermediate surface is used r=mattwoodrow
MozReview-Commit-ID: H3YmadD8sFz --HG-- extra : rebase_source : 8bd9f9b58d8e50fd925299fec6fc464ee50886c0
This commit is contained in:
Родитель
4e87a68ced
Коммит
6e4add711b
|
@ -108,10 +108,6 @@ SelectLayerGeometry(const Maybe<gfx::Polygon>& aParentGeometry,
|
|||
{
|
||||
// Both the parent and the child layer were split.
|
||||
if (aParentGeometry && aChildGeometry) {
|
||||
// As we use intermediate surface in these cases, this branch should never
|
||||
// get executed.
|
||||
MOZ_ASSERT(false,
|
||||
"Both parent and child geometry present in nested 3D context!");
|
||||
return Some(aParentGeometry->ClipPolygon(*aChildGeometry));
|
||||
}
|
||||
|
||||
|
@ -453,12 +449,16 @@ RenderLayers(ContainerT* aContainer, LayerManagerComposite* aManager,
|
|||
layerToRender->SetClearRect(gfx::IntRect(0, 0, 0, 0));
|
||||
}
|
||||
} else {
|
||||
// Since we force an intermediate surface for nested 3D contexts,
|
||||
// aGeometry and childGeometry are both in the same coordinate space.
|
||||
Maybe<gfx::Polygon> geometry =
|
||||
SelectLayerGeometry(aGeometry, childGeometry);
|
||||
|
||||
// If we are dealing with a nested 3D context, we might need to transform
|
||||
// the geometry to the coordinate space of the parent 3D context leaf.
|
||||
const bool isLeafLayer = layer->AsContainerLayer() == nullptr;
|
||||
// the geometry back to the coordinate space of the current layer before
|
||||
// rendering the layer.
|
||||
ContainerLayer* container = layer->AsContainerLayer();
|
||||
const bool isLeafLayer = !container || container->UseIntermediateSurface();
|
||||
|
||||
if (geometry && isLeafLayer) {
|
||||
TransformLayerGeometry(layer, geometry);
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style type="text/css">
|
||||
|
||||
div {
|
||||
position: absolute;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.opacity {
|
||||
opacity: 0.99;
|
||||
}
|
||||
|
||||
.green {
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
.red {
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.translate {
|
||||
transform: translateX(100px);
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="red"></div>
|
||||
<div class="green">
|
||||
<div class="translate opacity green">
|
||||
<div class="translate green"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style type="text/css">
|
||||
|
||||
div {
|
||||
position: absolute;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.opacity {
|
||||
opacity: 0.99;
|
||||
}
|
||||
|
||||
.green {
|
||||
transform-style: preserve-3d;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
.flat {
|
||||
transform: translateZ(0px);
|
||||
}
|
||||
|
||||
.red {
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.translate {
|
||||
transform: translateX(100px);
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="red"></div>
|
||||
<div class="green">
|
||||
<div class="flat">
|
||||
<div class="translate opacity green">
|
||||
<div class="translate green"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -88,3 +88,4 @@ fuzzy(255,100) fails-if(webrender) == split-non-ortho1.html split-non-ortho1-ref
|
|||
fuzzy-if(winWidget,150,120) fails-if(webrender) == component-alpha-1.html component-alpha-1-ref.html
|
||||
fails-if(webrender) == nested-transform-1.html nested-transform-1-ref.html
|
||||
fails-if(webrender) == transform-geometry-1.html transform-geometry-1-ref.html
|
||||
fails-if(webrender) == intermediate-1.html intermediate-1-ref.html
|
||||
|
|
Загрузка…
Ссылка в новой задаче