Bug 1407753 - Port nsFieldSetFrame to webrender. r=jrmuizel

Falls back if a legend is present, as this is blocked on upstream
webrender exposing ClipMode.

MozReview-Commit-ID: At8kX4vQn3X
This commit is contained in:
Alexis Beingessner
2017-10-13 16:18:39 -04:00
parent d0c84dcf21
commit a1d3f1bf78

View File

@@ -96,6 +96,11 @@ public:
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion *aInvalidRegion) const override;
bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
const StackingContextHelper& aSc,
mozilla::layers::WebRenderLayerManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder) override;
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder,
bool* aSnap) const override;
NS_DISPLAY_DECL_NAME("FieldSetBorder", TYPE_FIELDSET_BORDER_BACKGROUND)
@@ -147,6 +152,43 @@ nsDisplayFieldSetBorder::GetBounds(nsDisplayListBuilder* aBuilder,
return Frame()->GetVisualOverflowRectRelativeToSelf() + ToReferenceFrame();
}
bool
nsDisplayFieldSetBorder::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
const StackingContextHelper& aSc,
mozilla::layers::WebRenderLayerManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder)
{
if (!ShouldUseAdvancedLayer(aManager, gfxPrefs::LayersAllowBorderLayers)) {
return false;
}
auto frame = static_cast<nsFieldSetFrame*>(mFrame);
auto offset = ToReferenceFrame();
nsRect rect;
if (nsIFrame* legend = frame->GetLegend()) {
rect = frame->VisualBorderRectRelativeToSelf() + offset;
// Legends require a "negative" clip around the text, which WR doesn't support yet.
nsRect legendRect = legend->GetNormalRect() + offset;
if (!legendRect.IsEmpty()) {
return false;
}
} else {
rect = nsRect(offset, frame->GetRect().Size());
}
return nsCSSRendering::CreateWebRenderCommandsForBorder(this,
mFrame,
rect,
aBuilder,
aResources,
aSc,
aManager,
aDisplayListBuilder);
};
void
nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsDisplayListSet& aLists) {