Backed out changeset f9564f9f4648 (bug 1022612)

This commit is contained in:
Carsten "Tomcat" Book 2014-07-15 10:30:11 +02:00
Родитель 149a485e36
Коммит f43cac8d8b
9 изменённых файлов: 29 добавлений и 17 удалений

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

@ -1614,27 +1614,30 @@ AppUnitsPerDevPixel(nsDisplayItem* aItem)
* parent's coordinate system
*/
static void
SetVisibleRegionForLayer(Layer* aLayer, const nsIntRect* aLayerVisibleRect,
const nsIntRect& aOuterVisibleRect)
SetVisibleRegionForLayer(Layer* aLayer, const nsIntRegion& aLayerVisibleRegion,
const nsIntRect& aRestrictToRect)
{
gfx3DMatrix transform;
To3DMatrix(aLayer->GetTransform(), transform);
// if 'transform' is not invertible, then nothing will be displayed
// for the layer, so it doesn't really matter what we do here
gfxRect outerVisible(aOuterVisibleRect.x, aOuterVisibleRect.y,
aOuterVisibleRect.width, aOuterVisibleRect.height);
gfxRect layerVisible = transform.Inverse().ProjectRectBounds(outerVisible);
gfxRect itemVisible(aRestrictToRect.x, aRestrictToRect.y,
aRestrictToRect.width, aRestrictToRect.height);
nsIntRect childBounds = aLayerVisibleRegion.GetBounds();
gfxRect childGfxBounds(childBounds.x, childBounds.y,
childBounds.width, childBounds.height);
gfxRect layerVisible = transform.Inverse().ProjectRectBounds(itemVisible);
layerVisible = layerVisible.Intersect(childGfxBounds);
layerVisible.RoundOut();
nsIntRect visibleRect;
if (!gfxUtils::GfxRectToIntRect(layerVisible, &visibleRect)) {
aLayer->SetVisibleRegion(nsIntRegion());
} else {
if (aLayerVisibleRect) {
visibleRect.IntersectRect(visibleRect, *aLayerVisibleRect);
}
aLayer->SetVisibleRegion(nsIntRegion(visibleRect));
nsIntRegion rgn;
rgn.And(aLayerVisibleRegion, visibleRect);
aLayer->SetVisibleRegion(rgn);
}
}
@ -2652,7 +2655,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList,
}
itemVisibleRect.MoveBy(mParameters.mOffset);
if (item->SetVisibleRegionOnLayer()) {
SetVisibleRegionForLayer(ownLayer, nullptr, itemVisibleRect);
SetVisibleRegionForLayer(ownLayer, ownLayer->GetVisibleRegion(), itemVisibleRect);
}
// rounded rectangle clipping using mask layers
@ -3514,7 +3517,7 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
pixBounds.MoveBy(nsIntPoint(scaleParameters.mOffset.x, scaleParameters.mOffset.y));
if (aParameters.mAncestorClipRect && !(aFlags & CONTAINER_NOT_CLIPPED_BY_ANCESTORS)) {
SetVisibleRegionForLayer(containerLayer, &pixBounds,
SetVisibleRegionForLayer(containerLayer, nsIntRegion(pixBounds),
*aParameters.mAncestorClipRect);
} else {
containerLayer->SetVisibleRegion(pixBounds);

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

@ -2029,6 +2029,7 @@ nsDisplayBackgroundImage::ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& a
transform.Scale(mDestRect.width/imageSize.width,
mDestRect.height/imageSize.height);
aLayer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
aLayer->SetVisibleRegion(nsIntRect(0, 0, imageSize.width, imageSize.height));
}
void

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

@ -2619,12 +2619,6 @@ public:
return &mList;
}
virtual nsDisplayList* GetChildren() MOZ_OVERRIDE { return &mList; }
/**
* All our subclasses BuildLayers call
* FrameLayerBuilder::BuildContainerLayerFor, which
* sets the visible region of the layer correctly.
*/
virtual bool SetVisibleRegionOnLayer() { return false; }
virtual int32_t ZIndex() const MOZ_OVERRIDE
{
@ -2893,6 +2887,8 @@ public:
nsRegion* aVisibleRegion,
const nsRect& aAllowVisibleRegionExpansion) MOZ_OVERRIDE;
virtual bool SetVisibleRegionOnLayer() MOZ_OVERRIDE { return !(mFlags & GENERATE_SCROLLABLE_LAYER); }
virtual bool ShouldBuildLayerEvenIfInvisible(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE;
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder, bool* aSnap) MOZ_OVERRIDE;
@ -3028,6 +3024,8 @@ public:
virtual nsIFrame* GetScrollFrame() { return mScrollFrame; }
virtual nsIFrame* GetScrolledFrame() { return mScrolledFrame; }
virtual bool SetVisibleRegionOnLayer() MOZ_OVERRIDE { return false; }
#ifdef MOZ_DUMP_PAINTING
virtual void WriteDebugInfo(nsACString& aTo) MOZ_OVERRIDE;
#endif
@ -3399,6 +3397,8 @@ public:
bool aLogAnimations = false);
bool CanUseAsyncAnimations(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE;
virtual bool SetVisibleRegionOnLayer() MOZ_OVERRIDE { return false; }
#ifdef MOZ_DUMP_PAINTING
virtual void WriteDebugInfo(nsACString& aTo) MOZ_OVERRIDE;
#endif

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

@ -271,6 +271,7 @@ nsHTMLCanvasFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
transform.Scale(r.Width()/canvasSize.width, r.Height()/canvasSize.height);
layer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
layer->SetFilter(nsLayoutUtils::GetGraphicsFilterForFrame(this));
layer->SetVisibleRegion(nsIntRect(0, 0, canvasSize.width, canvasSize.height));
return layer.forget();
}

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

