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 : 23fb5aefd5de004ca89037724aff7b34e1a5864e
This commit is contained in:
Robert O'Callahan 2014-06-09 16:47:59 +12:00
Родитель 948f5322d1
Коммит cf334596a8
2 изменённых файлов: 50 добавлений и 44 удалений

Просмотреть файл

@ -3016,28 +3016,28 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
mReferenceFrame = mReferenceFrame =
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame)); aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame); mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
return; } 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
// If we're a transformed frame, then we need to find out if we're inside // need mReferenceFrame == mFrame, outside needs the next ancestor
// the nsDisplayTransform or outside of it. Frames inside the transform // reference frame.
// need mReferenceFrame == mFrame, outside needs the next ancestor // If we're inside the transform, then the nsDisplayItem constructor
// reference frame. // will have done the right thing.
// If we're inside the transform, then the nsDisplayItem constructor // If we're outside the transform, then we should have only one child
// will have done the right thing. // (since nsDisplayTransform wraps all actual content), and that child
// If we're outside the transform, then we should have only one child // will have the correct reference frame set (since nsDisplayTransform
// (since nsDisplayTransform wraps all actual content), and that child // handles this explictly).
// will have the correct reference frame set (since nsDisplayTransform //
// handles this explictly). // Preserve-3d can cause us to have multiple nsDisplayTransform
// // children.
// Preserve-3d can cause us to have multiple nsDisplayTransform nsDisplayItem *i = mList.GetBottom();
// children. if (i && (!i->GetAbove() || i->GetType() == TYPE_TRANSFORM) &&
nsDisplayItem *i = mList.GetBottom(); i->Frame() == mFrame) {
if (i && (!i->GetAbove() || i->GetType() == TYPE_TRANSFORM) && mReferenceFrame = i->ReferenceFrame();
i->Frame() == mFrame) { mToReferenceFrame = i->ToReferenceFrame();
mReferenceFrame = i->ReferenceFrame(); }
mToReferenceFrame = i->ToReferenceFrame();
} }
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
} }
nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
@ -3056,14 +3056,14 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
mReferenceFrame = mReferenceFrame =
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame)); aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame); mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
return; } else {
} // See the previous nsDisplayWrapList constructor
if (aItem->Frame() == aFrame) {
// See the previous nsDisplayWrapList constructor mReferenceFrame = aItem->ReferenceFrame();
if (aItem->Frame() == aFrame) { mToReferenceFrame = aItem->ToReferenceFrame();
mReferenceFrame = aItem->ReferenceFrame(); }
mToReferenceFrame = aItem->ToReferenceFrame();
} }
mVisibleRect = aBuilder->GetDirtyRect() + mToReferenceFrame;
} }
nsDisplayWrapList::~nsDisplayWrapList() { nsDisplayWrapList::~nsDisplayWrapList() {
@ -4336,6 +4336,15 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip()); 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, nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame *aFrame,
nsDisplayList *aList, uint32_t aIndex) nsDisplayList *aList, uint32_t aIndex)
: nsDisplayItem(aBuilder, aFrame) : nsDisplayItem(aBuilder, aFrame)
@ -4345,9 +4354,7 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
{ {
MOZ_COUNT_CTOR(nsDisplayTransform); MOZ_COUNT_CTOR(nsDisplayTransform);
NS_ABORT_IF_FALSE(aFrame, "Must have a frame!"); NS_ABORT_IF_FALSE(aFrame, "Must have a frame!");
mReferenceFrame = SetReferenceFrameToAncestor(aBuilder);
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip()); mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip());
} }
@ -4360,9 +4367,7 @@ nsDisplayTransform::nsDisplayTransform(nsDisplayListBuilder* aBuilder, nsIFrame
{ {
MOZ_COUNT_CTOR(nsDisplayTransform); MOZ_COUNT_CTOR(nsDisplayTransform);
NS_ABORT_IF_FALSE(aFrame, "Must have a frame!"); NS_ABORT_IF_FALSE(aFrame, "Must have a frame!");
mReferenceFrame = SetReferenceFrameToAncestor(aBuilder);
aBuilder->FindReferenceFrameFor(GetTransformRootFrame(aFrame));
mToReferenceFrame = aFrame->GetOffsetToCrossDoc(mReferenceFrame);
mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip()); mStoredList.SetClip(aBuilder, DisplayItemClip::NoClip());
} }
@ -5051,7 +5056,7 @@ nsRegion nsDisplayTransform::GetOpaqueRegion(nsDisplayListBuilder *aBuilder,
if (matrix.Is2D(&matrix2d) && if (matrix.Is2D(&matrix2d) &&
matrix2d.PreservesAxisAlignedRectangles() && matrix2d.PreservesAxisAlignedRectangles() &&
mStoredList.GetOpaqueRegion(aBuilder, &tmpSnap).Contains(untransformedVisible)) { mStoredList.GetOpaqueRegion(aBuilder, &tmpSnap).Contains(untransformedVisible)) {
result = mVisibleRect; result = mVisibleRect.Intersect(GetBounds(aBuilder, &tmpSnap));
} }
return result; return result;
} }
@ -5111,7 +5116,7 @@ nsDisplayTransform::TryMerge(nsDisplayListBuilder *aBuilder,
/* Now, move everything over to this frame and signal that /* Now, move everything over to this frame and signal that
* we merged things! * we merged things!
*/ */
mStoredList.MergeFrom(&static_cast<nsDisplayTransform*>(aItem)->mStoredList); mStoredList.MergeFromTrackingMergedFrames(&static_cast<nsDisplayTransform*>(aItem)->mStoredList);
return true; return true;
} }

