Bug 1247452 - Use the effective visible region rather than the visible region where appropriate in the compositor. r=mattwoodrow
MozReview-Commit-ID: 6wbe0kUWh9h
--- a/gfx/layers/LayerTreeInvalidation.cpp
+++ b/gfx/layers/LayerTreeInvalidation.cpp
@@ -118,17 +118,17 @@ NotifySubdocumentInvalidationRecursive(L
if (!container) {
return;
}
for (Layer* child = container->GetFirstChild(); child; child = child->GetNextSibling()) {
NotifySubdocumentInvalidationRecursive(child, aCallback);
}
- aCallback(container, container->GetVisibleRegion().ToUnknownRegion());
+ aCallback(container, container->GetEffectiveVisibleRegion().ToUnknownRegion());
}
struct LayerPropertiesBase : public LayerProperties
{
explicit LayerPropertiesBase(Layer* aLayer)
: mLayer(aLayer)
, mMaskLayer(nullptr)
, mVisibleRegion(aLayer->GetVisibleRegion().ToUnknownRegion())
@@ -228,17 +228,17 @@ struct LayerPropertiesBase : public Laye
}
mLayer->ClearInvalidRect();
return result;
}
IntRect NewTransformedBounds()
{
- return TransformRect(mLayer->GetVisibleRegion().ToUnknownRegion().GetBounds(),
+ return TransformRect(mLayer->GetEffectiveVisibleRegion().ToUnknownRegion().GetBounds(),
GetTransformForInvalidation(mLayer));
}
IntRect OldTransformedBounds()
{
return TransformRect(mVisibleRegion.ToUnknownRegion().GetBounds(), mTransform);
}
@@ -340,17 +340,17 @@ struct ContainerLayerProperties : public
invalidateChildsCurrentArea = true;
}
} else {
// |child| is new, or was reordered to a higher index
invalidateChildsCurrentArea = true;
}
if (invalidateChildsCurrentArea) {
aGeometryChanged = true;
- AddTransformedRegion(result, child->GetVisibleRegion().ToUnknownRegion(),
+ AddTransformedRegion(result, child->GetEffectiveVisibleRegion().ToUnknownRegion(),
GetTransformForInvalidation(child));
if (aCallback) {
NotifySubdocumentInvalidationRecursive(child, aCallback);
} else {
ClearInvalidations(child);
}
}
childrenChanged |= invalidateChildsCurrentArea;
@@ -447,17 +447,17 @@ struct ImageLayerProperties : public Lay
}
}
virtual nsIntRegion ComputeChangeInternal(NotifySubDocInvalidationFunc aCallback,
bool& aGeometryChanged)
{
ImageLayer* imageLayer = static_cast<ImageLayer*>(mLayer.get());
- if (!imageLayer->GetVisibleRegion().ToUnknownRegion().IsEqual(mVisibleRegion)) {
+ if (!imageLayer->GetEffectiveVisibleRegion().ToUnknownRegion().IsEqual(mVisibleRegion)) {
aGeometryChanged = true;
IntRect result = NewTransformedBounds();
result = result.Union(OldTransformedBounds());
return result;
}
ImageContainer* container = imageLayer->GetContainer();
ImageHost* host = GetImageHost(imageLayer);
@@ -589,17 +589,17 @@ LayerPropertiesBase::ComputeDifferences(
{
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().ToUnknownRegion().GetBounds(),
+ IntRect result = TransformRect(aRoot->GetEffectiveVisibleRegion().ToUnknownRegion().GetBounds(),
aRoot->GetLocalTransform());
result = result.Union(OldTransformedBounds());
if (aGeometryChanged != nullptr) {
*aGeometryChanged = true;
}
return result;
} else {
bool geometryChanged = (aGeometryChanged != nullptr) ? *aGeometryChanged : false;
--- a/gfx/layers/Layers.cpp
+++ b/gfx/layers/Layers.cpp
@@ -1296,17 +1296,17 @@ ContainerLayer::Creates3DContextWithExte
bool
ContainerLayer::HasMultipleChildren()
{
uint32_t count = 0;
for (Layer* child = GetFirstChild(); child; child = child->GetNextSibling()) {
const Maybe<ParentLayerIntRect>& clipRect = child->GetEffectiveClipRect();
if (clipRect && clipRect->IsEmpty())
continue;
- if (child->GetVisibleRegion().IsEmpty())
+ if (child->GetEffectiveVisibleRegion().IsEmpty())
continue;
++count;
if (count > 1)
return true;
}
return false;
}
@@ -1412,17 +1412,17 @@ ContainerLayer::DefaultComputeEffectiveT
if (checkClipRect || checkMaskLayers) {
for (Layer* child = GetFirstChild(); child; child = child->GetNextSibling()) {
const Maybe<ParentLayerIntRect>& clipRect = child->GetEffectiveClipRect();
/* We can't (easily) forward our transform to children with a non-empty clip
* rect since it would need to be adjusted for the transform. See
* the calculations performed by CalculateScissorRect above.
* Nor for a child with a mask layer.
*/
- if (checkClipRect && (clipRect && !clipRect->IsEmpty() && !child->GetVisibleRegion().IsEmpty())) {
+ if (checkClipRect && (clipRect && !clipRect->IsEmpty() && !child->GetEffectiveVisibleRegion().IsEmpty())) {
useIntermediateSurface = true;
break;
}
if (checkMaskLayers && child->HasMaskLayers()) {
useIntermediateSurface = true;
break;
}
}
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -78,17 +78,17 @@ WalkTheTree(Layer* aLayer,
bool& aHasRemote,
bool aWillResolvePlugins,
bool& aDidResolvePlugins)
{
if (RefLayer* ref = aLayer->AsRefLayer()) {
aHasRemote = true;
if (const CompositorParent::LayerTreeState* state = CompositorParent::GetIndirectShadowTree(ref->GetReferentId())) {
if (Layer* referent = state->mRoot) {
- if (!ref->GetVisibleRegion().IsEmpty()) {
+ if (!ref->GetEffectiveVisibleRegion().IsEmpty()) {
dom::ScreenOrientationInternal chromeOrientation = aTargetConfig.orientation();
dom::ScreenOrientationInternal contentOrientation = state->mTargetConfig.orientation();
if (!IsSameDimension(chromeOrientation, contentOrientation) &&
ContentMightReflowOnOrientationChange(aTargetConfig.naturalBounds())) {
aReady = false;
}
}
--- a/gfx/layers/ipc/CompositorParent.cpp
+++ b/gfx/layers/ipc/CompositorParent.cpp
@@ -873,17 +873,17 @@ CompositorParent::RecvNotifyRegionInvali
return true;
}
void
CompositorParent::Invalidate()
{
if (mLayerManager && mLayerManager->GetRoot()) {
mLayerManager->AddInvalidRegion(
- mLayerManager->GetRoot()->GetVisibleRegion().ToUnknownRegion().GetBounds());
+ mLayerManager->GetRoot()->GetEffectiveVisibleRegion().ToUnknownRegion().GetBounds());
}
}
bool
CompositorParent::RecvStartFrameTimeRecording(const int32_t& aBufferSize, uint32_t* aOutStartIndex)
{
if (mLayerManager) {
*aOutStartIndex = mLayerManager->StartFrameTimeRecording(aBufferSize);