Bug 1315477 - Add a AsBasicLayerManager() function and use instead of static_casts. r?mattwoodrow
MozReview-Commit-ID: DV6XZBEXw85
--- a/gfx/layers/Layers.h
+++ b/gfx/layers/Layers.h
@@ -72,16 +72,17 @@ class OverfillCallback;
} // namespace dom
namespace layers {
class Animation;
class AnimationData;
class AsyncCanvasRenderer;
class AsyncPanZoomController;
+class BasicLayerManager;
class ClientLayerManager;
class Layer;
class LayerMetricsWrapper;
class PaintedLayer;
class ContainerLayer;
class ImageLayer;
class ColorLayer;
class CanvasLayer;
@@ -191,16 +192,19 @@ public:
{ return nullptr; }
virtual LayerManagerComposite* AsLayerManagerComposite()
{ return nullptr; }
virtual ClientLayerManager* AsClientLayerManager()
{ return nullptr; }
+ virtual BasicLayerManager* AsBasicLayerManager()
+ { return nullptr; }
+
/**
* Returns true if this LayerManager is owned by an nsIWidget,
* and is used for drawing into the widget.
*/
virtual bool IsWidgetLayerManager() { return true; }
virtual bool IsInactiveLayerManager() { return false; }
/**
--- a/gfx/layers/basic/BasicLayers.h
+++ b/gfx/layers/basic/BasicLayers.h
@@ -69,16 +69,18 @@ public:
* ClearWidget before the widget dies.
*/
explicit BasicLayerManager(nsIWidget* aWidget);
protected:
virtual ~BasicLayerManager();
public:
+ BasicLayerManager* AsBasicLayerManager() override { return this; }
+
/**
* Set the default target context that will be used when BeginTransaction
* is called. This can only be called outside a transaction.
*
* aDoubleBuffering can request double-buffering for drawing to the
* default target. When BUFFERED, the layer manager avoids blitting
* temporary results to aContext and then overpainting them with final
* results, by using a temporary buffer when necessary. In BUFFERED
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -386,17 +386,17 @@ public:
const nsPoint& aOffset)
: mBuilder(aBuilder), mLayerManager(aManager),
mOffset(aOffset) {}
virtual DrawResult Paint(gfxContext& aContext, nsIFrame *aTarget,
const gfxMatrix& aTransform,
const nsIntRect* aDirtyRect) override
{
- BasicLayerManager* basic = static_cast<BasicLayerManager*>(mLayerManager);
+ BasicLayerManager* basic = mLayerManager->AsBasicLayerManager();
basic->SetTarget(&aContext);
gfxPoint devPixelOffset =
nsLayoutUtils::PointToGfxPoint(-mOffset,
aTarget->PresContext()->AppUnitsPerDevPixel());
gfxContextMatrixAutoSaveRestore autoSR(&aContext);
aContext.SetMatrix(aContext.CurrentMatrix().Translate(devPixelOffset));
@@ -845,17 +845,17 @@ nsSVGIntegrationUtils::PaintMaskAndClipP
clipPathFrame->ApplyClipPath(context, frame, cssPxToDevPxMatrix);
} else {
nsCSSClipPathInstance::ApplyBasicShapeClip(context, frame);
}
}
/* Paint the child */
context.SetMatrix(matrixAutoSaveRestore.Matrix());
- BasicLayerManager* basic = static_cast<BasicLayerManager*>(aParams.layerManager);
+ BasicLayerManager* basic = aParams.layerManager->AsBasicLayerManager();
RefPtr<gfxContext> oldCtx = basic->GetTarget();
basic->SetTarget(&context);
aParams.layerManager->EndTransaction(FrameLayerBuilder::DrawPaintedLayer,
aParams.builder);
basic->SetTarget(oldCtx);
if (shouldApplyClipPath || shouldApplyBasicShape) {
context.PopClip();
--- a/widget/PuppetWidget.cpp
+++ b/widget/PuppetWidget.cpp
@@ -1076,17 +1076,17 @@ PuppetWidget::Paint()
"PuppetWidget", 0);
#endif
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == mLayerManager->GetBackendType()) {
// Do nothing, the compositor will handle drawing
if (mTabChild) {
mTabChild->NotifyPainted();
}
- } else {
+ } else if (mozilla::layers::LayersBackend::LAYERS_BASIC == mLayerManager->GetBackendType()) {
RefPtr<gfxContext> ctx = gfxContext::CreateOrNull(mDrawTarget);
if (!ctx) {
gfxDevCrash(LogReason::InvalidContext) << "PuppetWidget context problem " << gfx::hexa(mDrawTarget);
return NS_ERROR_FAILURE;
}
ctx->Rectangle(gfxRect(0,0,0,0));
ctx->Clip();
AutoLayerManagerSetup setupLayerManager(this, ctx,
--- a/widget/nsBaseWidget.cpp
+++ b/widget/nsBaseWidget.cpp
@@ -370,19 +370,20 @@ nsBaseWidget::FreeShutdownObserver()
// nsBaseWidget destructor
//
//-------------------------------------------------------------------------
nsBaseWidget::~nsBaseWidget()
{
IMEStateManager::WidgetDestroyed(this);
- if (mLayerManager &&
- mLayerManager->GetBackendType() == LayersBackend::LAYERS_BASIC) {
- static_cast<BasicLayerManager*>(mLayerManager.get())->ClearRetainerWidget();
+ if (mLayerManager) {
+ if (BasicLayerManager* mgr = mLayerManager->AsBasicLayerManager()) {
+ mgr->ClearRetainerWidget();
+ }
}
FreeShutdownObserver();
DestroyLayerManager();
#ifdef NOISY_WIDGET_LEAKS
gNumWidgets--;
printf("WIDGETS- = %d\n", gNumWidgets);
@@ -901,30 +902,31 @@ nsBaseWidget::MakeFullScreen(bool aFullS
return NS_OK;
}
nsBaseWidget::AutoLayerManagerSetup::AutoLayerManagerSetup(
nsBaseWidget* aWidget, gfxContext* aTarget,
BufferMode aDoubleBuffering, ScreenRotation aRotation)
: mWidget(aWidget)
{
- mLayerManager = static_cast<BasicLayerManager*>(mWidget->GetLayerManager());
- if (mLayerManager) {
- NS_ASSERTION(mLayerManager->GetBackendType() == LayersBackend::LAYERS_BASIC,
- "AutoLayerManagerSetup instantiated for non-basic layer backend!");
- mLayerManager->SetDefaultTarget(aTarget);
- mLayerManager->SetDefaultTargetConfiguration(aDoubleBuffering, aRotation);
+ LayerManager* lm = mWidget->GetLayerManager();
+ NS_ASSERTION(!lm || lm->GetBackendType() == LayersBackend::LAYERS_BASIC,
+ "AutoLayerManagerSetup instantiated for non-basic layer backend!");
+ if (lm) {
+ mLayerManager = lm->AsBasicLayerManager();
+ if (mLayerManager) {
+ mLayerManager->SetDefaultTarget(aTarget);
+ mLayerManager->SetDefaultTargetConfiguration(aDoubleBuffering, aRotation);
+ }
}
}
nsBaseWidget::AutoLayerManagerSetup::~AutoLayerManagerSetup()
{
if (mLayerManager) {
- NS_ASSERTION(mLayerManager->GetBackendType() == LayersBackend::LAYERS_BASIC,
- "AutoLayerManagerSetup instantiated for non-basic layer backend!");
mLayerManager->SetDefaultTarget(nullptr);
mLayerManager->SetDefaultTargetConfiguration(mozilla::layers::BufferMode::BUFFER_NONE, ROTATION_0);
}
}
bool nsBaseWidget::IsSmallPopup() const
{
return mWindowType == eWindowType_popup && mPopupType != ePopupTypePanel;