From 4b66038b85483867e681f96bc761af1076856c2b Mon Sep 17 00:00:00 2001 From: Nicholas Cameron Date: Fri, 23 Aug 2013 13:47:54 +1200 Subject: [PATCH] Bug 893330. Invalidate the frame area for box shadow display list items with border radius. r=mattwoodrow --- layout/base/nsDisplayList.cpp | 27 +++++++++++++++++++++++++++ layout/base/nsDisplayList.h | 13 +------------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 856e62df33ad..2735193d202b 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -2619,6 +2619,33 @@ nsDisplayBoxShadowOuter::ComputeVisibility(nsDisplayListBuilder* aBuilder, return !RoundedRectContainsRect(frameRect, twipsRadii, visibleBounds); } +void +nsDisplayBoxShadowOuter::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder, + const nsDisplayItemGeometry* aGeometry, + nsRegion* aInvalidRegion) +{ + const nsDisplayItemGenericGeometry* geometry = + static_cast(aGeometry); + bool snap; + if (!geometry->mBounds.IsEqualInterior(GetBounds(aBuilder, &snap)) || + !geometry->mBorderRect.IsEqualInterior(GetBorderRect())) { + nsRegion oldShadow, newShadow; + nscoord dontCare[8]; + bool hasBorderRadius = mFrame->GetBorderRadii(dontCare); + if (hasBorderRadius) { + // If we have rounded corners then we need to invalidate the frame area + // too since we paint into it. + oldShadow = geometry->mBounds; + newShadow = GetBounds(aBuilder, &snap); + } else { + oldShadow = oldShadow.Sub(geometry->mBounds, geometry->mBorderRect); + newShadow = newShadow.Sub(GetBounds(aBuilder, &snap), GetBorderRect()); + } + aInvalidRegion->Or(oldShadow, newShadow); + } +} + + void nsDisplayBoxShadowInner::Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) { diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 161ad7853d41..5393550f7bdd 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -2204,18 +2204,7 @@ public: virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder, const nsDisplayItemGeometry* aGeometry, - nsRegion* aInvalidRegion) - { - const nsDisplayItemGenericGeometry* geometry = static_cast(aGeometry); - bool snap; - if (!geometry->mBounds.IsEqualInterior(GetBounds(aBuilder, &snap)) || - !geometry->mBorderRect.IsEqualInterior(GetBorderRect())) { - nsRegion oldShadow, newShadow; - oldShadow = oldShadow.Sub(geometry->mBounds, geometry->mBorderRect); - newShadow = newShadow.Sub(GetBounds(aBuilder, &snap), GetBorderRect()); - aInvalidRegion->Or(oldShadow, newShadow); - } - } + nsRegion* aInvalidRegion); nsRect GetBoundsInternal();