Bug 637852: Part 5: Create ContainerParameters structure to carry resolution scale factors through layer creation. r=tnikkel

This patch shouldn't change any behavior. It just passes the ContainerParameters around, which will contain scale factors that should have been
applied when BuildLayer returns a ContainerLayer.

This patch also adds an aTransform parameter to BuildContainerLayerFor, which nsDisplayTransform uses to set the
transform for the ContainerLayer. This way BuildContainerLayerFor knows what the container's transform is going to be
before constructing the children, which in the next patch will let us construct the children with the right resolution.
This commit is contained in:
Robert O'Callahan 2011-06-23 00:11:27 +12:00
Родитель 91a72cf57f
Коммит 723e5c86ee
10 изменённых файлов: 66 добавлений и 30 удалений

Просмотреть файл

@ -1257,7 +1257,8 @@ PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
// using a temporary BasicLayerManager.
nsRefPtr<BasicLayerManager> tempManager = new BasicLayerManager();
tempManager->BeginTransactionWithTarget(aContext);
nsRefPtr<Layer> layer = aItem->BuildLayer(aBuilder, tempManager);
nsRefPtr<Layer> layer =
aItem->BuildLayer(aBuilder, tempManager, FrameLayerBuilder::ContainerParameters());
if (!layer) {
tempManager->EndTransaction(nsnull, nsnull);
return;
@ -1346,7 +1347,8 @@ ContainerState::ProcessDisplayItems(const nsDisplayList& aList,
aClip.RemoveRoundedCorners();
// Just use its layer.
nsRefPtr<Layer> ownLayer = item->BuildLayer(mBuilder, mManager);
nsRefPtr<Layer> ownLayer =
item->BuildLayer(mBuilder, mManager, FrameLayerBuilder::ContainerParameters());
if (!ownLayer) {
InvalidateForLayerChange(item, ownLayer);
continue;
@ -1601,7 +1603,9 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
nsIFrame* aContainerFrame,
nsDisplayItem* aContainerItem,
const nsDisplayList& aChildren)
const nsDisplayList& aChildren,
const ContainerParameters& aParameters,
const gfx3DMatrix* aTransform)
{
FrameProperties props = aContainerFrame->Properties();
PRUint32 containerDisplayItemKey =
@ -1702,6 +1706,9 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
}
containerLayer->SetContentFlags(flags);
if (aTransform) {
containerLayer->SetTransform(*aTransform);
}
return containerLayer.forget();
}

Просмотреть файл