Просмотреть файл

@ -867,8 +867,10 @@ public:
, mPainted(false) , mPainted(false)
#endif #endif
{ {
mReferenceFrame = aBuilder->FindReferenceFrameFor(aFrame); mReferenceFrame = aBuilder->FindReferenceFrameFor(aFrame, &mToReferenceFrame);
mToReferenceFrame = aBuilder->ToReferenceFrame(aFrame); 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 * This constructor is only used in rare cases when we need to construct
@ -885,7 +887,7 @@ public:
{ {
} }
virtual ~nsDisplayItem() {} virtual ~nsDisplayItem() {}
void* operator new(size_t aSize, void* operator new(size_t aSize,
nsDisplayListBuilder* aBuilder) CPP_THROW_NEW { nsDisplayListBuilder* aBuilder) CPP_THROW_NEW {
return aBuilder->Allocate(aSize); return aBuilder->Allocate(aSize);
@ -2679,14 +2681,11 @@ public:
protected: protected:
nsDisplayWrapList() {} nsDisplayWrapList() {}
void MergeFrom(nsDisplayWrapList* aOther) void MergeFromTrackingMergedFrames(nsDisplayWrapList* aOther)
{ {
mList.AppendToBottom(&aOther->mList); mList.AppendToBottom(&aOther->mList);
mBounds.UnionRect(mBounds, aOther->mBounds); mBounds.UnionRect(mBounds, aOther->mBounds);
} mVisibleRect.UnionRect(mVisibleRect, aOther->mVisibleRect);
void MergeFromTrackingMergedFrames(nsDisplayWrapList* aOther)
{
MergeFrom(aOther);
mMergedFrames.AppendElement(aOther->mFrame); mMergedFrames.AppendElement(aOther->mFrame);
mMergedFrames.MoveElementsFrom(aOther->mMergedFrames); mMergedFrames.MoveElementsFrom(aOther->mMergedFrames);
} }
@ -3428,6 +3427,8 @@ public:
virtual void WriteDebugInfo(nsACString& aTo) MOZ_OVERRIDE; virtual void WriteDebugInfo(nsACString& aTo) MOZ_OVERRIDE;
#endif #endif
private: private:
void SetReferenceFrameToAncestor(nsDisplayListBuilder* aBuilder);
static gfx3DMatrix GetResultingTransformMatrixInternal(const FrameTransformProperties& aProperties, static gfx3DMatrix GetResultingTransformMatrixInternal(const FrameTransformProperties& aProperties,
const nsPoint& aOrigin, const nsPoint& aOrigin,
float aAppUnitsPerPixel, float aAppUnitsPerPixel,