Bug 990907 - Have DLBI pick up changes in the char-clip on text frames. r=mstange,mattwoodrow

This commit is contained in:
Kartikaya Gupta 2015-02-25 09:32:28 -05:00
parent f7637d9c23
commit d4629d57fe
5 changed files with 51 additions and 3 deletions

View File

@ -5949,6 +5949,30 @@ nsDisplayTransform::WriteDebugInfo(std::stringstream& aStream)
AppendToString(aStream, GetTransform());
}
nsDisplayItemGeometry*
nsCharClipDisplayItem::AllocateGeometry(nsDisplayListBuilder* aBuilder)
{
return new nsCharClipGeometry(this, aBuilder);
}
void
nsCharClipDisplayItem::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion* aInvalidRegion)
{
const nsCharClipGeometry* geometry = static_cast<const nsCharClipGeometry*>(aGeometry);
bool snap;
nsRect newRect = geometry->mBounds;
nsRect oldRect = GetBounds(aBuilder, &snap);
if (mLeftEdge != geometry->mLeftEdge ||
mRightEdge != geometry->mRightEdge ||
!oldRect.IsEqualInterior(newRect) ||
!geometry->mBorderRect.IsEqualInterior(GetBorderRect())) {
aInvalidRegion->Or(oldRect, newRect);
}
}
nsDisplaySVGEffects::nsDisplaySVGEffects(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame, nsDisplayList* aList)
: nsDisplayWrapList(aBuilder, aFrame, aList),

View File

@ -3687,6 +3687,12 @@ public:
explicit nsCharClipDisplayItem(nsIFrame* aFrame)
: nsDisplayItem(aFrame) {}
virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE;
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion* aInvalidRegion) MOZ_OVERRIDE;
struct ClipEdges {
ClipEdges(const nsDisplayItem& aItem,
nscoord aLeftEdge, nscoord aRightEdge) {

View File

@ -115,3 +115,9 @@ nsDisplaySVGEffectsGeometry::MoveBy(const nsPoint& aOffset)
mBounds.MoveBy(aOffset);
mFrameOffsetToReferenceFrame += aOffset;
}
nsCharClipGeometry::nsCharClipGeometry(nsCharClipDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplayItemGenericGeometry(aItem, aBuilder)
, mLeftEdge(aItem->mLeftEdge)
, mRightEdge(aItem->mRightEdge)
{}

View File

@ -13,6 +13,7 @@
#include "nsColor.h"
#include "gfxRect.h"
class nsCharClipDisplayItem;
class nsDisplayItem;
class nsDisplayListBuilder;
class nsDisplayBackgroundImage;
@ -247,4 +248,13 @@ public:
nsPoint mFrameOffsetToReferenceFrame;
};
class nsCharClipGeometry : public nsDisplayItemGenericGeometry
{
public:
nsCharClipGeometry(nsCharClipDisplayItem* aItem, nsDisplayListBuilder* aBuilder);
nscoord mLeftEdge;
nscoord mRightEdge;
};
#endif /*NSDISPLAYLISTINVALIDATION_H_*/

View File

@ -4554,11 +4554,11 @@ nsTextFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext)
nsFrame::DidSetStyleContext(aOldStyleContext);
}
class nsDisplayTextGeometry : public nsDisplayItemGenericGeometry
class nsDisplayTextGeometry : public nsCharClipGeometry
{
public:
nsDisplayTextGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplayItemGenericGeometry(aItem, aBuilder)
nsDisplayTextGeometry(nsCharClipDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
: nsCharClipGeometry(aItem, aBuilder)
{
nsTextFrame* f = static_cast<nsTextFrame*>(aItem->Frame());
f->GetTextDecorations(f->PresContext(), nsTextFrame::eResolvedColors, mDecorations);
@ -4629,6 +4629,8 @@ public:
nsRect newRect = geometry->mBounds;
nsRect oldRect = GetBounds(aBuilder, &snap);
if (decorations != geometry->mDecorations ||
mLeftEdge != geometry->mLeftEdge ||
mRightEdge != geometry->mRightEdge ||
!oldRect.IsEqualInterior(newRect) ||
!geometry->mBorderRect.IsEqualInterior(GetBorderRect())) {
aInvalidRegion->Or(oldRect, newRect);