From 9de30fca2d10ad29e2c1ae6fee40a5437bad41ab Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Fri, 10 Feb 2012 11:22:21 -0800 Subject: [PATCH] Bug 725925 - ShadowableThebesLayer does useless extra composite into 1x1 fake surface. r=cjones --- gfx/layers/basic/BasicLayers.cpp | 28 ++++++++++++++++++---------- widget/xpwidgets/PuppetWidget.cpp | 2 ++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gfx/layers/basic/BasicLayers.cpp b/gfx/layers/basic/BasicLayers.cpp index 3a8252f2f28..e2640763ef1 100644 --- a/gfx/layers/basic/BasicLayers.cpp +++ b/gfx/layers/basic/BasicLayers.cpp @@ -763,7 +763,9 @@ BasicThebesLayer::PaintThebes(gfxContext* aContext, if (BasicManager()->IsTransactionIncomplete()) return; - if (!IsHidden()) { + gfxRect clipExtents; + clipExtents = aContext->GetClipExtents(); + if (!IsHidden() && !clipExtents.IsEmpty()) { AutoSetOperator setOperator(aContext, GetOperator()); mBuffer.DrawTo(this, aContext, opacity); } @@ -1946,16 +1948,22 @@ BasicLayerManager::PaintLayer(gfxContext* aTarget, NS_ABORT_IF_FALSE(untransformedSurface, "We should always allocate an untransformed surface with 3d transforms!"); - gfxPoint offset; - bool dontBlit = needsClipToVisibleRegion || mTransactionIncomplete || - aLayer->GetEffectiveOpacity() != 1.0f; - nsRefPtr result = - Transform3D(untransformedSurface, aTarget, bounds, - effectiveTransform, offset, dontBlit); + // Temporary fast fix for bug 725886 + // Revert these changes when 725886 is ready + gfxRect clipExtents; + clipExtents = aTarget->GetClipExtents(); + if (!clipExtents.IsEmpty()) { + gfxPoint offset; + bool dontBlit = needsClipToVisibleRegion || mTransactionIncomplete || + aLayer->GetEffectiveOpacity() != 1.0f; + nsRefPtr result = + Transform3D(untransformedSurface, aTarget, bounds, + effectiveTransform, offset, dontBlit); - blitComplete = !result; - if (result) { - aTarget->SetSource(result, offset); + blitComplete = !result; + if (result) { + aTarget->SetSource(result, offset); + } } } // If we're doing our own double-buffering, we need to avoid drawing diff --git a/widget/xpwidgets/PuppetWidget.cpp b/widget/xpwidgets/PuppetWidget.cpp index 9327c6deff9..1657802dfb9 100644 --- a/widget/xpwidgets/PuppetWidget.cpp +++ b/widget/xpwidgets/PuppetWidget.cpp @@ -530,6 +530,8 @@ PuppetWidget::DispatchPaintEvent() DispatchEvent(&event, status); } else { nsRefPtr ctx = new gfxContext(mSurface); + ctx->Rectangle(gfxRect(0,0,0,0)); + ctx->Clip(); AutoLayerManagerSetup setupLayerManager(this, ctx, BasicLayerManager::BUFFER_NONE); DispatchEvent(&event, status);