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:
Miko Mynttinen 2017-03-16 21:51:54 +01:00
Родитель 4e87a68ced
Коммит 6e4add711b
4 изменённых файлов: 100 добавлений и 6 удалений

Просмотреть файл

@ -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