diff options
Diffstat (limited to 'gfx/layers/CanvasRenderer.h')
-rw-r--r-- | gfx/layers/CanvasRenderer.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/gfx/layers/CanvasRenderer.h b/gfx/layers/CanvasRenderer.h new file mode 100644 index 0000000000..ca3ae088cc --- /dev/null +++ b/gfx/layers/CanvasRenderer.h @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 GFX_CANVASRENDERER_H +#define GFX_CANVASRENDERER_H + +#include <memory> // for weak_ptr +#include <stdint.h> // for uint32_t +#include "GLContextTypes.h" // for GLContext +#include "gfxContext.h" // for gfxContext, etc +#include "gfxTypes.h" +#include "gfxPlatform.h" // for gfxImageFormat +#include "mozilla/Assertions.h" // for MOZ_ASSERT, etc +#include "mozilla/Preferences.h" // for Preferences +#include "mozilla/RefPtr.h" // for RefPtr +#include "mozilla/gfx/2D.h" // for DrawTarget +#include "mozilla/mozalloc.h" // for operator delete, etc +#include "mozilla/WeakPtr.h" // for WeakPtr +#include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc + +class nsICanvasRenderingContextInternal; + +namespace mozilla { +namespace layers { + +class ClientCanvasRenderer; +class KnowsCompositor; +class PersistentBufferProvider; +class WebRenderCanvasRendererAsync; + +TextureType TexTypeForWebgl(KnowsCompositor*); + +struct CanvasRendererData final { + CanvasRendererData(); + ~CanvasRendererData(); + + std::weak_ptr<nsICanvasRenderingContextInternal* const> + mContext; // weak_ptr to ptr (bug 1635644) + + // The size of the canvas content + gfx::IntSize mSize = {0, 0}; + + bool mDoPaintCallbacks = false; + bool mIsOpaque = true; + bool mIsAlphaPremult = true; + + gl::OriginPos mOriginPos = gl::OriginPos::TopLeft; + + nsICanvasRenderingContextInternal* GetContext() const { + const auto ptrToPtr = mContext.lock(); + if (!ptrToPtr) return nullptr; + return *ptrToPtr; + } +}; + +// Based class which used for canvas rendering. There are many derived classes +// for different purposes. such as: +// +// ShareableCanvasRenderer provides IPC capabilities that allow sending canvas +// content over IPC. This is pure virtual class because the IPC handling is +// different in different LayerManager. So that we have following classes +// inherit ShareableCanvasRenderer. +// +// ClientCanvasRenderer inherits ShareableCanvasRenderer and be used in +// ClientCanvasLayer. +// WebRenderCanvasRenderer inherits ShareableCanvasRenderer and provides all +// functionality that WebRender uses. +// WebRenderCanvasRendererAsync inherits WebRenderCanvasRenderer and be used in +// layers-free mode of WebRender. +// +// class diagram: +// +// +--------------+ +// |CanvasRenderer| +// +-------+------+ +// ^ +// | +// +-----------+-----------+ +// |ShareableCanvasRenderer| +// +-----+-----------------+ +// ^ ^ +// +-------------+ +-------+ +// | | +// +--------------------+ +---------+-------------+ +// |ClientCanvasRenderer| |WebRenderCanvasRenderer| +// +--------------------+ +-----------+-----------+ +// ^ +// | +// +-------------+--------------+ +// |WebRenderCanvasRendererAsync| +// +----------------------------+ + +class BorrowedSourceSurface final { + public: + const WeakPtr<PersistentBufferProvider> mReturnTo; + const RefPtr<gfx::SourceSurface> mSurf; /// non-null + + BorrowedSourceSurface(PersistentBufferProvider*, RefPtr<gfx::SourceSurface>); + ~BorrowedSourceSurface(); +}; + +// - + +class CanvasRenderer : public RefCounted<CanvasRenderer> { + friend class CanvasRendererSourceSurface; + + public: + MOZ_DECLARE_REFCOUNTED_TYPENAME(CanvasRenderer) + + private: + bool mDirty = false; + + protected: + CanvasRendererData mData; + + public: + explicit CanvasRenderer(); + virtual ~CanvasRenderer(); + + public: + virtual void Initialize(const CanvasRendererData&); + virtual bool IsDataValid(const CanvasRendererData&) const; + + virtual void ClearCachedResources() {} + virtual void DisconnectClient() {} + + const gfx::IntSize& GetSize() const { return mData.mSize; } + bool IsOpaque() const { return mData.mIsOpaque; } + bool YIsDown() const { return mData.mOriginPos == gl::OriginPos::TopLeft; } + + void SetDirty() { mDirty = true; } + void ResetDirty() { mDirty = false; } + bool IsDirty() const { return mDirty; } + + virtual ClientCanvasRenderer* AsClientCanvasRenderer() { return nullptr; } + virtual WebRenderCanvasRendererAsync* AsWebRenderCanvasRendererAsync() { + return nullptr; + } + + std::shared_ptr<BorrowedSourceSurface> BorrowSnapshot( + bool requireAlphaPremult = true) const; + + void FirePreTransactionCallback() const; + void FireDidTransactionCallback() const; +}; + +} // namespace layers +} // namespace mozilla + +#endif |