Bug 739671 - Store optimized Color/ImageLayers on the ThebesLayers that they replace. r=roc

This commit is contained in:
Matt Woodrow
2012-08-20 22:00:49 +12:00
parent 1f0f74f12d
commit ee71c0ebd5

View File

@@ -136,8 +136,7 @@ public:
mLayerBuilder(aLayerBuilder),
mContainerFrame(aContainerFrame), mContainerLayer(aContainerLayer),
mParameters(aParameters),
mNextFreeRecycledThebesLayer(0), mNextFreeRecycledColorLayer(0),
mNextFreeRecycledImageLayer(0), mInvalidateAllThebesContent(false)
mNextFreeRecycledThebesLayer(0), mInvalidateAllThebesContent(false)
{
nsPresContext* presContext = aContainerFrame->PresContext();
mAppUnitsPerDevPixel = presContext->AppUnitsPerDevPixel();
@@ -375,12 +374,12 @@ protected:
* Grab the next recyclable ColorLayer, or create one if there are no
* more recyclable ColorLayers.
*/
already_AddRefed<ColorLayer> CreateOrRecycleColorLayer();
already_AddRefed<ColorLayer> CreateOrRecycleColorLayer(ThebesLayer* aThebes);
/**
* Grab the next recyclable ImageLayer, or create one if there are no
* more recyclable ImageLayers.
*/
already_AddRefed<ImageLayer> CreateOrRecycleImageLayer();
already_AddRefed<ImageLayer> CreateOrRecycleImageLayer(ThebesLayer* aThebes);
/**
* Grab a recyclable ImageLayer for use as a mask layer for aLayer (that is a
* mask layer which has been used for aLayer before), or create one if such
@@ -472,13 +471,9 @@ protected:
typedef nsAutoTArray<nsRefPtr<Layer>,1> AutoLayersArray;
AutoLayersArray mNewChildLayers;
nsTArray<nsRefPtr<ThebesLayer> > mRecycledThebesLayers;
nsTArray<nsRefPtr<ColorLayer> > mRecycledColorLayers;
nsTArray<nsRefPtr<ImageLayer> > mRecycledImageLayers;
nsDataHashtable<nsPtrHashKey<Layer>, nsRefPtr<ImageLayer> >
mRecycledMaskImageLayers;
PRUint32 mNextFreeRecycledThebesLayer;
PRUint32 mNextFreeRecycledColorLayer;
PRUint32 mNextFreeRecycledImageLayer;
nscoord mAppUnitsPerDevPixel;
bool mInvalidateAllThebesContent;
bool mSnappingEnabled;
@@ -513,6 +508,9 @@ public:
* active scrolled root.
*/
gfxPoint mActiveScrolledRootPosition;
nsRefPtr<ColorLayer> mColorLayer;
nsRefPtr<ImageLayer> mImageLayer;
};
/*
@@ -936,15 +934,12 @@ InvalidatePostTransformRegion(ThebesLayer* aLayer, const nsIntRegion& aRegion,
}
already_AddRefed<ColorLayer>
ContainerState::CreateOrRecycleColorLayer()
ContainerState::CreateOrRecycleColorLayer(ThebesLayer *aThebes)
{
nsRefPtr<ColorLayer> layer;
if (mNextFreeRecycledColorLayer < mRecycledColorLayers.Length()) {
// Recycle a layer
layer = mRecycledColorLayers[mNextFreeRecycledColorLayer];
++mNextFreeRecycledColorLayer;
// Clear clip rect and mask layer so we don't accidentally stay clipped.
// We will reapply any necessary clipping.
ThebesDisplayItemLayerUserData* data =
static_cast<ThebesDisplayItemLayerUserData*>(aThebes->GetUserData(&gThebesDisplayItemLayerUserData));
nsRefPtr<ColorLayer> layer = data->mColorLayer;
if (layer) {
layer->SetClipRect(nullptr);
layer->SetMaskLayer(nullptr);
} else {
@@ -953,21 +948,22 @@ ContainerState::CreateOrRecycleColorLayer()
if (!layer)
return nullptr;
// Mark this layer as being used for Thebes-painting display items
data->mColorLayer = layer;
layer->SetUserData(&gColorLayerUserData, nullptr);
// Remove other layer types we might have stored for this ThebesLayer
data->mImageLayer = nullptr;
}
return layer.forget();
}
already_AddRefed<ImageLayer>
ContainerState::CreateOrRecycleImageLayer()
ContainerState::CreateOrRecycleImageLayer(ThebesLayer *aThebes)
{
nsRefPtr<ImageLayer> layer;
if (mNextFreeRecycledImageLayer < mRecycledImageLayers.Length()) {
// Recycle a layer
layer = mRecycledImageLayers[mNextFreeRecycledImageLayer];
++mNextFreeRecycledImageLayer;
// Clear clip rect and mask layer so we don't accidentally stay clipped.
// We will reapply any necessary clipping.
ThebesDisplayItemLayerUserData* data =
static_cast<ThebesDisplayItemLayerUserData*>(aThebes->GetUserData(&gThebesDisplayItemLayerUserData));
nsRefPtr<ImageLayer> layer = data->mImageLayer;
if (layer) {
layer->SetClipRect(nullptr);
layer->SetMaskLayer(nullptr);
} else {
@@ -976,7 +972,11 @@ ContainerState::CreateOrRecycleImageLayer()
if (!layer)
return nullptr;
// Mark this layer as being used for Thebes-painting display items
data->mImageLayer = layer;
layer->SetUserData(&gImageLayerUserData, nullptr);
// Remove other layer types we might have stored for this ThebesLayer
data->mColorLayer = nullptr;
}
return layer.forget();
}
@@ -1263,7 +1263,7 @@ ContainerState::PopThebesLayerData()
NS_ASSERTION(!(data->mIsSolidColorInVisibleRegion && imageContainer),
"Can't be a solid color as well as an image!");
if (imageContainer) {
nsRefPtr<ImageLayer> imageLayer = CreateOrRecycleImageLayer();
nsRefPtr<ImageLayer> imageLayer = CreateOrRecycleImageLayer(data->mLayer);
imageLayer->SetContainer(imageContainer);
data->mImage->ConfigureLayer(imageLayer);
imageLayer->SetPostScale(mParameters.mXScale,
@@ -1274,7 +1274,7 @@ ContainerState::PopThebesLayerData()
}
layer = imageLayer;
} else {
nsRefPtr<ColorLayer> colorLayer = CreateOrRecycleColorLayer();
nsRefPtr<ColorLayer> colorLayer = CreateOrRecycleColorLayer(data->mLayer);
colorLayer->SetIsFixedPosition(data->mLayer->GetIsFixedPosition());
colorLayer->SetColor(data->mSolidColor);
@@ -1995,11 +1995,7 @@ ContainerState::CollectOldLayers()
layer = layer->GetNextSibling()) {
NS_ASSERTION(!layer->HasUserData(&gMaskLayerUserData),
"Mask layer in layer tree; could not be recycled.");
if (layer->HasUserData(&gColorLayerUserData)) {
mRecycledColorLayers.AppendElement(static_cast<ColorLayer*>(layer));
} else if (layer->HasUserData(&gImageLayerUserData)) {
mRecycledImageLayers.AppendElement(static_cast<ImageLayer*>(layer));
} else if (layer->HasUserData(&gThebesDisplayItemLayerUserData)) {
if (layer->HasUserData(&gThebesDisplayItemLayerUserData)) {
NS_ASSERTION(layer->AsThebesLayer(), "Wrong layer type");
mRecycledThebesLayers.AppendElement(static_cast<ThebesLayer*>(layer));
}