author | Kartikaya Gupta <kgupta@mozilla.com> |
Mon, 07 Nov 2016 11:38:45 -0500 | |
changeset 321572 | a229fb665939c49ae5dbccd0717882aa65f8029b |
parent 321571 | 9f208d6e52c51b0263f8989f09bdcbc9bf9abddc |
child 321573 | 7e604b351f4faaa1f602c02dbae5639ce4d16b47 |
push id | 83647 |
push user | kwierso@gmail.com |
push date | Tue, 08 Nov 2016 22:08:41 +0000 |
treeherder | mozilla-inbound@1d0b02250149 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | mattwoodrow |
bugs | 1315477 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- 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;