mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 822086 - Don't build ContainerLayers that would have a singular matrix. r=roc
This commit is contained in:
parent
51f8f86ba8
commit
667dc0c39c
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user