@ -1425,6 +1425,7 @@ nsDisplayImage::ConfigureLayer(ImageLayer *aLayer, const nsIntPoint& aOffset)
transform.Scale(destRect.Width()/imageWidth,
destRect.Height()/imageHeight);
aLayer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
aLayer->SetVisibleRegion(nsIntRect(0, 0, imageWidth, imageHeight));
}
void

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

@ -1612,6 +1612,7 @@ nsObjectFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
transform.Translate(p.x, p.y);
layer->SetBaseTransform(Matrix4x4::From2D(transform));
layer->SetVisibleRegion(ThebesIntRect(IntRect(IntPoint(0, 0), size)));
return layer.forget();
}

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

@ -219,6 +219,7 @@ nsVideoFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
transform.Translate(p.x, p.y);
transform.Scale(r.Width()/frameSize.width, r.Height()/frameSize.height);
layer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
layer->SetVisibleRegion(nsIntRect(0, 0, frameSize.width, frameSize.height));
nsRefPtr<Layer> result = layer.forget();
return result.forget();
}

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

@ -873,6 +873,7 @@ RenderFrameParent::BuildLayer(nsDisplayListBuilder* aBuilder,
}
static_cast<RefLayer*>(layer.get())->SetReferentId(id);
nsIntPoint offset = GetContentRectLayerOffset(aFrame, aBuilder);
layer->SetVisibleRegion(aVisibleRect - offset);
// We can only have an offset if we're a child of an inactive
// container, but our display item is LAYER_ACTIVE_FORCE which
// forces all layers above to be active.
@ -925,6 +926,7 @@ RenderFrameParent::BuildLayer(nsDisplayListBuilder* aBuilder,
mBackgroundColor,
aManager, aFrame);
}
mContainer->SetVisibleRegion(aVisibleRect);
return nsRefPtr<Layer>(mContainer).forget();
}

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

@ -406,6 +406,8 @@ nsDisplayXULImage::ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset)
transform.Scale(destRect.Width()/imageWidth,
destRect.Height()/imageHeight);
aLayer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
aLayer->SetVisibleRegion(nsIntRect(0, 0, imageWidth, imageHeight));
}
already_AddRefed<ImageContainer>