зеркало из https://github.com/mozilla/gecko-dev.git
Bug 475877. Avoid unnecessary box-shadow repaints by implementing nsDisplayBoxShadow::OptimizeVisibility. r+sr=roc
--HG-- extra : rebase_source : 2e9c673a62ec7866d1f52324f3fc95397cd5abc6
This commit is contained in:
Родитель
21cfb7c08b
Коммит
726d154026
|
@ -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")
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче