Bug 822086 - Don't build ContainerLayers that would have a singular matrix. r=roc

This commit is contained in:
Matt Woodrow 2013-03-21 15:33:00 +13:00
parent 51f8f86ba8
commit 667dc0c39c
2 changed files with 19 additions and 12 deletions

View File

@ -2681,14 +2681,15 @@ ContainerState::Finish(uint32_t* aTextContentFlags, LayerManagerData* aData)
*aTextContentFlags = textContentFlags;
}
static FrameLayerBuilder::ContainerParameters
static bool
ChooseScaleAndSetTransform(FrameLayerBuilder* aLayerBuilder,
nsDisplayListBuilder* aDisplayListBuilder,
nsIFrame* aContainerFrame,
const gfx3DMatrix* aTransform,
const FrameLayerBuilder::ContainerParameters& aIncomingScale,
ContainerLayer* aLayer,
LayerState aState)
LayerState aState,
FrameLayerBuilder::ContainerParameters& aOutgoingScale)
{
nsIntPoint offset;
@ -2722,6 +2723,9 @@ ChooseScaleAndSetTransform(FrameLayerBuilder* aLayerBuilder,
}
transform = transform * gfx3DMatrix::Translation(offset.x + aIncomingScale.mOffset.x, offset.y + aIncomingScale.mOffset.y, 0);
if (transform.IsSingular()) {
return false;
}
bool canDraw2D = transform.CanDraw2D(&transform2d);
gfxSize scale;
@ -2783,18 +2787,18 @@ ChooseScaleAndSetTransform(FrameLayerBuilder* aLayerBuilder,
aLayer->SetInheritedScale(aIncomingScale.mXScale,
aIncomingScale.mYScale);
FrameLayerBuilder::ContainerParameters
result(scale.width, scale.height, -offset, aIncomingScale);
aOutgoingScale =
FrameLayerBuilder::ContainerParameters(scale.width, scale.height, -offset, aIncomingScale);
if (aTransform) {
result.mInTransformedSubtree = true;
aOutgoingScale.mInTransformedSubtree = true;
if (aContainerFrame->AreLayersMarkedActive(nsChangeHint_UpdateTransformLayer)) {
result.mInActiveTransformedSubtree = true;
aOutgoingScale.mInActiveTransformedSubtree = true;
}
}
if (isRetained && (!canDraw2D || transform2d.HasNonIntegerTranslation())) {
result.mDisableSubpixelAntialiasingInDescendants = true;
aOutgoingScale.mDisableSubpixelAntialiasingInDescendants = true;
}
return result;
return true;
}
/* static */ PLDHashOperator
@ -2906,9 +2910,11 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
return containerLayer.forget();
}
ContainerParameters scaleParameters =
ChooseScaleAndSetTransform(this, aBuilder, aContainerFrame, aTransform, aParameters,
containerLayer, state);
ContainerParameters scaleParameters;
if (!ChooseScaleAndSetTransform(this, aBuilder, aContainerFrame, aTransform, aParameters,
containerLayer, state, scaleParameters)) {
return nullptr;
}
uint32_t oldGeneration = mContainerLayerGeneration;
mContainerLayerGeneration = ++mMaxContainerLayerGeneration;

View File

@ -4010,7 +4010,8 @@ already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBu
const gfx3DMatrix& newTransformMatrix =
GetTransform(mFrame->PresContext()->AppUnitsPerDevPixel());
if (!IsFrameVisible(mFrame, newTransformMatrix)) {
if (mFrame->StyleDisplay()->mBackfaceVisibility == NS_STYLE_BACKFACE_VISIBILITY_HIDDEN &&
newTransformMatrix.IsBackfaceVisible()) {
return nullptr;
}