gecko/gfx/layers/client/SimpleTiledContentClient.h
Chris Lord 6d09001341 Bug 983208 - Fix progressive tile update calculations. r=botond
A lot of this code used incorrect coordinate spaces or calculations that only
worked because things were setup in a certain way. Now that the input data is
more consistently correct and things have changed slightly, this code no
longer worked.

This patch reworks things to use what I think are the correct coordinate
spaces and calculations, and should hopefully be less prone to breakage.
2014-03-22 09:17:54 +00:00

190 lines
5.1 KiB
C++

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