Bug 1355012 - Add mask layer support for WebRenderDisplayItemLayer. r=kats

This commit is contained in:
Ethan Lin 2017-04-13 15:13:51 +08:00
Родитель 93b3636151
Коммит ea26418751
8 изменённых файлов: 27 добавлений и 10 удалений

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

@ -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());