nsIntRegion LayerPropertiesBase::ComputeDifferences(Layer* aRoot, NotifySubDocInvalidationFunc aCallback, bool* aGeometryChanged = nullptr) { NS_ASSERTION(aRoot, "Must have a layer tree to compare against!"); if (mLayer != aRoot) { if (aCallback) { NotifySubdocumentInvalidationRecursive(aRoot, aCallback); } else { ClearInvalidations(aRoot); } IntRect result = TransformRect(aRoot->GetVisibleRegion().GetBounds(), aRoot->GetLocalTransform()); result = result.Union(OldTransformedBounds()); if (aGeometryChanged != nullptr) { *aGeometryChanged = true; } return result; } else { bool geometryChanged = (aGeometryChanged != nullptr) ? *aGeometryChanged : false; nsIntRegion invalid = ComputeChange(aCallback, geometryChanged); if (aGeometryChanged != nullptr) { *aGeometryChanged = geometryChanged; } return invalid; } }
virtual nsIntRegion ComputeChangeInternal(NotifySubDocInvalidationFunc aCallback, bool& aGeometryChanged) { ImageLayer* imageLayer = static_cast<ImageLayer*>(mLayer.get()); if (!imageLayer->GetVisibleRegion().IsEqual(mVisibleRegion)) { aGeometryChanged = true; IntRect result = NewTransformedBounds(); result = result.Union(OldTransformedBounds()); return result; } ImageContainer* container = imageLayer->GetContainer(); if (mContainer != container || mFilter != imageLayer->GetFilter() || mScaleToSize != imageLayer->GetScaleToSize() || mScaleMode != imageLayer->GetScaleMode()) { aGeometryChanged = true; if (mIsMask) { // Mask layers have an empty visible region, so we have to // use the image size instead. IntSize size = container->GetCurrentSize(); IntRect rect(0, 0, size.width, size.height); return TransformRect(rect, mLayer->GetLocalTransform()); } else { return NewTransformedBounds(); } } return IntRect(); }