зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 3 changesets (bug 961887) for reftest failures on a CLOSED TREE
Backed out changeset 1684d29858e1 (bug 961887) Backed out changeset 97c8184c3058 (bug 961887) Backed out changeset f02c5c1f7704 (bug 961887)
This commit is contained in:
Родитель
8ff3b04a7f
Коммит
84d0eb7968
|
@ -242,56 +242,6 @@ static inline MaskLayerImageCache* GetMaskLayerImageCache()
|
|||
return gMaskLayerImageCache;
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper for nsIntRegion that can express infinite regions.
|
||||
*/
|
||||
struct PossiblyInfiniteRegion
|
||||
{
|
||||
PossiblyInfiniteRegion() : mIsInfinite(false) {}
|
||||
MOZ_IMPLICIT PossiblyInfiniteRegion(const nsIntRegion& aRegion)
|
||||
: mRegion(aRegion)
|
||||
, mIsInfinite(false)
|
||||
{}
|
||||
MOZ_IMPLICIT PossiblyInfiniteRegion(const nsIntRect& aRect)
|
||||
: mRegion(aRect)
|
||||
, mIsInfinite(false)
|
||||
{}
|
||||
|
||||
// Create an infinite region.
|
||||
static PossiblyInfiniteRegion InfiniteRegion()
|
||||
{
|
||||
PossiblyInfiniteRegion r;
|
||||
r.mIsInfinite = true;
|
||||
return r;
|
||||
}
|
||||
|
||||
bool IsInfinite() const { return mIsInfinite; }
|
||||
bool Intersects(const nsIntRegion& aRegion) const
|
||||
{
|
||||
if (IsInfinite()) {
|
||||
return true;
|
||||
}
|
||||
return !mRegion.Intersect(aRegion).IsEmpty();
|
||||
}
|
||||
|
||||
void AccumulateAndSimplifyOutward(const PossiblyInfiniteRegion& aRegion)
|
||||
{
|
||||
if (!IsInfinite()) {
|
||||
if (aRegion.IsInfinite()) {
|
||||
mIsInfinite = true;
|
||||
mRegion.SetEmpty();
|
||||
} else {
|
||||
mRegion.OrWith(aRegion.mRegion);
|
||||
mRegion.SimplifyOutward(8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
nsIntRegion mRegion;
|
||||
bool mIsInfinite;
|
||||
};
|
||||
|
||||
/**
|
||||
* We keep a stack of these to represent the PaintedLayers that are
|
||||
* currently available to have display items added to.
|
||||
|
@ -318,7 +268,8 @@ public:
|
|||
mOpaqueForAnimatedGeometryRootParent(false),
|
||||
mImage(nullptr),
|
||||
mCommonClipCount(-1),
|
||||
mNewChildLayersIndex(-1)
|
||||
mNewChildLayersIndex(-1),
|
||||
mVisibleAboveRegionIsInfinite(false)
|
||||
{}
|
||||
|
||||
#ifdef MOZ_DUMP_PAINTING
|
||||
|
@ -370,9 +321,52 @@ public:
|
|||
*/
|
||||
already_AddRefed<ImageContainer> CanOptimizeImageLayer(nsDisplayListBuilder* aBuilder);
|
||||
|
||||
void AddVisibleAboveRegion(const nsIntRegion& aAbove)
|
||||
{
|
||||
if (!mVisibleAboveRegionIsInfinite) {
|
||||
mVisibleAboveRegion.Or(mVisibleAboveRegion, aAbove);
|
||||
mVisibleAboveRegion.SimplifyOutward(8);
|
||||
}
|
||||
}
|
||||
|
||||
void CopyAboveRegion(PaintedLayerData* aOther)
|
||||
{
|
||||
if (mVisibleAboveRegionIsInfinite) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If aOther has a draw region and is subject to async transforms then the
|
||||
// layer can potentially be moved arbitrarily on the compositor. So we
|
||||
// should avoid moving display items from on top of the layer to below the
|
||||
// layer, which we do by calling SetVisibleAboveRegionIsInfinite. Note that
|
||||
// if the draw region is empty (such as when aOther has only event-regions
|
||||
// items) then we don't need to do this.
|
||||
bool aOtherCanDrawAnywhere = aOther->IsSubjectToAsyncTransforms()
|
||||
&& !aOther->mVisibleRegion.IsEmpty();
|
||||
|
||||
if (aOther->mVisibleAboveRegionIsInfinite || aOtherCanDrawAnywhere) {
|
||||
SetVisibleAboveRegionIsInfinite();
|
||||
} else {
|
||||
mVisibleAboveRegion.Or(mVisibleAboveRegion, aOther->mVisibleAboveRegion);
|
||||
mVisibleAboveRegion.Or(mVisibleAboveRegion, aOther->mVisibleRegion);
|
||||
mVisibleAboveRegion.SimplifyOutward(8);
|
||||
}
|
||||
}
|
||||
|
||||
void SetVisibleAboveRegionIsInfinite()
|
||||
{
|
||||
mVisibleAboveRegionIsInfinite = true;
|
||||
mVisibleAboveRegion.SetEmpty();
|
||||
}
|
||||
|
||||
bool VisibleAboveRegionIntersects(const nsIntRect& aRect) const
|
||||
{
|
||||
return mVisibleAboveRegionIsInfinite || mVisibleAboveRegion.Intersects(aRect);
|
||||
}
|
||||
|
||||
bool VisibleAboveRegionIntersects(const nsIntRegion& aRegion) const
|
||||
{
|
||||
return mVisibleAboveRegion.Intersects(aRegion);
|
||||
return mVisibleAboveRegionIsInfinite || !mVisibleAboveRegion.Intersect(aRegion).IsEmpty();
|
||||
}
|
||||
|
||||
bool VisibleRegionIntersects(const nsIntRect& aRect) const
|
||||
|
@ -508,6 +502,8 @@ public:
|
|||
* The union of all the bounds of the display items in this layer.
|
||||
*/
|
||||
nsIntRect mBounds;
|
||||
|
||||
private:
|
||||
/**
|
||||
* The region of visible content above the layer and below the
|
||||
* next PaintedLayerData currently in the stack, if any. Note that not
|
||||
|
@ -515,7 +511,12 @@ public:
|
|||
* Same coordinate system as mVisibleRegion.
|
||||
* This is a conservative approximation: it contains the true region.
|
||||
*/
|
||||
PossiblyInfiniteRegion mVisibleAboveRegion;
|
||||
nsIntRegion mVisibleAboveRegion;
|
||||
/**
|
||||
* True if mVisibleAboveRegion should be treated as infinite, and all
|
||||
* display items should be considered 'above' this layer.
|
||||
*/
|
||||
bool mVisibleAboveRegionIsInfinite;
|
||||
|
||||
};
|
||||
|
||||
|
@ -574,8 +575,7 @@ public:
|
|||
const nsRect& aContainerBounds,
|
||||
ContainerLayer* aContainerLayer,
|
||||
const ContainerLayerParameters& aParameters,
|
||||
bool aFlattenToSingleLayer,
|
||||
nscolor aBackgroundColor) :
|
||||
bool aFlattenToSingleLayer) :
|
||||
mBuilder(aBuilder), mManager(aManager),
|
||||
mLayerBuilder(aLayerBuilder),
|
||||
mContainerFrame(aContainerFrame),
|
||||
|
@ -583,7 +583,6 @@ public:
|
|||
mContainerBounds(aContainerBounds),
|
||||
mParameters(aParameters),
|
||||
mNextFreeRecycledPaintedLayer(0),
|
||||
mContainerUniformBackgroundColor(aBackgroundColor),
|
||||
mFlattenToSingleLayer(aFlattenToSingleLayer)
|
||||
{
|
||||
nsPresContext* presContext = aContainerFrame->PresContext();
|
||||
|
@ -734,15 +733,12 @@ protected:
|
|||
PaintedLayer* aNewLayer);
|
||||
|
||||
/**
|
||||
* Try to determine whether a layer with visible region aTargetVisibleRegion
|
||||
* Try to determine whether the PaintedLayer at aPaintedLayerIndex
|
||||
* has a single opaque color behind it, over the entire bounds of its visible
|
||||
* region. The target layer is assumed to be on top of all thebes layers in
|
||||
* the thebes layer data stack that have a stack index < aUnderPaintedLayerIndex.
|
||||
* If successful, return the color, otherwise return NS_RGBA(0,0,0,0).
|
||||
* aTargetVisibleRegion is relative to the the container reference frame.
|
||||
* region.
|
||||
* If successful, return that color, otherwise return NS_RGBA(0,0,0,0).
|
||||
*/
|
||||
nscolor FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRegion,
|
||||
int32_t aUnderPaintedLayerIndex);
|
||||
nscolor FindOpaqueBackgroundColorFor(int32_t aPaintedLayerIndex);
|
||||
/**
|
||||
* Find the fixed-pos frame, if any, containing (or equal to)
|
||||
* aAnimatedGeometryRoot. Only return a fixed-pos frame if its viewport
|
||||
|
@ -860,31 +856,6 @@ protected:
|
|||
bool ChooseAnimatedGeometryRoot(const nsDisplayList& aList,
|
||||
const nsIFrame **aAnimatedGeometryRoot);
|
||||
|
||||
/**
|
||||
* When adding a new layer above the topmost PaintedLayerData layer in our
|
||||
* PaintedLayerDataStack, update the visible above region of the topmost
|
||||
* PaintedLayerData item.
|
||||
* @param aVisibleRect The visible rect of the newly-added display item
|
||||
* @param aCanMoveFreely Whether the visible area of the item can change
|
||||
* without new layer building.
|
||||
* @param aClipRectIfAny A clip rect, if the layer is clipped, or nullptr.
|
||||
*/
|
||||
void UpdateVisibleAboveRegionForNewItem(const nsIntRect& aVisibleRect,
|
||||
bool aCanMoveFreely,
|
||||
const nsIntRect* aClipRectIfAny);
|
||||
|
||||
/**
|
||||
* When popping aData from the PaintedLayerDataStack, update the next
|
||||
* PaintedLayerData item's visible above region to take the popped layer
|
||||
* into account.
|
||||
* @param aData The layer data that is getting popped from
|
||||
* the stack.
|
||||
* @param aNextPaintedLayerData The next lower item in the stack, or nullptr
|
||||
* if there is none.
|
||||
*/
|
||||
void UpdateVisibleAboveRegionOnPop(PaintedLayerData* aData,
|
||||
PaintedLayerData* aNextPaintedLayerData);
|
||||
|
||||
nsDisplayListBuilder* mBuilder;
|
||||
LayerManager* mManager;
|
||||
FrameLayerBuilder* mLayerBuilder;
|
||||
|
@ -916,20 +887,8 @@ protected:
|
|||
nsTArray<nsRefPtr<PaintedLayer> > mRecycledPaintedLayers;
|
||||
nsDataHashtable<nsPtrHashKey<Layer>, nsRefPtr<ImageLayer> >
|
||||
mRecycledMaskImageLayers;
|
||||
/**
|
||||
* The visible region of all visible content in this container layer under
|
||||
* first PaintedLayerData layer in the PaintedLayerDataStack.
|
||||
*/
|
||||
PossiblyInfiniteRegion mVisibleAboveBackgroundRegion;
|
||||
uint32_t mNextFreeRecycledPaintedLayer;
|
||||
nscoord mAppUnitsPerDevPixel;
|
||||
/**
|
||||
* The uniform opaque color from behind this container layer, or
|
||||
* NS_RGBA(0,0,0,0) if the background behind this container layer is not
|
||||
* uniform and opaque. This color can be pulled into ThebesLayers that are
|
||||
* directly above the background.
|
||||
*/
|
||||
nscolor mContainerUniformBackgroundColor;
|
||||
bool mSnappingEnabled;
|
||||
bool mFlattenToSingleLayer;
|
||||
/**
|
||||
|
@ -1882,19 +1841,19 @@ ContainerState::SetOuterVisibleRegionForLayer(Layer* aLayer,
|
|||
}
|
||||
|
||||
nscolor
|
||||
ContainerState::FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRegion,
|
||||
int32_t aUnderPaintedLayerIndex)
|
||||
ContainerState::FindOpaqueBackgroundColorFor(int32_t aPaintedLayerIndex)
|
||||
{
|
||||
for (int32_t i = aUnderPaintedLayerIndex - 1; i >= 0; --i) {
|
||||
PaintedLayerData* target = mPaintedLayerDataStack[aPaintedLayerIndex];
|
||||
for (int32_t i = aPaintedLayerIndex - 1; i >= 0; --i) {
|
||||
PaintedLayerData* candidate = mPaintedLayerDataStack[i];
|
||||
if (candidate->VisibleAboveRegionIntersects(aTargetVisibleRegion)) {
|
||||
if (candidate->VisibleAboveRegionIntersects(target->mVisibleRegion)) {
|
||||
// Some non-PaintedLayer content between target and candidate; this is
|
||||
// hopeless
|
||||
return NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
}
|
||||
|
||||
nsIntRegion intersection;
|
||||
intersection.And(candidate->mVisibleRegion, aTargetVisibleRegion);
|
||||
intersection.And(candidate->mVisibleRegion, target->mVisibleRegion);
|
||||
if (intersection.IsEmpty()) {
|
||||
// The layer doesn't intersect our target, ignore it and move on
|
||||
continue;
|
||||
|
@ -1902,7 +1861,7 @@ ContainerState::FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRe
|
|||
|
||||
// The candidate intersects our target. If any layer has a solid-color
|
||||
// area behind our target, this must be it. Scan its display items.
|
||||
nsIntRect deviceRect = aTargetVisibleRegion.GetBounds();
|
||||
nsIntRect deviceRect = target->mVisibleRegion.GetBounds();
|
||||
nsRect appUnitRect = deviceRect.ToAppUnits(mAppUnitsPerDevPixel);
|
||||
appUnitRect.ScaleInverseRoundOut(mParameters.mXScale, mParameters.mYScale);
|
||||
|
||||
|
@ -1919,7 +1878,7 @@ ContainerState::FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRe
|
|||
continue;
|
||||
|
||||
if (!snappedBounds.Contains(deviceRect))
|
||||
return NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
|
||||
} else {
|
||||
// The layer's visible rect is already (close enough to) pixel
|
||||
|
@ -1928,7 +1887,7 @@ ContainerState::FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRe
|
|||
continue;
|
||||
|
||||
if (!bounds.Contains(appUnitRect))
|
||||
return NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (item->IsInvisibleInRect(appUnitRect)) {
|
||||
|
@ -1939,21 +1898,18 @@ ContainerState::FindOpaqueBackgroundColorFor(const nsIntRegion& aTargetVisibleRe
|
|||
mParameters.mXScale,
|
||||
mParameters.mYScale,
|
||||
mAppUnitsPerDevPixel)) {
|
||||
return NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
}
|
||||
|
||||
nscolor color;
|
||||
if (item->IsUniform(mBuilder, &color) && NS_GET_A(color) == 255)
|
||||
return color;
|
||||
|
||||
return NS_RGBA(0,0,0,0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (mVisibleAboveBackgroundRegion.Intersects(aTargetVisibleRegion)) {
|
||||
// Some non-Thebes content is between container background and target.
|
||||
return NS_RGBA(0,0,0,0);
|
||||
}
|
||||
return mContainerUniformBackgroundColor;
|
||||
return NS_RGBA(0,0,0,0);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2196,7 +2152,7 @@ ContainerState::PopPaintedLayerData()
|
|||
if (layer == data->mLayer) {
|
||||
nscolor backgroundColor = NS_RGBA(0,0,0,0);
|
||||
if (!isOpaque) {
|
||||
backgroundColor = FindOpaqueBackgroundColorFor(data->mVisibleRegion, lastIndex);
|
||||
backgroundColor = FindOpaqueBackgroundColorFor(lastIndex);
|
||||
if (NS_GET_A(backgroundColor) == 255) {
|
||||
isOpaque = true;
|
||||
}
|
||||
|
@ -2308,13 +2264,13 @@ ContainerState::PopPaintedLayerData()
|
|||
layer->SetEventRegions(regions);
|
||||
}
|
||||
|
||||
// Since we're going to pop off the last PaintedLayerData, the
|
||||
// mVisibleAboveRegion of the second-to-last item will need to include
|
||||
// the regions of the last item. If we're emptying the PaintedLayerDataStack,
|
||||
// we instead need to accumulate the regions into the container's
|
||||
// mVisibleAboveBackgroundRegion.
|
||||
UpdateVisibleAboveRegionOnPop(data,
|
||||
lastIndex > 0 ? mPaintedLayerDataStack[lastIndex - 1].get() : nullptr);
|
||||
if (lastIndex > 0) {
|
||||
// Since we're going to pop off the last PaintedLayerData, the
|
||||
// mVisibleAboveRegion of the second-to-last item will need to include
|
||||
// the regions of the last item.
|
||||
PaintedLayerData* nextData = mPaintedLayerDataStack[lastIndex - 1];
|
||||
nextData->CopyAboveRegion(data);
|
||||
}
|
||||
|
||||
mPaintedLayerDataStack.RemoveElementAt(lastIndex);
|
||||
}
|
||||
|
@ -2764,51 +2720,6 @@ ContainerState::ComputeOpaqueRect(nsDisplayItem* aItem,
|
|||
return opaquePixels;
|
||||
}
|
||||
|
||||
void
|
||||
ContainerState::UpdateVisibleAboveRegionForNewItem(const nsIntRect& aVisibleRect,
|
||||
bool aCanMoveFreely,
|
||||
const nsIntRect* aClipRectIfAny)
|
||||
{
|
||||
PaintedLayerData* data = GetTopPaintedLayerData();
|
||||
PossiblyInfiniteRegion& visibleAboveRegion = data
|
||||
? data->mVisibleAboveRegion : mVisibleAboveBackgroundRegion;
|
||||
|
||||
if (aCanMoveFreely) {
|
||||
// Prerendered transform items can be updated without layer building
|
||||
// (async animations or an empty transaction), so we need to put items
|
||||
// that the transform item can potentially move under into a layer above
|
||||
// this item. We do this by making the visible above region infinite.
|
||||
// If we have a clip, the transform can't escape from the clip rect, and
|
||||
// the clip rect can't change without new layer building. In that case we
|
||||
// can add just the clip rect to the visible above region.
|
||||
visibleAboveRegion.AccumulateAndSimplifyOutward(
|
||||
aClipRectIfAny ? *aClipRectIfAny : PossiblyInfiniteRegion::InfiniteRegion());
|
||||
} else {
|
||||
visibleAboveRegion.AccumulateAndSimplifyOutward(aVisibleRect);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ContainerState::UpdateVisibleAboveRegionOnPop(PaintedLayerData* aData,
|
||||
PaintedLayerData* aNextPaintedLayerData)
|
||||
{
|
||||
PossiblyInfiniteRegion& visibleAboveRegion = aNextPaintedLayerData ?
|
||||
aNextPaintedLayerData->mVisibleAboveRegion : mVisibleAboveBackgroundRegion;
|
||||
|
||||
// If aData has a draw region and is subject to async transforms then the
|
||||
// layer can potentially be moved arbitrarily on the compositor. So we
|
||||
// should avoid moving display items from on top of the layer to below the
|
||||
// layer, which we do by making the visibleAboveRegion infinite. Note that
|
||||
// if the visible region is empty (such as when aData has only event-regions
|
||||
// items) then we don't need to do this.
|
||||
if (aData->IsSubjectToAsyncTransforms() && !aData->mVisibleRegion.IsEmpty()) {
|
||||
visibleAboveRegion.AccumulateAndSimplifyOutward(PossiblyInfiniteRegion::InfiniteRegion());
|
||||
} else {
|
||||
visibleAboveRegion.AccumulateAndSimplifyOutward(aData->mVisibleAboveRegion);
|
||||
visibleAboveRegion.AccumulateAndSimplifyOutward(aData->mVisibleRegion);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Iterate through the non-clip items in aList and its descendants.
|
||||
* For each item we compute the effective clip rect. Each item is assigned
|
||||
|
@ -2999,16 +2910,6 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
|
|||
continue;
|
||||
}
|
||||
|
||||
// 3D-transformed layers don't necessarily draw in the order in which
|
||||
// they're added to their parent container layer.
|
||||
bool mayDrawOutOfOrder = itemType == nsDisplayItem::TYPE_TRANSFORM &&
|
||||
(item->Frame()->Preserves3D() || item->Frame()->Preserves3DChildren());
|
||||
|
||||
// Pull up a uniform background color into the layer if possible.
|
||||
mParameters.mBackgroundColor = (prerenderedTransform || mayDrawOutOfOrder)
|
||||
? NS_RGBA(0,0,0,0)
|
||||
: FindOpaqueBackgroundColorFor(itemVisibleRect, mPaintedLayerDataStack.Length());
|
||||
|
||||
// Just use its layer.
|
||||
// Set layerContentsVisibleRect.width/height to -1 to indicate we
|
||||
// currently don't know. If BuildContainerLayerFor gets called by
|
||||
|
@ -3052,13 +2953,27 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
|
|||
} else {
|
||||
ownLayer->SetClipRect(nullptr);
|
||||
}
|
||||
|
||||
// Update the "visible above region" of the topmost PaintedLayerData item
|
||||
// (or of the container's background) so that FindPaintedLayerFor and
|
||||
// FindOpaqueBackgroundColorFor are aware of this item, even though it's
|
||||
// not in the PaintedLayerDataStack.
|
||||
UpdateVisibleAboveRegionForNewItem(itemVisibleRect, prerenderedTransform,
|
||||
itemClip.HasClip() ? &clipRect : nullptr);
|
||||
PaintedLayerData* data = GetTopPaintedLayerData();
|
||||
if (data) {
|
||||
// Prerendered transform items can be updated without layer building
|
||||
// (async animations or an empty transaction), so we need to put items
|
||||
// that the transform item can potentially move under into a layer
|
||||
// above this item.
|
||||
if (prerenderedTransform) {
|
||||
if (!itemClip.HasClip()) {
|
||||
// The transform item can move anywhere, treat all other content
|
||||
// as being above this item.
|
||||
data->SetVisibleAboveRegionIsInfinite();
|
||||
} else {
|
||||
// The transform can't escape from the clip rect, and the clip
|
||||
// rect can't change without new layer building. Treat all content
|
||||
// that intersects the clip rect as being above this item.
|
||||
data->AddVisibleAboveRegion(clipRect);
|
||||
}
|
||||
} else {
|
||||
data->AddVisibleAboveRegion(itemVisibleRect);
|
||||
}
|
||||
}
|
||||
|
||||
// rounded rectangle clipping using mask layers
|
||||
// (must be done after visible rect is set on layer)
|
||||
|
@ -4109,18 +4024,11 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
|
|||
{
|
||||
flattenToSingleLayer = true;
|
||||
}
|
||||
|
||||
nscolor backgroundColor = NS_RGBA(0,0,0,0);
|
||||
if (aFlags & CONTAINER_ALLOW_PULL_BACKGROUND_COLOR) {
|
||||
backgroundColor = aParameters.mBackgroundColor;
|
||||
}
|
||||
|
||||
uint32_t flags;
|
||||
while (true) {
|
||||
ContainerState state(aBuilder, aManager, aManager->GetLayerBuilder(),
|
||||
aContainerFrame, aContainerItem, bounds,
|
||||
containerLayer, scaleParameters, flattenToSingleLayer,
|
||||
backgroundColor);
|
||||
containerLayer, scaleParameters, flattenToSingleLayer);
|
||||
|
||||
state.ProcessDisplayItems(aChildren);
|
||||
|
||||
|
|
|
@ -57,7 +57,6 @@ struct ContainerLayerParameters {
|
|||
: mXScale(1)
|
||||
, mYScale(1)
|
||||
, mLayerContentsVisibleRect(nullptr)
|
||||
, mBackgroundColor(NS_RGBA(0,0,0,0))
|
||||
, mInTransformedSubtree(false)
|
||||
, mInActiveTransformedSubtree(false)
|
||||
, mDisableSubpixelAntialiasingInDescendants(false)
|
||||
|
@ -67,7 +66,6 @@ struct ContainerLayerParameters {
|
|||
: mXScale(aXScale)
|
||||
, mYScale(aYScale)
|
||||
, mLayerContentsVisibleRect(nullptr)
|
||||
, mBackgroundColor(NS_RGBA(0,0,0,0))
|
||||
, mInTransformedSubtree(false)
|
||||
, mInActiveTransformedSubtree(false)
|
||||
, mDisableSubpixelAntialiasingInDescendants(false)
|
||||
|
@ -80,7 +78,6 @@ struct ContainerLayerParameters {
|
|||
, mYScale(aYScale)
|
||||
, mLayerContentsVisibleRect(nullptr)
|
||||
, mOffset(aOffset)
|
||||
, mBackgroundColor(aParent.mBackgroundColor)
|
||||
, mInTransformedSubtree(aParent.mInTransformedSubtree)
|
||||
, mInActiveTransformedSubtree(aParent.mInActiveTransformedSubtree)
|
||||
, mDisableSubpixelAntialiasingInDescendants(aParent.mDisableSubpixelAntialiasingInDescendants)
|
||||
|
@ -97,7 +94,6 @@ struct ContainerLayerParameters {
|
|||
*/
|
||||
nsIntPoint mOffset;
|
||||
|
||||
nscolor mBackgroundColor;
|
||||
bool mInTransformedSubtree;
|
||||
bool mInActiveTransformedSubtree;
|
||||
bool mDisableSubpixelAntialiasingInDescendants;
|
||||
|
@ -201,16 +197,7 @@ public:
|
|||
void DidEndTransaction();
|
||||
|
||||
enum {
|
||||
CONTAINER_NOT_CLIPPED_BY_ANCESTORS = 0x01,
|
||||
|
||||
/**
|
||||
* Set this when pulling an opaque background color from behind the
|
||||
* container layer into the container doesn't change the visual results,
|
||||
* given the effects you're going to apply to the container layer.
|
||||
* For example, this is compatible with opacity or clipping/masking, but
|
||||
* not with non-OVER blend modes or filters.
|
||||
*/
|
||||
CONTAINER_ALLOW_PULL_BACKGROUND_COLOR = 0x02
|
||||
CONTAINER_NOT_CLIPPED_BY_ANCESTORS = 0x01
|
||||
};
|
||||
/**
|
||||
* Build a container layer for a display item that contains a child
|
||||
|
|
|
@ -3811,8 +3811,7 @@ nsDisplayOpacity::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|||
const ContainerLayerParameters& aContainerParameters) {
|
||||
nsRefPtr<Layer> container = aManager->GetLayerBuilder()->
|
||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
|
||||
aContainerParameters, nullptr,
|
||||
FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR);
|
||||
aContainerParameters, nullptr);
|
||||
if (!container)
|
||||
return nullptr;
|
||||
|
||||
|
@ -4121,8 +4120,7 @@ nsDisplayOwnLayer::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|||
const ContainerLayerParameters& aContainerParameters) {
|
||||
nsRefPtr<ContainerLayer> layer = aManager->GetLayerBuilder()->
|
||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
|
||||
aContainerParameters, nullptr,
|
||||
FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR);
|
||||
aContainerParameters, nullptr);
|
||||
if (mFlags & VERTICAL_SCROLLBAR) {
|
||||
layer->SetScrollbarData(mScrollTarget, Layer::ScrollDirection::VERTICAL);
|
||||
}
|
||||
|
@ -4520,8 +4518,7 @@ nsDisplayScrollLayer::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|||
|
||||
return aManager->GetLayerBuilder()->
|
||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
|
||||
params, nullptr,
|
||||
FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR);
|
||||
params, nullptr);
|
||||
}
|
||||
|
||||
UniquePtr<FrameMetrics>
|
||||
|
@ -5524,7 +5521,6 @@ already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBu
|
|||
|
||||
uint32_t flags = ShouldPrerender(aBuilder) ?
|
||||
FrameLayerBuilder::CONTAINER_NOT_CLIPPED_BY_ANCESTORS : 0;
|
||||
flags |= FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR;
|
||||
nsRefPtr<ContainerLayer> container = aManager->GetLayerBuilder()->
|
||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mStoredList.GetChildren(),
|
||||
aContainerParameters, &newTransformMatrix, flags);
|
||||
|
@ -5981,8 +5977,7 @@ nsDisplayVR::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|||
const ContainerLayerParameters& aContainerParameters)
|
||||
{
|
||||
ContainerLayerParameters newContainerParameters = aContainerParameters;
|
||||
uint32_t flags = FrameLayerBuilder::CONTAINER_NOT_CLIPPED_BY_ANCESTORS |
|
||||
FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR;
|
||||
uint32_t flags = FrameLayerBuilder::CONTAINER_NOT_CLIPPED_BY_ANCESTORS;
|
||||
nsRefPtr<ContainerLayer> container = aManager->GetLayerBuilder()->
|
||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
|
||||
newContainerParameters, nullptr, flags);
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>Don't pull background colors of container layers through DrawAboveRegions of ThebesLayers</title>
|
||||
<style>
|
||||
|
||||
#outer {
|
||||
transform: translateX(1px);
|
||||
}
|
||||
|
||||
#above {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
left: 50px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="outer">
|
||||
<div style="height: 100px; width: 200px; background-color: lime;"></div>
|
||||
<div id="above"></div>
|
||||
</div>
|
|
@ -1,30 +0,0 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>Don't pull background colors of container layers through DrawAboveRegions of ThebesLayers</title>
|
||||
<style>
|
||||
|
||||
#outer {
|
||||
transform: translateX(1px);
|
||||
}
|
||||
|
||||
#above {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
left: 50px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="outer">
|
||||
<canvas id="canvas" height="100" width="200"></canvas>
|
||||
<div id="above"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var canvas = document.getElementById("canvas");
|
||||
var cx = canvas.getContext("2d");
|
||||
cx.fillStyle="lime";
|
||||
cx.fillRect(0, 0, 200, 100);
|
||||
</script>
|
|
@ -1,24 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<meta charset="utf-8">
|
||||
<title>Make sure that we don't pull background colors into container layers that have effects applied on them</title>
|
||||
|
||||
<style>
|
||||
|
||||
#outer {
|
||||
background-color: white;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
#outer > div {
|
||||
margin: 20px;
|
||||
border: 1px solid black;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="outer">
|
||||
<div id="inner1"></div>
|
||||
<div id="inner2"></div>
|
||||
</div>
|
|
@ -1,32 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<meta charset="utf-8">
|
||||
<title>Make sure that we don't pull background colors into container layers that have effects applied on them</title>
|
||||
|
||||
<style>
|
||||
|
||||
#outer {
|
||||
background-color: white;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
#outer > div {
|
||||
margin: 20px;
|
||||
border: 1px solid white;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
#inner1 {
|
||||
mix-blend-mode: difference;
|
||||
}
|
||||
|
||||
#inner2 {
|
||||
filter: invert(100%);
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="outer">
|
||||
<div id="inner1"></div>
|
||||
<div id="inner2"></div>
|
||||
</div>
|
|
@ -1,16 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<meta charset="utf-8">
|
||||
<title>Test container background searching with clipped display items</title>
|
||||
|
||||
<style>
|
||||
|
||||
#box {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
background-color: lime;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
|
@ -1,51 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<meta charset="utf-8">
|
||||
<title>Test container background searching with clipped display items</title>
|
||||
|
||||
<style>
|
||||
|
||||
div {
|
||||
box-sizing: border-box;
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
margin-bottom: -200px;
|
||||
}
|
||||
|
||||
#outer {
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#container {
|
||||
will-change: opacity;
|
||||
}
|
||||
|
||||
#backgroundCover {
|
||||
background-color: lime;
|
||||
}
|
||||
|
||||
#roundedClip {
|
||||
overflow: hidden;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
#clippedItem {
|
||||
background-color: lime;
|
||||
}
|
||||
|
||||
#separatePaintedLayer {
|
||||
position: sticky;
|
||||
border: 1px solid lime;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="outer">
|
||||
<div id="container">
|
||||
<div id="backgroundCover"></div>
|
||||
<div id="roundedClip">
|
||||
<div id="clippedItem"></div>
|
||||
</div>
|
||||
<div id="separatePaintedLayer"></div>
|
||||
</div>
|
||||
</div>
|
|
@ -1658,9 +1658,9 @@ skip-if(Android||B2G) random-if(winWidget) == 632781-verybig.html 632781-ref.htm
|
|||
fuzzy-if(d2d&&/^Windows\x20NT\x206\.2/.test(http.oscpu),1,559) == 633344-1.html 633344-1-ref.html # bug 1103623
|
||||
== 634232-1.html 634232-1-ref.html
|
||||
fails-if(Android&&AndroidVersion<17&&AndroidVersion!=10) == 635302-1.html 635302-1-ref.html
|
||||
fuzzy(1,68) skip-if(B2G) fails-if(Android) == 635373-1.html 635373-1-ref.html
|
||||
skip-if(B2G) random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,1,61) == 635373-2.html 635373-2-ref.html
|
||||
skip-if(B2G) random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,1,60) == 635373-3.html 635373-3-ref.html
|
||||
skip-if(B2G) random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,1,11) == 635373-1.html 635373-1-ref.html
|
||||
skip-if(B2G) random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,1,15) == 635373-2.html 635373-2-ref.html
|
||||
skip-if(B2G) random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,1,15) == 635373-3.html 635373-3-ref.html
|
||||
HTTP(..) == 635639-1.html 635639-1-ref.html
|
||||
HTTP(..) == 635639-2.html 635639-2-ref.html
|
||||
random == 637597-1.html 637597-1-ref.html # bug 637597 was never really fixed!
|
||||
|
@ -1803,9 +1803,6 @@ fuzzy-if(B2G,1,7) == 942672-1.html 942672-1-ref.html
|
|||
== 950436-1.html 950436-1-ref.html
|
||||
== 957770-1.svg 957770-1-ref.svg
|
||||
== 960277-1.html 960277-1-ref.html
|
||||
== 961887-1.html 961887-1-ref.html
|
||||
== 961887-2.html 961887-2-ref.html
|
||||
== 961887-3.html 961887-3-ref.html
|
||||
pref(layout.css.overflow-clip-box.enabled,true) fuzzy(50,145) == 966992-1.html 966992-1-ref.html
|
||||
skip-if(Android) == 966510-1.html 966510-1-ref.html # scrollable elements other than the root probably won't work well on android until bug 776030 is fixed
|
||||
skip-if(Android) == 966510-2.html 966510-2-ref.html # same as above
|
||||
|
|
|
@ -11,7 +11,7 @@ skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollAbsHeightQuirks.html g
|
|||
skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollSimpleHeightD.html greenboxhbar.html # bug 650591, 732565 # bug 773482
|
||||
skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollSimpleHeightQuirks-1D.html greenboxhbar.html # bug 650591, 732565 # bug 773482
|
||||
skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollSimpleHeightQuirks-2D.html greenboxhbar.html # bug 650591, 732565 # bug 773482
|
||||
fuzzy-if(B2G,1,11) fails-if(Android&&browserIsRemote) == hScrollSimpleHeightQuirks-3D.html greenboxhbar.html # bug 650591, 732565, 1136304
|
||||
fails-if(Android&&browserIsRemote) == hScrollSimpleHeightQuirks-3D.html greenboxhbar.html # bug 650591, 732565
|
||||
skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollAbsHeightD.html greenboxhbar.html # bug 650591, 732565 # bug 773482
|
||||
skip-if(B2G) fails-if(Android&&browserIsRemote) == hScrollAbsHeightQuirksD.html greenboxhbar.html # bug 650591, 732565 # bug 773482
|
||||
== simpleMinHeight100D.html greenbox.html
|
||||
|
|
Загрузка…
Ссылка в новой задаче