Bug 822141 - Invalidate bullet display items when their value changes. r=roc

This commit is contained in:
Matt Woodrow
2012-12-21 22:09:23 +13:00
parent 38957f4cf9
commit e2cbb4aeae
2 changed files with 36 additions and 0 deletions

View File

@@ -170,6 +170,19 @@ nsBulletFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext)
#endif
}
class nsDisplayBulletGeometry : public nsDisplayItemGenericGeometry
{
public:
nsDisplayBulletGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplayItemGenericGeometry(aItem, aBuilder)
{
nsBulletFrame* f = static_cast<nsBulletFrame*>(aItem->GetUnderlyingFrame());
mOrdinal = f->GetOrdinal();
}
int32_t mOrdinal;
};
class nsDisplayBullet : public nsDisplayItem {
public:
nsDisplayBullet(nsDisplayListBuilder* aBuilder, nsBulletFrame* aFrame) :
@@ -200,6 +213,27 @@ public:
bool snap;
return GetBounds(aBuilder, &snap);
}
virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder)
{
return new nsDisplayBulletGeometry(this, aBuilder);
}
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion *aInvalidRegion)
{
const nsDisplayBulletGeometry* geometry = static_cast<const nsDisplayBulletGeometry*>(aGeometry);
nsBulletFrame* f = static_cast<nsBulletFrame*>(mFrame);
if (f->GetOrdinal() != geometry->mOrdinal) {
bool snap;
aInvalidRegion->Or(geometry->mBounds, GetBounds(aBuilder, &snap));
return;
}
return nsDisplayItem::ComputeInvalidationRegion(aBuilder, aGeometry, aInvalidRegion);
}
};
void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder,