Bug 1039145 - Part 1: Clean up AreComponentAlphaLayersEnabled. r=roc

This commit is contained in:
Matt Woodrow 2014-07-18 18:48:23 +12:00
parent 10606c58a7
commit 865651f293
5 changed files with 27 additions and 14 deletions

View File

@ -155,6 +155,12 @@ LayerManager::CreateAsynchronousImageContainer()
return container.forget();
}
bool
LayerManager::AreComponentAlphaLayersEnabled()
{
return gfxPrefs::ComponentAlphaEnabled();
}
//--------------------------------------------------
// Layer
@ -1023,7 +1029,8 @@ ContainerLayer::DefaultComputeEffectiveTransforms(const Matrix4x4& aTransformToS
void
ContainerLayer::DefaultComputeSupportsComponentAlphaChildren(bool* aNeedsSurfaceCopy)
{
if (!(GetContentFlags() & Layer::CONTENT_COMPONENT_ALPHA_DESCENDANT)) {
if (!(GetContentFlags() & Layer::CONTENT_COMPONENT_ALPHA_DESCENDANT) ||
!Manager()->AreComponentAlphaLayersEnabled()) {
mSupportsComponentAlphaChildren = false;
if (aNeedsSurfaceCopy) {
*aNeedsSurfaceCopy = false;
@ -1031,32 +1038,30 @@ ContainerLayer::DefaultComputeSupportsComponentAlphaChildren(bool* aNeedsSurface
return;
}
bool supportsComponentAlphaChildren = false;
mSupportsComponentAlphaChildren = false;
bool needsSurfaceCopy = false;
CompositionOp blendMode = GetEffectiveMixBlendMode();
if (UseIntermediateSurface()) {
if (GetEffectiveVisibleRegion().GetNumRects() == 1 &&
(GetContentFlags() & Layer::CONTENT_OPAQUE))
{
supportsComponentAlphaChildren = true;
mSupportsComponentAlphaChildren = true;
} else {
gfx::Matrix transform;
if (HasOpaqueAncestorLayer(this) &&
GetEffectiveTransform().Is2D(&transform) &&
!gfx::ThebesMatrix(transform).HasNonIntegerTranslation() &&
blendMode == gfx::CompositionOp::OP_OVER) {
supportsComponentAlphaChildren = true;
mSupportsComponentAlphaChildren = true;
needsSurfaceCopy = true;
}
}
} else if (blendMode == gfx::CompositionOp::OP_OVER) {
supportsComponentAlphaChildren =
mSupportsComponentAlphaChildren =
(GetContentFlags() & Layer::CONTENT_OPAQUE) ||
(GetParent() && GetParent()->SupportsComponentAlphaChildren());
}
mSupportsComponentAlphaChildren = supportsComponentAlphaChildren &&
gfxPrefs::ComponentAlphaEnabled();
if (aNeedsSurfaceCopy) {
*aNeedsSurfaceCopy = mSupportsComponentAlphaChildren && needsSurfaceCopy;
}

View File

@ -308,12 +308,20 @@ public:
bool IsSnappingEffectiveTransforms() { return mSnapEffectiveTransforms; }
/**
* Returns true if the layer manager can't render component alpha
* layers, and layer building should do it's best to avoid
* creating them.
*/
virtual bool ShouldAvoidComponentAlphaLayers() { return false; }
/**
* Returns true if this LayerManager can properly support layers with
* SurfaceMode::SURFACE_COMPONENT_ALPHA. This can include disabling component
* alpha if required.
* SurfaceMode::SURFACE_COMPONENT_ALPHA. LayerManagers that can't will use
* transparent surfaces (and lose subpixel-AA for text).
*/
virtual bool AreComponentAlphaLayersEnabled() { return true; }
virtual bool AreComponentAlphaLayersEnabled();
/**
* CONSTRUCTION PHASE ONLY

View File

@ -105,7 +105,7 @@ public:
virtual void EndTransaction(DrawThebesLayerCallback aCallback,
void* aCallbackData,
EndTransactionFlags aFlags = END_DEFAULT);
virtual bool AreComponentAlphaLayersEnabled() { return !IsWidgetLayerManager(); }
virtual bool ShouldAvoidComponentAlphaLayers() { return IsWidgetLayerManager(); }
void AbortTransaction();

View File

@ -146,7 +146,7 @@ public:
CompositorChild* GetCompositorChild();
// Disable component alpha layers with the software compositor.
virtual bool AreComponentAlphaLayersEnabled() MOZ_OVERRIDE { return IsCompositingCheap(); }
virtual bool ShouldAvoidComponentAlphaLayers() { return !IsCompositingCheap(); }
/**
* Called for each iteration of a progressive tile update. Updates

View File

@ -3419,7 +3419,7 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
int32_t appUnitsPerDevPixel;
uint32_t stateFlags = 0;
if ((aContainerFrame->GetStateBits() & NS_FRAME_NO_COMPONENT_ALPHA) &&
mRetainingManager && !mRetainingManager->AreComponentAlphaLayersEnabled()) {
mRetainingManager && mRetainingManager->ShouldAvoidComponentAlphaLayers()) {
stateFlags = ContainerState::NO_COMPONENT_ALPHA;
}
uint32_t flags;
@ -3441,7 +3441,7 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
if (hasComponentAlphaChildren &&
mRetainingManager &&
!mRetainingManager->AreComponentAlphaLayersEnabled() &&
mRetainingManager->ShouldAvoidComponentAlphaLayers() &&
containerLayer->HasMultipleChildren() &&
!stateFlags) {
// Since we don't want any component alpha layers on BasicLayers, we repeat