@ -132,6 +132,10 @@ public:
*/
void DidEndTransaction(LayerManager* aManager);
struct ContainerParameters {
ContainerParameters() : mXScale(1), mYScale(1) {}
double mXScale, mYScale;
};
/**
* Build a container layer for a display item that contains a child
* list, either reusing an existing one or creating a new one. It
@ -146,13 +150,17 @@ public:
* Returns a layer with clip rect cleared; it is the
* caller's responsibility to add any clip rect. The visible region
* is set based on what's in the layer.
* The container layer is transformed by aTransform (if non-null), and
* the result is transformed by the scale factors in aContainerParameters.
*/
already_AddRefed<ContainerLayer>
BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
nsIFrame* aContainerFrame,
nsDisplayItem* aContainerItem,
const nsDisplayList& aChildren);
const nsDisplayList& aChildren,
const ContainerParameters& aContainerParameters,
const gfx3DMatrix* aTransform);
/**
* Get a retained layer for a display item that needs to create its own

Просмотреть файл

@ -590,7 +590,8 @@ void nsDisplayList::PaintForFrame(nsDisplayListBuilder* aBuilder,
}
nsRefPtr<ContainerLayer> root = aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, layerManager, aForFrame, nsnull, *this);
BuildContainerLayerFor(aBuilder, layerManager, aForFrame, nsnull, *this,
nsDisplayItem::ContainerParameters(), nsnull);
if (!root)
return;
@ -1701,9 +1702,11 @@ nsRegion nsDisplayOpacity::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
// nsDisplayOpacity uses layers for rendering
already_AddRefed<Layer>
nsDisplayOpacity::BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager) {
LayerManager* aManager,
const ContainerParameters& aContainerParameters) {
nsRefPtr<Layer> layer = aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList);
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList,
aContainerParameters, nsnull);
if (!layer)
return nsnull;
@ -1768,9 +1771,11 @@ nsDisplayOwnLayer::~nsDisplayOwnLayer() {
// nsDisplayOpacity uses layers for rendering
already_AddRefed<Layer>
nsDisplayOwnLayer::BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager) {
LayerManager* aManager,
const ContainerParameters& aContainerParameters) {
nsRefPtr<Layer> layer = aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList);
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList,
aContainerParameters, nsnull);
return layer.forget();
}
@ -1833,9 +1838,11 @@ nsDisplayScrollLayer::~nsDisplayScrollLayer()
already_AddRefed<Layer>
nsDisplayScrollLayer::BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager) {
LayerManager* aManager,
const ContainerParameters& aContainerParameters) {
nsRefPtr<ContainerLayer> layer = aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList);
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList,
aContainerParameters, nsnull);
// Get the already set unique ID for scrolling this content remotely.
// Or, if not set, generate a new ID.
@ -2375,7 +2382,8 @@ nsDisplayTransform::GetResultingTransformMatrix(const nsIFrame* aFrame,
}
already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBuilder,
LayerManager *aManager)
LayerManager *aManager,
const ContainerParameters& aContainerParameters)
{
gfxMatrix newTransformMatrix =
GetResultingTransformMatrix(mFrame, ToReferenceFrame(),
@ -2384,13 +2392,10 @@ already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBu
if (newTransformMatrix.IsSingular())
return nsnull;
nsRefPtr<Layer> layer = aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, *mStoredList.GetList());
if (!layer)
return nsnull;
layer->SetTransform(gfx3DMatrix::From2D(newTransformMatrix));
return layer.forget();
gfx3DMatrix matrix = gfx3DMatrix::From2D(newTransformMatrix);
return aBuilder->LayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, *mStoredList.GetList(),
aContainerParameters, &matrix);
}
nsDisplayItem::LayerState

Просмотреть файл

@ -721,9 +721,15 @@ public:
*
* The caller (nsDisplayList) is responsible for setting the visible
* region of the layer.
*
* @param aContainerParameters should be passed to
* FrameLayerBuilder::BuildContainerLayerFor if a ContainerLayer is
* constructed.
*/
typedef mozilla::FrameLayerBuilder::ContainerParameters ContainerParameters;
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{ return nsnull; }
/**
@ -1753,7 +1759,8 @@ public:
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
LayerManager* aManager,
const ContainerParameters& aContainerParameters);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
@ -1776,7 +1783,8 @@ public:
#endif
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
LayerManager* aManager,
const ContainerParameters& aContainerParameters);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
{
@ -1837,7 +1845,8 @@ public:
#endif
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
LayerManager* aManager,
const ContainerParameters& aContainerParameters);
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion,
@ -2098,7 +2107,8 @@ public:
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
LayerManager* aManager,
const ContainerParameters& aContainerParameters);
virtual PRBool ComputeVisibility(nsDisplayListBuilder *aBuilder,
nsRegion *aVisibleRegion,
const nsRect& aAllowVisibleRegionExpansion);

Просмотреть файл

@ -97,7 +97,8 @@ public:
}
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{
return static_cast<nsHTMLCanvasFrame*>(mFrame)->
BuildLayer(aBuilder, aManager, this);

Просмотреть файл

@ -956,7 +956,8 @@ public:
NS_DISPLAY_DECL_NAME("PluginReadback", TYPE_PLUGIN_READBACK)
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{
return static_cast<nsObjectFrame*>(mFrame)->BuildLayer(aBuilder, aManager, this);
}

Просмотреть файл

@ -348,7 +348,8 @@ public:
nsTArray<nsIWidget::Configuration>* aConfigurations);
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{
return static_cast<nsObjectFrame*>(mFrame)->BuildLayer(aBuilder,
aManager,

Просмотреть файл

@ -403,7 +403,8 @@ public:
}
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{
return static_cast<nsVideoFrame*>(mFrame)->BuildLayer(aBuilder, aManager, this);
}

Просмотреть файл

@ -819,7 +819,8 @@ RenderFrameParent::BuildDisplayList(nsDisplayListBuilder* aBuilder,
already_AddRefed<Layer>
nsDisplayRemote::BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager)
LayerManager* aManager,
const ContainerParameters& aContainerParameters)
{
PRInt32 appUnitsPerDevPixel = mFrame->PresContext()->AppUnitsPerDevPixel();
nsIntRect visibleRect = GetVisibleRect().ToNearestPixels(appUnitsPerDevPixel);

Просмотреть файл

@ -143,7 +143,8 @@ public:
NS_OVERRIDE
virtual already_AddRefed<Layer>
BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager);
BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerParameters& aContainerParameters);
NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)