зеркало из https://github.com/mozilla/gecko-dev.git
Bug 893330. Invalidate the frame area for box shadow display list items with border radius. r=mattwoodrow
This commit is contained in:
Родитель
55c86011bd
Коммит
4b66038b85
|
@ -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<const nsDisplayItemGenericGeometry*>(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) {
|
||||
|
|
|
@ -2204,18 +2204,7 @@ public:
|
|||
|
||||
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
|
||||
const nsDisplayItemGeometry* aGeometry,
|
||||
nsRegion* aInvalidRegion)
|
||||
{
|
||||
const nsDisplayItemGenericGeometry* geometry = static_cast<const nsDisplayItemGenericGeometry*>(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();
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче