michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef MOZILLA_GFX_CANVASCLIENT_H michael@0: #define MOZILLA_GFX_CANVASCLIENT_H michael@0: michael@0: #include "mozilla/Assertions.h" // for MOZ_ASSERT, etc michael@0: #include "mozilla/Attributes.h" // for MOZ_OVERRIDE michael@0: #include "mozilla/RefPtr.h" // for RefPtr, TemporaryRef michael@0: #include "mozilla/layers/CompositableClient.h" // for CompositableClient michael@0: #include "mozilla/layers/CompositorTypes.h" // for TextureInfo, etc michael@0: #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor michael@0: #include "mozilla/layers/TextureClient.h" // for TextureClient, etc michael@0: #include "mozilla/mozalloc.h" // for operator delete michael@0: michael@0: #include "mozilla/gfx/Point.h" // for IntSize michael@0: #include "mozilla/gfx/Types.h" // for SurfaceFormat michael@0: michael@0: namespace mozilla { michael@0: namespace gfx { michael@0: class SharedSurface; michael@0: } michael@0: } michael@0: michael@0: namespace mozilla { michael@0: namespace layers { michael@0: michael@0: class ClientCanvasLayer; michael@0: class CompositableForwarder; michael@0: michael@0: /** michael@0: * Compositable client for 2d and webgl canvas. michael@0: */ michael@0: class CanvasClient : public CompositableClient michael@0: { michael@0: public: michael@0: /** michael@0: * Creates, configures, and returns a new canvas client. If necessary, a michael@0: * message will be sent to the compositor to create a corresponding image michael@0: * host. michael@0: */ michael@0: enum CanvasClientType { michael@0: CanvasClientSurface, michael@0: CanvasClientGLContext, michael@0: }; michael@0: static TemporaryRef CreateCanvasClient(CanvasClientType aType, michael@0: CompositableForwarder* aFwd, michael@0: TextureFlags aFlags); michael@0: michael@0: CanvasClient(CompositableForwarder* aFwd, TextureFlags aFlags) michael@0: : CompositableClient(aFwd, aFlags) michael@0: { michael@0: mTextureInfo.mTextureFlags = aFlags; michael@0: } michael@0: michael@0: virtual ~CanvasClient() {} michael@0: michael@0: virtual void Clear() {}; michael@0: michael@0: virtual void Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) = 0; michael@0: michael@0: virtual void Updated() { } michael@0: michael@0: protected: michael@0: TextureInfo mTextureInfo; michael@0: }; michael@0: michael@0: // Used for 2D canvases and WebGL canvas on non-GL systems where readback is requried. michael@0: class CanvasClient2D : public CanvasClient michael@0: { michael@0: public: michael@0: CanvasClient2D(CompositableForwarder* aLayerForwarder, michael@0: TextureFlags aFlags) michael@0: : CanvasClient(aLayerForwarder, aFlags) michael@0: { michael@0: } michael@0: michael@0: TextureInfo GetTextureInfo() const michael@0: { michael@0: return TextureInfo(COMPOSITABLE_IMAGE); michael@0: } michael@0: michael@0: virtual void Clear() MOZ_OVERRIDE michael@0: { michael@0: mBuffer = nullptr; michael@0: } michael@0: michael@0: virtual void Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) MOZ_OVERRIDE; michael@0: michael@0: virtual bool AddTextureClient(TextureClient* aTexture) MOZ_OVERRIDE michael@0: { michael@0: MOZ_ASSERT((mTextureInfo.mTextureFlags & aTexture->GetFlags()) == mTextureInfo.mTextureFlags); michael@0: return CompositableClient::AddTextureClient(aTexture); michael@0: } michael@0: michael@0: virtual void OnDetach() MOZ_OVERRIDE michael@0: { michael@0: mBuffer = nullptr; michael@0: } michael@0: michael@0: private: michael@0: RefPtr mBuffer; michael@0: }; michael@0: michael@0: // Used for GL canvases where we don't need to do any readback, i.e., with a michael@0: // GL backend. michael@0: class CanvasClientSurfaceStream : public CanvasClient michael@0: { michael@0: public: michael@0: CanvasClientSurfaceStream(CompositableForwarder* aLayerForwarder, TextureFlags aFlags); michael@0: michael@0: TextureInfo GetTextureInfo() const michael@0: { michael@0: return TextureInfo(COMPOSITABLE_IMAGE); michael@0: } michael@0: michael@0: virtual void Clear() MOZ_OVERRIDE michael@0: { michael@0: mBuffer = nullptr; michael@0: } michael@0: michael@0: virtual void Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) MOZ_OVERRIDE; michael@0: michael@0: virtual void OnDetach() MOZ_OVERRIDE michael@0: { michael@0: mBuffer = nullptr; michael@0: } michael@0: michael@0: private: michael@0: RefPtr mBuffer; michael@0: }; michael@0: michael@0: } michael@0: } michael@0: michael@0: #endif