Bug 1386188 - Support filter for layers-free mode. r=kats
MozReview-Commit-ID: LuPnaSjhjgk
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -9123,16 +9123,53 @@ nsDisplayFilter::PaintAsLayer(nsDisplayL
mFrame, mVisibleRect,
borderArea, aBuilder,
aManager,
mHandleOpacity, imgParams);
nsSVGIntegrationUtils::PaintFilter(params);
nsDisplayFilterGeometry::UpdateDrawResult(this, imgParams.result);
}
+bool
+nsDisplayFilter::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ mozilla::layers::WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder)
+{
+ if (aManager->IsLayersFreeTransaction()) {
+ ContainerLayerParameters parameter;
+ if (GetLayerState(aDisplayListBuilder, aManager, parameter) != LAYER_ACTIVE) {
+ // TODO: should have a fallback path to paint the child list
+ return false;
+ }
+ }
+
+ nsTArray<mozilla::wr::WrFilterOp> wrFilters;
+ const nsTArray<nsStyleFilter>& filters = mFrame->StyleEffects()->mFilters;
+ nsTArray<layers::CSSFilter> cssFilters = nsTArray<layers::CSSFilter>(filters.Length());
+ for (const nsStyleFilter& filter : filters) {
+ wrFilters.AppendElement(wr::ToWrFilterOp(ToCSSFilter(filter)));
+ }
+
+ StackingContextHelper sc(aSc,
+ aBuilder,
+ aDisplayListBuilder,
+ this,
+ &mList,
+ nullptr,
+ 0,
+ nullptr,
+ nullptr,
+ wrFilters);
+
+ nsDisplaySVGEffects::CreateWebRenderCommands(aBuilder, sc, aParentCommands, aManager, aDisplayListBuilder);
+ return true;
+}
+
#ifdef MOZ_DUMP_PAINTING
void
nsDisplayFilter::PrintEffects(nsACString& aTo)
{
nsIFrame* firstFrame =
nsLayoutUtils::FirstContinuationOrIBSplitSibling(mFrame);
nsSVGEffects::EffectProperties effectProperties =
nsSVGEffects::GetEffectProperties(firstFrame);
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -4581,16 +4581,22 @@ public:
nsRegion* aInvalidRegion) override;
#ifdef MOZ_DUMP_PAINTING
void PrintEffects(nsACString& aTo);
#endif
void PaintAsLayer(nsDisplayListBuilder* aBuilder,
gfxContext* aCtx,
LayerManager* aManager);
+
+ virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ mozilla::layers::WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder) override;
};
/* A display item that applies a transformation to all of its descendant
* elements. This wrapper should only be used if there is a transform applied
* to the root element.
*
* The reason that a "bounds" rect is involved in transform calculations is
* because CSS-transforms allow percentage values for the x and y components