--- a/layout/painting/FrameLayerBuilder.cpp
+++ b/layout/painting/FrameLayerBuilder.cpp
@@ -957,17 +957,17 @@ public:
* PaintedLayerData from inside a node in our tree, or a new one that gets
* created by a call out to aNewPaintedLayerCallback.
*/
template<typename NewPaintedLayerCallbackType>
PaintedLayerData* FindPaintedLayerFor(AnimatedGeometryRoot* aAnimatedGeometryRoot,
const ActiveScrolledRoot* aASR,
const DisplayItemClipChain* aClipChain,
const nsIntRect& aVisibleRect,
- bool aBackfaceidden,
+ const bool aBackfaceHidden,
NewPaintedLayerCallbackType aNewPaintedLayerCallback);
/**
* Finish everything.
*/
void Finish();
/**
@@ -1224,17 +1224,18 @@ protected:
already_AddRefed<PaintedLayer> CreatePaintedLayer(PaintedLayerData* aData);
/**
* Find a PaintedLayer for recycling, recycle it and prepare it for use, or
* return null if no suitable layer was found.
*/
already_AddRefed<PaintedLayer> AttemptToRecyclePaintedLayer(AnimatedGeometryRoot* aAnimatedGeometryRoot,
nsDisplayItem* aItem,
- const nsPoint& aTopLeft);
+ const nsPoint& aTopLeft,
+ const nsIFrame* aReferenceFrame);
/**
* Recycle aLayer and do any necessary invalidation.
*/
PaintedDisplayItemLayerUserData* RecyclePaintedLayer(PaintedLayer* aLayer,
AnimatedGeometryRoot* aAnimatedGeometryRoot,
bool& didResetScrollPositionForLayerPixelAlignment);
/**
@@ -1334,36 +1335,40 @@ protected:
AnimatedGeometryRoot* aAnimatedGeometryRoot,
const ActiveScrolledRoot* aASR,
const DisplayItemClip& aClip,
nsDisplayList* aList,
bool* aHideAllLayersBelow,
bool* aOpaqueForAnimatedGeometryRootParent);
/**
- * Return a PaintedLayerData object that is initialized for a layer that
- * aItem will be assigned to.
- * @param aItem The item that is going to be added.
+ * Fills a PaintedLayerData object that is initialized for a layer that the
+ * current item will be assigned to. Also creates mNewChildLayers entries.
+ * @param aData The PaintedLayerData that will be filled.
* @param aVisibleRect The visible rect of the item.
* @param aAnimatedGeometryRoot The item's animated geometry root.
* @param aASR The active scrolled root that moves this PaintedLayer.
* @param aClipChain The clip chain that the compositor needs to
* apply to this layer.
* @param aScrollMetadataASR The leaf ASR for which scroll metadata needs to be
* set on the layer, because either the layer itself
* or its scrolled clip need to move with that ASR.
* @param aTopLeft The offset between aAnimatedGeometryRoot and
* the reference frame.
+ * @param aReferenceFrame The reference frame for the item.
+ * @param aBackfaceHidden The backface visibility for the item frame.
*/
- PaintedLayerData NewPaintedLayerData(nsDisplayItem* aItem,
- AnimatedGeometryRoot* aAnimatedGeometryRoot,
- const ActiveScrolledRoot* aASR,
- const DisplayItemClipChain* aClipChain,
- const ActiveScrolledRoot* aScrollMetadataASR,
- const nsPoint& aTopLeft);
+ void NewPaintedLayerData(PaintedLayerData* aData,
+ AnimatedGeometryRoot* aAnimatedGeometryRoot,
+ const ActiveScrolledRoot* aASR,
+ const DisplayItemClipChain* aClipChain,
+ const ActiveScrolledRoot* aScrollMetadataASR,
+ const nsPoint& aTopLeft,
+ const nsIFrame* aReferenceFrame,
+ const bool aBackfaceHidden);
/* Build a mask layer to represent the clipping region. Will return null if
* there is no clipping specified or a mask layer cannot be built.
* Builds an ImageLayer for the appropriate backend; the mask is relative to
* aLayer's visible region.
* aLayer is the layer to be clipped.
* relative to the container reference frame
* aRoundedRectClipCount is used when building mask layers for PaintedLayers,
@@ -2278,17 +2283,18 @@ ContainerState::GetLayerCreationHint(Ani
}
}
return LayerManager::NONE;
}
already_AddRefed<PaintedLayer>
ContainerState::AttemptToRecyclePaintedLayer(AnimatedGeometryRoot* aAnimatedGeometryRoot,
nsDisplayItem* aItem,
- const nsPoint& aTopLeft)
+ const nsPoint& aTopLeft,
+ const nsIFrame* aReferenceFrame)
{
Layer* oldLayer = mLayerBuilder->GetOldLayerFor(aItem);
if (!oldLayer || !oldLayer->AsPaintedLayer()) {
return nullptr;
}
if (!mPaintedLayersAvailableForRecycling.EnsureRemoved(oldLayer->AsPaintedLayer())) {
// Not found.
@@ -2303,18 +2309,18 @@ ContainerState::AttemptToRecyclePaintedL
if (!layer->IsOptimizedFor(GetLayerCreationHint(aAnimatedGeometryRoot))) {
return nullptr;
}
bool didResetScrollPositionForLayerPixelAlignment = false;
PaintedDisplayItemLayerUserData* data =
RecyclePaintedLayer(layer, aAnimatedGeometryRoot,
didResetScrollPositionForLayerPixelAlignment);
- PreparePaintedLayerForUse(layer, data, aAnimatedGeometryRoot, aItem->ReferenceFrame(),
- aTopLeft,
+ PreparePaintedLayerForUse(layer, data, aAnimatedGeometryRoot,
+ aReferenceFrame, aTopLeft,
didResetScrollPositionForLayerPixelAlignment);
return layer.forget();
}
already_AddRefed<PaintedLayer>
ContainerState::CreatePaintedLayer(PaintedLayerData* aData)
{
@@ -2730,17 +2736,17 @@ PaintedLayerDataNode::AddChildNodeFor(An
MakeUnique<PaintedLayerDataNode>(mTree, this, aAnimatedGeometryRoot);
mChildren.AppendElement(Move(child));
return mChildren.LastElement().get();
}
template<typename NewPaintedLayerCallbackType>
PaintedLayerData*
PaintedLayerDataNode::FindPaintedLayerFor(const nsIntRect& aVisibleRect,
- bool aBackfaceHidden,
+ const bool aBackfaceHidden,
const ActiveScrolledRoot* aASR,
const DisplayItemClipChain* aClipChain,
NewPaintedLayerCallbackType aNewPaintedLayerCallback)
{
if (!mPaintedLayerDataStack.IsEmpty()) {
PaintedLayerData* lowestUsableLayer = nullptr;
for (auto& data : Reversed(mPaintedLayerDataStack)) {
if (data.mVisibleAboveRegion.Intersects(aVisibleRect)) {
@@ -2773,17 +2779,20 @@ PaintedLayerDataNode::FindPaintedLayerFo
} else if (gfxPrefs::LayoutSmallerPaintedLayers()) {
lowestUsableLayer = nullptr;
}
}
if (lowestUsableLayer) {
return lowestUsableLayer;
}
}
- return mPaintedLayerDataStack.AppendElement(aNewPaintedLayerCallback());
+ PaintedLayerData* data = mPaintedLayerDataStack.AppendElement();
+ aNewPaintedLayerCallback(data);
+
+ return data;
}
void
PaintedLayerDataNode::FinishChildrenIntersecting(const nsIntRect& aRect)
{
for (int32_t i = mChildren.Length() - 1; i >= 0; i--) {
if (mChildren[i]->Intersects(aRect)) {
mChildren[i]->Finish(true);
@@ -2900,17 +2909,17 @@ PaintedLayerDataTree::AddingOwnLayer(Ani
}
template<typename NewPaintedLayerCallbackType>
PaintedLayerData*
PaintedLayerDataTree::FindPaintedLayerFor(AnimatedGeometryRoot* aAnimatedGeometryRoot,
const ActiveScrolledRoot* aASR,
const DisplayItemClipChain* aClipChain,
const nsIntRect& aVisibleRect,
- bool aBackfaceHidden,
+ const bool aBackfaceHidden,
NewPaintedLayerCallbackType aNewPaintedLayerCallback)
{
const nsIntRect* bounds = &aVisibleRect;
FinishPotentiallyIntersectingNodes(aAnimatedGeometryRoot, bounds);
PaintedLayerDataNode* node = EnsureNodeFor(aAnimatedGeometryRoot);
PaintedLayerData* data =
node->FindPaintedLayerFor(aVisibleRect, aBackfaceHidden, aASR, aClipChain,
@@ -3587,45 +3596,44 @@ PaintedLayerData::AccumulateEventRegions
mMaybeHitRegion.SimplifyOutward(8);
// Calculate scaled versions of the bounds of mHitRegion and mMaybeHitRegion
// for quick access in FindPaintedLayerFor().
mScaledHitRegionBounds = aState->ScaleToOutsidePixels(mHitRegion.GetBounds());
mScaledMaybeHitRegionBounds = aState->ScaleToOutsidePixels(mMaybeHitRegion.GetBounds());
}
-PaintedLayerData
-ContainerState::NewPaintedLayerData(nsDisplayItem* aItem,
+void
+ContainerState::NewPaintedLayerData(PaintedLayerData* aData,
AnimatedGeometryRoot* aAnimatedGeometryRoot,
const ActiveScrolledRoot* aASR,
const DisplayItemClipChain* aClipChain,
const ActiveScrolledRoot* aScrollMetadataASR,
- const nsPoint& aTopLeft)
+ const nsPoint& aTopLeft,
+ const nsIFrame* aReferenceFrame,
+ const bool aBackfaceHidden)
{
- PaintedLayerData data;
- data.mAnimatedGeometryRoot = aAnimatedGeometryRoot;
- data.mASR = aASR;
- data.mClipChain = aClipChain;
- data.mAnimatedGeometryRootOffset = aTopLeft;
- data.mReferenceFrame = aItem->ReferenceFrame();
- data.mBackfaceHidden = aItem->In3DContextAndBackfaceIsHidden();
-
- data.mNewChildLayersIndex = mNewChildLayers.Length();
+ aData->mAnimatedGeometryRoot = aAnimatedGeometryRoot;
+ aData->mASR = aASR;
+ aData->mClipChain = aClipChain;
+ aData->mAnimatedGeometryRootOffset = aTopLeft;
+ aData->mReferenceFrame = aReferenceFrame;
+ aData->mBackfaceHidden = aBackfaceHidden;
+
+ aData->mNewChildLayersIndex = mNewChildLayers.Length();
NewLayerEntry* newLayerEntry = mNewChildLayers.AppendElement();
newLayerEntry->mAnimatedGeometryRoot = aAnimatedGeometryRoot;
newLayerEntry->mASR = aASR;
newLayerEntry->mScrollMetadataASR = aScrollMetadataASR;
newLayerEntry->mClipChain = aClipChain;
// newLayerEntry->mOpaqueRegion is filled in later from
// paintedLayerData->mOpaqueRegion, if necessary.
// Allocate another entry for this layer's optimization to ColorLayer/ImageLayer
mNewChildLayers.AppendElement();
-
- return data;
}
#ifdef MOZ_DUMP_PAINTING
static void
DumpPaintedImage(nsDisplayItem* aItem, SourceSurface* aSurface)
{
nsCString string(aItem->Name());
string.Append('-');
@@ -4434,23 +4442,26 @@ ContainerState::ProcessDisplayItems(nsDi
/**
* No need to allocate geometry for items that aren't
* part of a PaintedLayer.
*/
oldData =
mLayerBuilder->GetOldLayerForFrame(item->Frame(), item->GetPerFrameKey());
mLayerBuilder->AddLayerDisplayItem(ownLayer, item, layerState, nullptr, oldData);
} else {
+ const bool backfaceHidden = item->In3DContextAndBackfaceIsHidden();
+ const nsIFrame* referenceFrame = item->ReferenceFrame();
+
PaintedLayerData* paintedLayerData =
mPaintedLayerDataTree.FindPaintedLayerFor(animatedGeometryRoot, itemASR, layerClipChain,
- itemVisibleRect,
- item->In3DContextAndBackfaceIsHidden(),
- [&]() {
- return NewPaintedLayerData(item, animatedGeometryRoot, itemASR, layerClipChain, scrollMetadataASR,
- topLeft);
+ itemVisibleRect, backfaceHidden,
+ [&](PaintedLayerData* aData) {
+ NewPaintedLayerData(aData, animatedGeometryRoot, itemASR,
+ layerClipChain, scrollMetadataASR, topLeft,
+ referenceFrame, backfaceHidden);
});
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
nsDisplayLayerEventRegions* eventRegions =
static_cast<nsDisplayLayerEventRegions*>(item);
paintedLayerData->AccumulateEventRegions(this, eventRegions);
} else {
// check to see if the new item has rounded rect clips in common with
@@ -4458,17 +4469,18 @@ ContainerState::ProcessDisplayItems(nsDi
if (mManager->IsWidgetLayerManager()) {
paintedLayerData->UpdateCommonClipCount(itemClip);
}
paintedLayerData->Accumulate(this, item, itemVisibleRect, itemClip, layerState, aList);
if (!paintedLayerData->mLayer) {
// Try to recycle the old layer of this display item.
RefPtr<PaintedLayer> layer =
- AttemptToRecyclePaintedLayer(animatedGeometryRoot, item, topLeft);
+ AttemptToRecyclePaintedLayer(animatedGeometryRoot, item,
+ topLeft, referenceFrame);
if (layer) {
paintedLayerData->mLayer = layer;
NS_ASSERTION(FindIndexOfLayerIn(mNewChildLayers, layer) < 0,
"Layer already in list???");
mNewChildLayers[paintedLayerData->mNewChildLayersIndex].mLayer = layer.forget();
}
}