Bug 1378602 - Part1. Add WR support for nsDisplayOpacity. r=kats
MozReview-Commit-ID: 8aH3pJ0oiGc
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6041,16 +6041,50 @@ bool nsDisplayOpacity::TryMerge(nsDispla
}
void
nsDisplayOpacity::WriteDebugInfo(std::stringstream& aStream)
{
aStream << " (opacity " << mOpacity << ")";
}
+bool
+nsDisplayOpacity::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ mozilla::layers::WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder)
+{
+ nsRect itemBounds = mList.GetClippedBoundsWithRespectToASR(aDisplayListBuilder, mActiveScrolledRoot);
+ nsRect childrenVisible = GetVisibleRectForChildren();
+ nsRect visibleRect = itemBounds.Intersect(childrenVisible);
+ float appUnitsPerDevPixel = mFrame->PresContext()->AppUnitsPerDevPixel();
+ LayerRect bounds = ViewAs<LayerPixel>(LayoutDeviceRect::FromAppUnits(visibleRect, appUnitsPerDevPixel),
+ PixelCastJustification::WebRenderHasUnitResolution);
+ LayerPoint origin = bounds.TopLeft();
+
+ // TODO: generate animationsId for OMTA.
+ uint64_t animationsId = 0;
+ nsTArray<WrFilterOp> filters;
+ StackingContextHelper sc(aSc,
+ aBuilder,
+ bounds,
+ origin,
+ animationsId,
+ &mOpacity,
+ nullptr,
+ filters);
+
+ aManager->CreateWebRenderCommandsFromDisplayList(&mList,
+ aDisplayListBuilder,
+ sc,
+ aBuilder);
+ return true;
+}
+
nsDisplayBlendMode::nsDisplayBlendMode(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame, nsDisplayList* aList,
uint8_t aBlendMode,
const ActiveScrolledRoot* aActiveScrolledRoot,
uint32_t aIndex)
: nsDisplayWrapList(aBuilder, aFrame, aList, aActiveScrolledRoot)
, mBlendMode(aBlendMode)
, mIndex(aIndex)
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -3963,16 +3963,22 @@ public:
virtual bool CanApplyOpacity() const override;
virtual bool ShouldFlattenAway(nsDisplayListBuilder* aBuilder) override;
static bool NeedsActiveLayer(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame);
NS_DISPLAY_DECL_NAME("Opacity", TYPE_OPACITY)
virtual void WriteDebugInfo(std::stringstream& aStream) override;
bool CanUseAsyncAnimations(nsDisplayListBuilder* aBuilder) override;
+ virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ mozilla::layers::WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder) override;
+
private:
float mOpacity;
bool mForEventsAndPluginsOnly;
};
class nsDisplayBlendMode : public nsDisplayWrapList {
public:
nsDisplayBlendMode(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,