Bug 475877. Avoid unnecessary box-shadow repaints by implementing nsDisplayBoxShadow::OptimizeVisibility. r+sr=roc

--HG--
extra : rebase_source : 2e9c673a62ec7866d1f52324f3fc95397cd5abc6
This commit is contained in:
Michael Ventnor 2009-01-30 20:03:46 +13:00
Родитель 21cfb7c08b
Коммит 726d154026
2 изменённых файлов: 19 добавлений и 0 удалений

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

@ -659,6 +659,24 @@ nsDisplayBoxShadow::GetBounds(nsDisplayListBuilder* aBuilder) {
return mFrame->GetOverflowRect() + aBuilder->ToReferenceFrame(mFrame);
}
PRBool
nsDisplayBoxShadow::OptimizeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion) {
if (!nsDisplayItem::OptimizeVisibility(aBuilder, aVisibleRegion))
return PR_FALSE;
const nsStyleBorder* border = mFrame->GetStyleBorder();
nsPoint origin = aBuilder->ToReferenceFrame(mFrame);
if (nsRect(origin, mFrame->GetSize()).Contains(aVisibleRegion->GetBounds()) &&
!nsLayoutUtils::HasNonZeroCorner(border->mBorderRadius)) {
// the visible region is entirely inside the border-rect, and box shadows
// never render within the border-rect (unless there's a border radius).
return PR_FALSE;
}
return PR_TRUE;
}
nsDisplayWrapList::nsDisplayWrapList(nsIFrame* aFrame, nsDisplayList* aList)
: nsDisplayItem(aFrame) {
mList.AppendToTop(aList);

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

@ -1053,6 +1053,7 @@ public:
virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx,
const nsRect& aDirtyRect);
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
virtual PRBool OptimizeVisibility(nsDisplayListBuilder* aBuilder, nsRegion* aVisibleRegion);
NS_DISPLAY_DECL_NAME("BoxShadow")
};