зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1355012 - Add mask layer support for WebRenderDisplayItemLayer. r=kats
This commit is contained in:
Родитель
93b3636151
Коммит
ea26418751
|
@ -66,7 +66,7 @@ WebRenderCanvasLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
gfx::Rect rect = RelativeToVisible(gfx::Rect(0, 0, mBounds.width, mBounds.height));
|
||||
|
||||
gfx::Rect clipRect = GetWrClipRect(rect);
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(true);
|
||||
WrClipRegion clip = aBuilder.BuildClipRegion(wr::ToWrRect(clipRect), mask.ptrOr(nullptr));
|
||||
|
||||
wr::ImageRendering filter = wr::ToImageRendering(mSamplingFilter);
|
||||
|
|
|
@ -24,7 +24,7 @@ WebRenderColorLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
gfx::Rect rect = GetWrBoundsRect();
|
||||
|
||||
gfx::Rect clipRect = GetWrClipRect(rect);
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(true);
|
||||
WrClipRegion clip = aBuilder.BuildClipRegion(wr::ToWrRect(clipRect), mask.ptrOr(nullptr));
|
||||
|
||||
wr::MixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetMixBlendMode());
|
||||
|
|
|
@ -23,7 +23,7 @@ WebRenderContainerLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
gfx::Rect relBounds = GetWrRelBounds();
|
||||
gfx::Rect overflow(0, 0, relBounds.width, relBounds.height);
|
||||
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(true);
|
||||
|
||||
wr::MixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetMixBlendMode());
|
||||
|
||||
|
|
|
@ -22,6 +22,16 @@ WebRenderDisplayItemLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
return;
|
||||
}
|
||||
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(false);
|
||||
WrImageMask* imageMask = mask.ptrOr(nullptr);
|
||||
if (imageMask) {
|
||||
gfx::Rect rect = TransformedVisibleBoundsRelativeToParent();
|
||||
gfx::Rect overflow(0.0, 0.0, rect.width, rect.height);
|
||||
aBuilder.PushScrollLayer(wr::ToWrRect(rect),
|
||||
wr::ToWrRect(overflow),
|
||||
imageMask);
|
||||
}
|
||||
|
||||
if (mItem) {
|
||||
wr::DisplayListBuilder builder(WrBridge()->GetPipeline());
|
||||
// We might have recycled this layer. Throw away the old commands.
|
||||
|
@ -34,6 +44,10 @@ WebRenderDisplayItemLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
|
||||
aBuilder.PushBuiltDisplayList(Move(mBuiltDisplayList));
|
||||
WrBridge()->AddWebRenderParentCommands(mParentCommands);
|
||||
|
||||
if (imageMask) {
|
||||
aBuilder.PopScrollLayer();
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t
|
||||
|
|
|
@ -139,7 +139,7 @@ WebRenderImageLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
rect = RelativeToVisible(rect);
|
||||
|
||||
gfx::Rect clipRect = GetWrClipRect(rect);
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(true);
|
||||
WrClipRegion clip = aBuilder.BuildClipRegion(wr::ToWrRect(clipRect), mask.ptrOr(nullptr));
|
||||
|
||||
wr::ImageRendering filter = wr::ToImageRendering(mSamplingFilter);
|
||||
|
|
|
@ -103,14 +103,17 @@ WebRenderLayer::TransformedVisibleBoundsRelativeToParent()
|
|||
}
|
||||
|
||||
Maybe<WrImageMask>
|
||||
WebRenderLayer::BuildWrMaskLayer()
|
||||
WebRenderLayer::BuildWrMaskLayer(bool aUnapplyLayerTransform)
|
||||
{
|
||||
if (GetLayer()->GetMaskLayer()) {
|
||||
WebRenderLayer* maskLayer = ToWebRenderLayer(GetLayer()->GetMaskLayer());
|
||||
// The size of mask layer is transformed, and we also push the layer transform to wr stacking context.
|
||||
// The size of mask layer is transformed, and we may set the layer transform to wr stacking context.
|
||||
// So we should apply inverse transform for mask layer.
|
||||
gfx::Matrix4x4 transform = GetWrBoundTransform();
|
||||
return maskLayer->RenderMaskLayer(transform.Inverse());
|
||||
gfx::Matrix4x4 transform;
|
||||
if (aUnapplyLayerTransform) {
|
||||
transform = GetWrBoundTransform().Inverse();
|
||||
}
|
||||
return maskLayer->RenderMaskLayer(transform);
|
||||
}
|
||||
|
||||
return Nothing();
|
||||
|
|
|
@ -59,7 +59,7 @@ protected:
|
|||
gfx::Rect GetWrClipRect(gfx::Rect& aRect);
|
||||
gfx::Matrix4x4 GetWrBoundTransform();
|
||||
void DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect);
|
||||
Maybe<WrImageMask> BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> BuildWrMaskLayer(bool aUnapplyLayerTransform);
|
||||
};
|
||||
|
||||
class WebRenderLayerManager final : public LayerManager
|
||||
|
|
|
@ -189,7 +189,7 @@ WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
|
|||
gfx::Rect rect(0, 0, size.width, size.height);
|
||||
|
||||
gfx::Rect clipRect = GetWrClipRect(rect);
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer();
|
||||
Maybe<WrImageMask> mask = BuildWrMaskLayer(true);
|
||||
WrClipRegion clip = aBuilder.BuildClipRegion(wr::ToWrRect(clipRect), mask.ptrOr(nullptr));
|
||||
|
||||
wr::MixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetMixBlendMode());
|
||||
|
|
Загрузка…
Ссылка в новой задаче