зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1022612. Part 6: Set the initial mVisibleRect for each display item to the dirty rect when we create the item. r=mattwoodrow
--HG-- extra : rebase_source : b3207861e7476e954a8869a8b2d74e642ea6e56b
This commit is contained in:
Родитель
de75b34e18
Коммит
a7afb232a3
|
@ -3013,28 +3013,28 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
|
|||
mReferenceFrame =
|
||||
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
|
||||
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we're a transformed frame, then we need to find out if we're inside
|
||||
// the nsDisplayTransform or outside of it. Frames inside the transform
|
||||
// need mReferenceFrame == mFrame, outside needs the next ancestor
|
||||
// reference frame.
|
||||
// If we're inside the transform, then the nsDisplayItem constructor
|
||||
// will have done the right thing.
|
||||
// If we're outside the transform, then we should have only one child
|
||||
// (since nsDisplayTransform wraps all actual content), and that child
|
||||
// will have the correct reference frame set (since nsDisplayTransform
|
||||
// handles this explictly).
|
||||
//
|
||||
// Preserve-3d can cause us to have multiple nsDisplayTransform
|
||||
// children.
|
||||
nsDisplayItem *i = mList.GetBottom();
|
||||
if (i && (!i->GetAbove() || i->GetType() == TYPE_TRANSFORM) &&
|
||||
i->Frame() == mFrame) {
|
||||
mReferenceFrame = i->ReferenceFrame();
|
||||
mToReferenceFrame = i->ToReferenceFrame();
|
||||
} else {
|
||||
// If we're a transformed frame, then we need to find out if we're inside
|
||||
// the nsDisplayTransform or outside of it. Frames inside the transform
|
||||
// need mReferenceFrame == mFrame, outside needs the next ancestor
|
||||
// reference frame.
|
||||
// If we're inside the transform, then the nsDisplayItem constructor
|
||||
// will have done the right thing.
|
||||
// If we're outside the transform, then we should have only one child
|
||||
// (since nsDisplayTransform wraps all actual content), and that child
|
||||
// will have the correct reference frame set (since nsDisplayTransform
|
||||
// handles this explictly).
|
||||
//
|
||||
// Preserve-3d can cause us to have multiple nsDisplayTransform
|
||||
// children.
|
||||
nsDisplayItem *i = mList.GetBottom();
|
||||
if (i && (!i->GetAbove() || i->GetType() == TYPE_TRANSFORM) &&
|
||||
i->Frame() == mFrame) {
|
||||
mReferenceFrame = i->ReferenceFrame();
|
||||
mToReferenceFrame = i->ToReferenceFrame();
|
||||
}
|
||||
}
|
||||
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
|
||||
}
|
||||
|
||||
nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
|
||||
|
@ -3053,14 +3053,14 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
|
|||
mReferenceFrame =
|
||||
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
|
||||
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
|
||||
return;
|
||||
}
|
||||
|
||||
// See the previous nsDisplayWrapList constructor
|
||||
if (aItem->Frame() == aFrame) {
|
||||
mReferenceFrame = aItem->ReferenceFrame();
|
||||
mToReferenceFrame = aItem->ToReferenceFrame();
|
||||
} else {
|
||||
// See the previous nsDisplayWrapList constructor
|
||||
if (aItem->Frame() == aFrame) {
|
||||
mReferenceFrame = aItem->ReferenceFrame();
|
||||
mToReferenceFrame = aItem->ToReferenceFrame();
|
||||
}
|
||||
}
|
||||
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
|
||||
}
|
||||
|
||||
nsDisplayWrapList::~nsDisplayWrapList() {
|
||||
|
@ -4333,6 +4333,15 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
|
|||
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip());
|
||||
}
|
||||
|
||||
void
|
||||
nsDisplayTransform::SetReferenceFrameToAncestor(nsDisplayListBuilder* aBuilder)
|
||||
{
|
||||
mReferenceFrame =
|
||||
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(mFrame));
|
||||
mToReferenceFrame = mFrame->GetOffsetToCrossDoc(mReferenceFrame);
|
||||
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
|
||||
}
|
||||
|
||||
nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame *aFrame,
|
||||
nsDisplayList *aList, uint32_t aIndex)
|
||||
: nsDisplayItem(aBuilder, aFrame)
|
||||
|
@ -4342,9 +4351,7 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
|
|||
{
|
||||
MOZ_COUNT_CTOR(nsDisplayTransform);
|
||||
NS_ABORT_IF_FALSE(aFrame, "Must have a frame!");
|
||||
mReferenceFrame =
|
||||
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
|
||||
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
|
||||
SetReferenceFrameToAncestor(aBuilder);
|
||||
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip());
|
||||
}
|
||||
|
||||
|
@ -4357,9 +4364,7 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
|
|||
{
|
||||
MOZ_COUNT_CTOR(nsDisplayTransform);
|
||||
NS_ABORT_IF_FALSE(aFrame, "Must have a frame!");
|
||||
mReferenceFrame =
|
||||
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
|
||||
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
|
||||
SetReferenceFrameToAncestor(aBuilder);
|
||||
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip());
|
||||
}
|
||||
|
||||
|
@ -5048,7 +5053,7 @@ nsRegion nsDisplayTransform::GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
|
|||
if (matrix.Is2D(&matrix2d) &&
|
||||
matrix2d.PreservesAxisAlignedRectangles() &&
|
||||
mStoredList.GetOpaqueRegion(aBuilder, &tmpSnap).Contains(untransformedVisible)) {
|
||||
result = mVisibleRect;
|
||||
result = mVisibleRect.Intersect(GetBounds(aBuilder, &tmpSnap));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -5108,7 +5113,7 @@ nsDisplayTransform::TryMerge(nsDisplayListBuilder *aBuilder,
|
|||
/* Now, move everything over to this frame and signal that
|
||||
* we merged things!
|
||||
*/
|
||||
mStoredList.MergeFrom(&static_cast<nsDisplayTransform*>(aItem)->mStoredList);
|
||||
mStoredList.MergeFromTrackingMergedFrames(&static_cast<nsDisplayTransform*>(aItem)->mStoredList);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -867,8 +867,10 @@ public:
|
|||
, mPainted(false)
|
||||
#endif
|
||||
{
|
||||
mReferenceFrame = aBuilder->FindReferenceFrameFor(aFrame);
|
||||
mToReferenceFrame = aBuilder->ToReferenceFrame(aFrame);
|
||||
mReferenceFrame = aBuilder->FindReferenceFrameFor(aFrame, &mToReferenceFrame);
|
||||
NS_ASSERTION(aBuilder->GetDirtyRect().width >= 0 ||
|
||||
!aBuilder->IsForPainting(), "dirty rect not set");
|
||||
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
|
||||
}
|
||||
/**
|
||||
* This constructor is only used in rare cases when we need to construct
|
||||
|
@ -2679,14 +2681,11 @@ public:
|
|||
protected:
|
||||
nsDisplayWrapList() {}
|
||||
|
||||
void MergeFrom(nsDisplayWrapList* aOther)
|
||||
void MergeFromTrackingMergedFrames(nsDisplayWrapList* aOther)
|
||||
{
|
||||
mList.AppendToBottom(&aOther->mList);
|
||||
mBounds.UnionRect(mBounds, aOther->mBounds);
|
||||
}
|
||||
void MergeFromTrackingMergedFrames(nsDisplayWrapList* aOther)
|
||||
{
|
||||
MergeFrom(aOther);
|
||||
mVisibleRect.UnionRect(mVisibleRect, aOther->mVisibleRect);
|
||||
mMergedFrames.AppendElement(aOther->mFrame);
|
||||
mMergedFrames.MoveElementsFrom(aOther->mMergedFrames);
|
||||
}
|
||||
|
@ -3428,6 +3427,8 @@ public:
|
|||
virtual void WriteDebugInfo(nsACString& aTo) MOZ_OVERRIDE;
|
||||
#endif
|
||||
private:
|
||||
void SetReferenceFrameToAncestor(nsDisplayListBuilder* aBuilder);
|
||||
|
||||
static gfx3DMatrix GetResultingTransformMatrixInternal(const FrameTransformProperties& aProperties,
|
||||
const nsPoint& aOrigin,
|
||||
float aAppUnitsPerPixel,
|
||||
|
|
Загрузка…
Ссылка в новой задаче