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_SIMPLETILEDCONTENTCLIENT_H michael@0: #define MOZILLA_GFX_SIMPLETILEDCONTENTCLIENT_H michael@0: michael@0: // We include this header here so that we don't need to michael@0: // duplicate BasicTiledLayerPaintData michael@0: #include "TiledContentClient.h" michael@0: michael@0: #include "SharedBuffer.h" michael@0: michael@0: namespace mozilla { michael@0: namespace layers { michael@0: michael@0: class ClientTiledThebesLayer; michael@0: michael@0: class SimpleTiledLayerTile; michael@0: class SimpleTiledLayerBuffer; michael@0: class SimpleClientTiledThebesLayer; michael@0: class SimpleTiledLayerBuffer; michael@0: michael@0: #define GFX_SIMP_TILEDLAYER_DEBUG_OVERLAY michael@0: michael@0: struct SimpleTiledLayerTile michael@0: { michael@0: RefPtr mTileBuffer; michael@0: RefPtr mManager; michael@0: nsRefPtr mCachedBuffer; michael@0: TimeStamp mLastUpdate; michael@0: michael@0: SimpleTiledLayerTile() { } michael@0: michael@0: SimpleTiledLayerTile(ClientLayerManager *aManager, TextureClient *aBuffer) michael@0: : mTileBuffer(aBuffer) michael@0: , mManager(aManager) michael@0: { } michael@0: michael@0: bool operator== (const SimpleTiledLayerTile& o) const michael@0: { michael@0: return mTileBuffer == o.mTileBuffer; michael@0: } michael@0: michael@0: bool operator!= (const SimpleTiledLayerTile& o) const michael@0: { michael@0: return mTileBuffer != o.mTileBuffer; michael@0: } michael@0: michael@0: void SetLayerManager(ClientLayerManager *aManager) michael@0: { michael@0: mManager = aManager; michael@0: } michael@0: michael@0: bool IsPlaceholderTile() michael@0: { michael@0: return mTileBuffer == nullptr; michael@0: } michael@0: michael@0: TileDescriptor GetTileDescriptor() michael@0: { michael@0: if (mTileBuffer) michael@0: return TexturedTileDescriptor(nullptr, mTileBuffer->GetIPDLActor(), 0); michael@0: michael@0: NS_NOTREACHED("Unhandled SimpleTiledLayerTile type"); michael@0: return PlaceholderTileDescriptor(); michael@0: } michael@0: michael@0: void Release() michael@0: { michael@0: mTileBuffer = nullptr; michael@0: mCachedBuffer = nullptr; michael@0: } michael@0: }; michael@0: michael@0: class SimpleTiledLayerBuffer michael@0: : public TiledLayerBuffer michael@0: { michael@0: friend class TiledLayerBuffer; michael@0: michael@0: public: michael@0: SimpleTiledLayerBuffer(SimpleClientTiledThebesLayer* aThebesLayer, michael@0: CompositableClient* aCompositableClient, michael@0: ClientLayerManager* aManager) michael@0: : mThebesLayer(aThebesLayer) michael@0: , mCompositableClient(aCompositableClient) michael@0: , mManager(aManager) michael@0: , mLastPaintOpaque(false) michael@0: {} michael@0: michael@0: SimpleTiledLayerBuffer() michael@0: : mLastPaintOpaque(false) michael@0: {} michael@0: michael@0: void PaintThebes(const nsIntRegion& aNewValidRegion, michael@0: const nsIntRegion& aPaintRegion, michael@0: LayerManager::DrawThebesLayerCallback aCallback, michael@0: void* aCallbackData); michael@0: michael@0: SurfaceDescriptorTiles GetSurfaceDescriptorTiles(); michael@0: michael@0: void Release() { michael@0: for (size_t i = 0; i < mRetainedTiles.Length(); i++) { michael@0: mRetainedTiles[i].Release(); michael@0: } michael@0: } michael@0: michael@0: const CSSToParentLayerScale& GetFrameResolution() const { return mFrameResolution; } michael@0: void SetFrameResolution(const CSSToParentLayerScale& aResolution) { mFrameResolution = aResolution; } michael@0: michael@0: bool HasFormatChanged() const; michael@0: private: michael@0: SimpleClientTiledThebesLayer* mThebesLayer; michael@0: CompositableClient* mCompositableClient; michael@0: ClientLayerManager* mManager; michael@0: LayerManager::DrawThebesLayerCallback mCallback; michael@0: void* mCallbackData; michael@0: CSSToParentLayerScale mFrameResolution; michael@0: bool mLastPaintOpaque; michael@0: michael@0: gfxContentType GetContentType() const; michael@0: michael@0: SimpleTiledLayerTile ValidateTile(SimpleTiledLayerTile aTile, michael@0: const nsIntPoint& aTileOrigin, michael@0: const nsIntRegion& aDirtyRect); michael@0: michael@0: SimpleTiledLayerTile GetPlaceholderTile() const { return SimpleTiledLayerTile(); } michael@0: michael@0: void ReleaseTile(SimpleTiledLayerTile aTile) { aTile.Release(); } michael@0: michael@0: void SwapTiles(SimpleTiledLayerTile& aTileA, SimpleTiledLayerTile& aTileB) { std::swap(aTileA, aTileB); } michael@0: }; michael@0: michael@0: class SimpleTiledContentClient : public CompositableClient michael@0: { michael@0: friend class SimpleClientTiledThebesLayer; michael@0: michael@0: public: michael@0: SimpleTiledContentClient(SimpleClientTiledThebesLayer* aThebesLayer, michael@0: ClientLayerManager* aManager); michael@0: michael@0: ~SimpleTiledContentClient(); michael@0: michael@0: virtual TextureInfo GetTextureInfo() const MOZ_OVERRIDE michael@0: { michael@0: return TextureInfo(BUFFER_SIMPLE_TILED); michael@0: } michael@0: michael@0: void UseTiledLayerBuffer(); michael@0: michael@0: private: michael@0: SimpleTiledLayerBuffer mTiledBuffer; michael@0: }; michael@0: michael@0: class SimpleClientTiledThebesLayer : public ThebesLayer, michael@0: public ClientLayer michael@0: { michael@0: typedef ThebesLayer Base; michael@0: michael@0: public: michael@0: SimpleClientTiledThebesLayer(ClientLayerManager* const aManager); michael@0: ~SimpleClientTiledThebesLayer(); michael@0: michael@0: // Thebes Layer michael@0: virtual Layer* AsLayer() { return this; } michael@0: virtual void InvalidateRegion(const nsIntRegion& aRegion) { michael@0: mInvalidRegion.Or(mInvalidRegion, aRegion); michael@0: mValidRegion.Sub(mValidRegion, aRegion); michael@0: } michael@0: michael@0: // Shadow methods michael@0: virtual void FillSpecificAttributes(SpecificLayerAttributes& aAttrs); michael@0: virtual ShadowableLayer* AsShadowableLayer() { return this; } michael@0: michael@0: virtual void Disconnect() { ClientLayer::Disconnect(); } michael@0: michael@0: virtual void RenderLayer(); michael@0: michael@0: protected: michael@0: ClientLayerManager* ClientManager() { return static_cast(mManager); } michael@0: michael@0: RefPtr mContentClient; michael@0: }; michael@0: michael@0: } // mozilla michael@0: } // layers michael@0: michael@0: #endif