Bug 739671 - Store optimized Color/ImageLayers on the ThebesLayers that they replace. r=roc
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user