nsIntRect ComputeChange(NotifySubDocInvalidationFunc aCallback) { bool transformChanged = mTransform != mLayer->GetTransform(); Layer* otherMask = mLayer->GetMaskLayer(); const nsIntRect* otherClip = mLayer->GetClipRect(); nsIntRect result; if ((mMaskLayer ? mMaskLayer->mLayer : nullptr) != otherMask || (mUseClipRect != !!otherClip) || mLayer->GetOpacity() != mOpacity || transformChanged) { result = OldTransformedBounds(); if (transformChanged) { result = result.Union(NewTransformedBounds()); } // If we don't have to generate invalidations separately for child // layers then we can just stop here since we've already invalidated the entire // old and new bounds. if (!aCallback) { ClearInvalidations(mLayer); return result; } } nsIntRegion visible; visible.Xor(mVisibleRegion, mLayer->GetVisibleRegion()); result = result.Union(TransformRect(visible.GetBounds(), mTransform)); result = result.Union(ComputeChangeInternal(aCallback)); result = result.Union(TransformRect(mLayer->GetInvalidRegion().GetBounds(), mTransform)); if (mMaskLayer && otherMask) { nsIntRect maskDiff = mMaskLayer->ComputeChange(aCallback); result = result.Union(TransformRect(maskDiff, mTransform)); } if (mUseClipRect && otherClip) { if (!mClipRect.IsEqualInterior(*otherClip)) { nsIntRegion tmp; tmp.Xor(mClipRect, *otherClip); result = result.Union(tmp.GetBounds()); } } mLayer->ClearInvalidRect(); return result; }
nsIntRegion ComputeChange(NotifySubDocInvalidationFunc aCallback, bool& aGeometryChanged) { bool transformChanged = !mTransform.FuzzyEqual(mLayer->GetLocalTransform()) || mLayer->GetPostXScale() != mPostXScale || mLayer->GetPostYScale() != mPostYScale; Layer* otherMask = mLayer->GetMaskLayer(); const Maybe<ParentLayerIntRect>& otherClip = mLayer->GetClipRect(); nsIntRegion result; if ((mMaskLayer ? mMaskLayer->mLayer : nullptr) != otherMask || (mUseClipRect != !!otherClip) || mLayer->GetLocalOpacity() != mOpacity || transformChanged) { aGeometryChanged = true; result = OldTransformedBounds(); AddRegion(result, NewTransformedBounds()); // We can't bail out early because we need to update mChildrenChanged. } AddRegion(result, ComputeChangeInternal(aCallback, aGeometryChanged)); AddTransformedRegion(result, mLayer->GetInvalidRegion(), mTransform); if (mMaskLayer && otherMask) { AddTransformedRegion(result, mMaskLayer->ComputeChange(aCallback, aGeometryChanged), mTransform); } if (mUseClipRect && otherClip) { if (!mClipRect.IsEqualInterior(*otherClip)) { aGeometryChanged = true; nsIntRegion tmp; tmp.Xor(ParentLayerIntRect::ToUntyped(mClipRect), ParentLayerIntRect::ToUntyped(*otherClip)); AddRegion(result, tmp); } } mLayer->ClearInvalidRect(); return result; }