mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-07 19:59:18 +02:00
CompositorWidgetChild is about to be responsible for creating, destroying, and presenting a shared buffer that CompositorWidgetParent will draw into. To do this, it will need the window handle, transparency mode changes, window size changes, and window size mode changes. Its creation is also about to become fallible, so it needs a separate initialization routine. Differential Revision: https://phabricator.services.mozilla.com/D57430 --HG-- extra : moz-landing-system : lando
101 lines
3.4 KiB
C++
101 lines
3.4 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef widget_windows_InProcessWinCompositorWidget_h
|
|
#define widget_windows_InProcessWinCompositorWidget_h
|
|
|
|
#include "WinCompositorWidget.h"
|
|
|
|
class nsWindow;
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
// This is the Windows-specific implementation of CompositorWidget. For
|
|
// the most part it only requires an HWND, however it maintains extra state
|
|
// for transparent windows, as well as for synchronizing WM_SETTEXT messages
|
|
// with the compositor.
|
|
class InProcessWinCompositorWidget final
|
|
: public WinCompositorWidget,
|
|
public PlatformCompositorWidgetDelegate {
|
|
public:
|
|
InProcessWinCompositorWidget(const WinCompositorWidgetInitData& aInitData,
|
|
const layers::CompositorOptions& aOptions,
|
|
nsWindow* aWindow);
|
|
|
|
bool PreRender(WidgetRenderingContext*) override;
|
|
void PostRender(WidgetRenderingContext*) override;
|
|
already_AddRefed<gfx::DrawTarget> StartRemoteDrawing() override;
|
|
void EndRemoteDrawing() override;
|
|
bool NeedsToDeferEndRemoteDrawing() override;
|
|
LayoutDeviceIntSize GetClientSize() override;
|
|
already_AddRefed<gfx::DrawTarget> GetBackBufferDrawTarget(
|
|
gfx::DrawTarget* aScreenTarget, const gfx::IntRect& aRect,
|
|
bool* aOutIsCleared) override;
|
|
already_AddRefed<gfx::SourceSurface> EndBackBufferDrawing() override;
|
|
bool InitCompositor(layers::Compositor* aCompositor) override;
|
|
CompositorWidgetDelegate* AsDelegate() override { return this; }
|
|
bool IsHidden() const override;
|
|
|
|
// PlatformCompositorWidgetDelegate Overrides
|
|
|
|
void EnterPresentLock() override;
|
|
void LeavePresentLock() override;
|
|
void OnDestroyWindow() override;
|
|
bool OnWindowResize(const LayoutDeviceIntSize& aSize) override;
|
|
void OnWindowModeChange(nsSizeMode aSizeMode) override;
|
|
void UpdateTransparency(nsTransparencyMode aMode) override;
|
|
void ClearTransparentWindow() override;
|
|
|
|
bool RedrawTransparentWindow();
|
|
|
|
// Ensure that a transparent surface exists, then return it.
|
|
RefPtr<gfxASurface> EnsureTransparentSurface();
|
|
|
|
HDC GetTransparentDC() const { return mMemoryDC; }
|
|
|
|
mozilla::Mutex& GetTransparentSurfaceLock() {
|
|
return mTransparentSurfaceLock;
|
|
}
|
|
|
|
bool HasGlass() const override;
|
|
|
|
void ObserveVsync(VsyncObserver* aObserver) override;
|
|
nsIWidget* RealWidget() override;
|
|
|
|
void UpdateCompositorWnd(const HWND aCompositorWnd,
|
|
const HWND aParentWnd) override {}
|
|
void SetRootLayerTreeID(const layers::LayersId& aRootLayerTreeId) override {}
|
|
|
|
private:
|
|
HDC GetWindowSurface();
|
|
void FreeWindowSurface(HDC dc);
|
|
|
|
void CreateTransparentSurface(const gfx::IntSize& aSize);
|
|
|
|
nsWindow* mWindow;
|
|
|
|
HWND mWnd;
|
|
|
|
gfx::CriticalSection mPresentLock;
|
|
|
|
// Transparency handling.
|
|
mozilla::Mutex mTransparentSurfaceLock;
|
|
mozilla::Atomic<nsTransparencyMode, MemoryOrdering::Relaxed>
|
|
mTransparencyMode;
|
|
RefPtr<gfxASurface> mTransparentSurface;
|
|
HDC mMemoryDC;
|
|
HDC mCompositeDC;
|
|
|
|
// Locked back buffer of BasicCompositor
|
|
uint8_t* mLockedBackBufferData;
|
|
|
|
bool mNotDeferEndRemoteDrawing;
|
|
};
|
|
|
|
} // namespace widget
|
|
} // namespace mozilla
|
|
|
|
#endif // widget_windows_InProcessWinCompositorWidget_h
|