Bug 1384839 - Part2. Add BuildWrMaskImage() for creating WrImageMask. r=kats
MozReview-Commit-ID: 5S3CRSLX5wY
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -366,17 +366,23 @@ PaintItemByDrawTarget(nsDisplayItem* aIt
DrawTarget* aDT,
const LayerRect& aImageRect,
const LayerPoint& aOffset,
nsDisplayListBuilder* aDisplayListBuilder)
{
aDT->ClearRect(aImageRect.ToUnknownRect());
RefPtr<gfxContext> context = gfxContext::CreateOrNull(aDT, aOffset.ToUnknownPoint());
MOZ_ASSERT(context);
- aItem->Paint(aDisplayListBuilder, context);
+
+ if (aItem->GetType() == nsDisplayItem::TYPE_MASK) {
+ context->SetMatrix(gfxMatrix::Translation(-aOffset.x, -aOffset.y));
+ static_cast<nsDisplayMask*>(aItem)->PaintMask(aDisplayListBuilder, context);
+ } else {
+ aItem->Paint(aDisplayListBuilder, context);
+ }
if (gfxPrefs::WebRenderHighlightPaintedLayers()) {
aDT->SetTransform(Matrix());
aDT->FillRect(Rect(0, 0, aImageRect.width, aImageRect.height), ColorPattern(Color(1.0, 0.0, 0.0, 0.5)));
}
if (aItem->Frame()->PresContext()->GetPaintFlashing()) {
aDT->SetTransform(Matrix());
float r = float(rand()) / RAND_MAX;
@@ -487,16 +493,38 @@ WebRenderLayerManager::GenerateFallbackD
fallbackData->SetGeometry(Move(geometry));
fallbackData->SetBounds(clippedBounds);
MOZ_ASSERT(fallbackData->GetKey());
return fallbackData.forget();
}
+Maybe<wr::WrImageMask>
+WebRenderLayerManager::BuildWrMaskImage(nsDisplayItem* aItem,
+ wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsDisplayListBuilder* aDisplayListBuilder,
+ const LayerRect& aBounds)
+{
+ LayerRect imageRect;
+ LayerPoint offset;
+ RefPtr<WebRenderFallbackData> fallbackData = GenerateFallbackData(aItem, aBuilder, aDisplayListBuilder,
+ imageRect, offset);
+ if (!fallbackData) {
+ return Nothing();
+ }
+
+ wr::WrImageMask imageMask;
+ imageMask.image = fallbackData->GetKey().value();
+ imageMask.rect = aSc.ToRelativeLayoutRect(aBounds);
+ imageMask.repeat = false;
+ return Some(imageMask);
+}
+
bool
WebRenderLayerManager::PushItemAsImage(nsDisplayItem* aItem,
wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc,
nsDisplayListBuilder* aDisplayListBuilder)
{
LayerRect imageRect;
LayerPoint offset;
--- a/gfx/layers/wr/WebRenderLayerManager.h
+++ b/gfx/layers/wr/WebRenderLayerManager.h
@@ -70,16 +70,21 @@ public:
mozilla::wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc,
const LayerRect& aRect);
already_AddRefed<WebRenderFallbackData> GenerateFallbackData(nsDisplayItem* aItem,
wr::DisplayListBuilder& aBuilder,
nsDisplayListBuilder* aDisplayListBuilder,
LayerRect& aImageRect,
LayerPoint& aOffset);
+ Maybe<wr::WrImageMask> BuildWrMaskImage(nsDisplayItem* aItem,
+ wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsDisplayListBuilder* aDisplayListBuilder,
+ const LayerRect& aBounds);
bool PushItemAsImage(nsDisplayItem* aItem,
wr::DisplayListBuilder& aBuilder,
const StackingContextHelper& aSc,
nsDisplayListBuilder* aDisplayListBuilder);
void CreateWebRenderCommandsFromDisplayList(nsDisplayList* aDisplayList,
nsDisplayListBuilder* aDisplayListBuilder,
const StackingContextHelper& aSc,
wr::DisplayListBuilder& aBuilder);