/* -*- Mode: C++; tab-width: 20; 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 MOZILLA_GFX_IMAGEHOST_H #define MOZILLA_GFX_IMAGEHOST_H #include // for FILE, NULL #include "CompositableHost.h" // for CompositableHost #include "mozilla/Attributes.h" // for MOZ_OVERRIDE #include "mozilla/RefPtr.h" // for RefPtr #include "mozilla/gfx/Point.h" // for Point #include "mozilla/gfx/Rect.h" // for Rect #include "mozilla/gfx/Types.h" // for Filter #include "mozilla/layers/CompositorTypes.h" // for TextureInfo, etc #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor #include "mozilla/layers/LayersTypes.h" // for LayerRenderState, etc #include "mozilla/layers/TextureHost.h" // for DeprecatedTextureHost, etc #include "mozilla/mozalloc.h" // for operator delete #include "nsCOMPtr.h" // for already_AddRefed #include "nsRect.h" // for nsIntRect #include "nscore.h" // for nsACString class gfxImageSurface; class nsIntRegion; namespace mozilla { namespace gfx { class Matrix4x4; } namespace layers { class Compositor; class ISurfaceAllocator; struct EffectChain; /** * ImageHost. Works with ImageClientSingle and ImageClientBuffered */ class ImageHost : public CompositableHost { public: ImageHost(const TextureInfo& aTextureInfo); ~ImageHost(); virtual CompositableType GetType() { return mTextureInfo.mCompositableType; } virtual void Composite(EffectChain& aEffectChain, float aOpacity, const gfx::Matrix4x4& aTransform, const gfx::Point& aOffset, const gfx::Filter& aFilter, const gfx::Rect& aClipRect, const nsIntRegion* aVisibleRegion = nullptr, TiledLayerProperties* aLayerProperties = nullptr) MOZ_OVERRIDE; virtual void UseTextureHost(TextureHost* aTexture) MOZ_OVERRIDE; virtual void RemoveTextureHost(uint64_t aTextureID) MOZ_OVERRIDE; virtual TextureHost* GetTextureHost() MOZ_OVERRIDE; virtual void SetPictureRect(const nsIntRect& aPictureRect) MOZ_OVERRIDE { mPictureRect = aPictureRect; mHasPictureRect = true; } virtual LayerRenderState GetRenderState() MOZ_OVERRIDE; #ifdef MOZ_LAYERS_HAVE_LOG virtual void PrintInfo(nsACString& aTo, const char* aPrefix); #endif #ifdef MOZ_DUMP_PAINTING virtual void Dump(FILE* aFile=NULL, const char* aPrefix="", bool aDumpHtml=false) MOZ_OVERRIDE; virtual already_AddRefed GetAsSurface() MOZ_OVERRIDE; #endif protected: RefPtr mFrontBuffer; nsIntRect mPictureRect; bool mHasPictureRect; }; // ImageHost with a single DeprecatedTextureHost class DeprecatedImageHostSingle : public CompositableHost { public: DeprecatedImageHostSingle(const TextureInfo& aTextureInfo) : CompositableHost(aTextureInfo) , mDeprecatedTextureHost(nullptr) , mHasPictureRect(false) {} virtual CompositableType GetType() { return mTextureInfo.mCompositableType; } virtual void EnsureDeprecatedTextureHost(TextureIdentifier aTextureId, const SurfaceDescriptor& aSurface, ISurfaceAllocator* aAllocator, const TextureInfo& aTextureInfo) MOZ_OVERRIDE; DeprecatedTextureHost* GetDeprecatedTextureHost() MOZ_OVERRIDE { return mDeprecatedTextureHost; } virtual void Composite(EffectChain& aEffectChain, float aOpacity, const gfx::Matrix4x4& aTransform, const gfx::Point& aOffset, const gfx::Filter& aFilter, const gfx::Rect& aClipRect, const nsIntRegion* aVisibleRegion = nullptr, TiledLayerProperties* aLayerProperties = nullptr); virtual bool Update(const SurfaceDescriptor& aImage, SurfaceDescriptor* aResult = nullptr) MOZ_OVERRIDE { return CompositableHost::Update(aImage, aResult); } virtual void SetPictureRect(const nsIntRect& aPictureRect) MOZ_OVERRIDE { mPictureRect = aPictureRect; mHasPictureRect = true; } virtual LayerRenderState GetRenderState() MOZ_OVERRIDE; virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE; #ifdef MOZ_LAYERS_HAVE_LOG virtual void PrintInfo(nsACString& aTo, const char* aPrefix); #endif #ifdef MOZ_DUMP_PAINTING virtual void Dump(FILE* aFile=nullptr, const char* aPrefix="", bool aDumpHtml=false) MOZ_OVERRIDE; virtual already_AddRefed GetAsSurface() MOZ_OVERRIDE; #endif protected: virtual void MakeDeprecatedTextureHost(TextureIdentifier aTextureId, const SurfaceDescriptor& aSurface, ISurfaceAllocator* aAllocator, const TextureInfo& aTextureInfo); RefPtr mDeprecatedTextureHost; nsIntRect mPictureRect; bool mHasPictureRect; }; // Double buffered ImageHost. We have a single TextureHost and double buffering // is done at the TextureHost/Client level. This is in contrast with buffered // ContentHosts which do their own double buffering class DeprecatedImageHostBuffered : public DeprecatedImageHostSingle { public: DeprecatedImageHostBuffered(const TextureInfo& aTextureInfo) : DeprecatedImageHostSingle(aTextureInfo) {} virtual bool Update(const SurfaceDescriptor& aImage, SurfaceDescriptor* aResult = nullptr) MOZ_OVERRIDE; protected: virtual void MakeDeprecatedTextureHost(TextureIdentifier aTextureId, const SurfaceDescriptor& aSurface, ISurfaceAllocator* aAllocator, const TextureInfo& aTextureInfo) MOZ_OVERRIDE; }; } } #endif