mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-28 21:28:55 +00:00
Bug 1387325 - Part2. Add WR support for nsDisplayXULImage. r=mattwoodrow
MozReview-Commit-ID: 9DncgchiS44
This commit is contained in:
parent
c9aadaf83d
commit
4b055b693b
@ -94,6 +94,8 @@ if CONFIG['MOZ_XUL']:
|
||||
if CONFIG['MOZ_XUL']:
|
||||
DIRS += ['tree', 'grid']
|
||||
|
||||
include('/ipc/chromium/chromium-config.mozbuild')
|
||||
|
||||
FINAL_LIBRARY = 'xul'
|
||||
LOCAL_INCLUDES += [
|
||||
'../base',
|
||||
|
@ -52,6 +52,7 @@
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "SVGImageContext.h"
|
||||
#include "Units.h"
|
||||
#include "mozilla/layers/WebRenderLayerManager.h"
|
||||
|
||||
#if defined(XP_WIN)
|
||||
// Undefine LoadImage to prevent naming conflict with Windows.
|
||||
@ -415,6 +416,54 @@ nsImageBoxFrame::PaintImage(gfxContext& aRenderingContext,
|
||||
hasSubRect ? &mSubRect : nullptr);
|
||||
}
|
||||
|
||||
DrawResult
|
||||
nsImageBoxFrame::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aSc,
|
||||
mozilla::layers::WebRenderLayerManager* aManager,
|
||||
nsDisplayItem* aItem,
|
||||
nsPoint aPt,
|
||||
uint32_t aFlags)
|
||||
{
|
||||
DrawResult result;
|
||||
Maybe<nsPoint> anchorPoint;
|
||||
nsRect dest;
|
||||
nsCOMPtr<imgIContainer> imgCon = GetImageContainerForPainting(aPt, result,
|
||||
anchorPoint,
|
||||
dest);
|
||||
if (!imgCon) {
|
||||
return result;
|
||||
}
|
||||
|
||||
uint32_t containerFlags = imgIContainer::FLAG_NONE;
|
||||
if (aFlags & nsImageRenderer::FLAG_SYNC_DECODE_IMAGES) {
|
||||
containerFlags |= imgIContainer::FLAG_SYNC_DECODE;
|
||||
}
|
||||
RefPtr<layers::ImageContainer> container =
|
||||
imgCon->GetImageContainer(aManager, containerFlags);
|
||||
if (!container) {
|
||||
NS_WARNING("Failed to get image container");
|
||||
return DrawResult::NOT_READY;
|
||||
}
|
||||
|
||||
gfx::IntSize size;
|
||||
Maybe<wr::ImageKey> key = aManager->CreateImageKey(aItem, container, aBuilder, aSc, size);
|
||||
if (key.isNothing()) {
|
||||
return DrawResult::BAD_IMAGE;
|
||||
}
|
||||
const int32_t appUnitsPerDevPixel = PresContext()->AppUnitsPerDevPixel();
|
||||
LayoutDeviceRect fillRect = LayoutDeviceRect::FromAppUnits(dest,
|
||||
appUnitsPerDevPixel);
|
||||
wr::LayoutRect fill = aSc.ToRelativeLayoutRect(fillRect);
|
||||
|
||||
LayoutDeviceSize gapSize(0, 0);
|
||||
SamplingFilter sampleFilter = nsLayoutUtils::GetSamplingFilterForFrame(aItem->Frame());
|
||||
aBuilder.PushImage(fill, fill,
|
||||
wr::ToLayoutSize(fillRect.Size()), wr::ToLayoutSize(gapSize),
|
||||
wr::ToImageRendering(sampleFilter), key.value());
|
||||
|
||||
return DrawResult::SUCCESS;
|
||||
}
|
||||
|
||||
nsRect
|
||||
nsImageBoxFrame::GetDestRect(const nsPoint& aOffset, Maybe<nsPoint>& aAnchorPoint)
|
||||
{
|
||||
@ -479,6 +528,55 @@ void nsDisplayXULImage::Paint(nsDisplayListBuilder* aBuilder,
|
||||
nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
|
||||
}
|
||||
|
||||
LayerState
|
||||
nsDisplayXULImage::GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aParameters)
|
||||
{
|
||||
if (ShouldUseAdvancedLayer(aManager, gfxPrefs::LayersAllowImageLayers) &&
|
||||
CanOptimizeToImageLayer(aManager, aBuilder)) {
|
||||
return LAYER_ACTIVE;
|
||||
}
|
||||
return LAYER_NONE;
|
||||
}
|
||||
|
||||
already_AddRefed<Layer>
|
||||
nsDisplayXULImage::BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aContainerParameters)
|
||||
{
|
||||
return BuildDisplayItemLayer(aBuilder, aManager, aContainerParameters);
|
||||
}
|
||||
|
||||
bool
|
||||
nsDisplayXULImage::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) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t flags = imgIContainer::FLAG_SYNC_DECODE_IF_FAST;
|
||||
if (aDisplayListBuilder->ShouldSyncDecodeImages()) {
|
||||
flags |= imgIContainer::FLAG_SYNC_DECODE;
|
||||
}
|
||||
if (aDisplayListBuilder->IsPaintingToWindow()) {
|
||||
flags |= imgIContainer::FLAG_HIGH_QUALITY_SCALING;
|
||||
}
|
||||
|
||||
DrawResult result = static_cast<nsImageBoxFrame*>(mFrame)->
|
||||
CreateWebRenderCommands(aBuilder, aSc, aManager, this, ToReferenceFrame(), flags);
|
||||
|
||||
nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
|
||||
return true;
|
||||
}
|
||||
|
||||
nsDisplayItemGeometry*
|
||||
nsDisplayXULImage::AllocateGeometry(nsDisplayListBuilder* aBuilder)
|
||||
{
|
||||
|
@ -99,6 +99,13 @@ public:
|
||||
const nsRect& aDirtyRect,
|
||||
nsPoint aPt, uint32_t aFlags);
|
||||
|
||||
DrawResult CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
|
||||
const mozilla::layers::StackingContextHelper& aSc,
|
||||
mozilla::layers::WebRenderLayerManager* aManager,
|
||||
nsDisplayItem* aItem,
|
||||
nsPoint aPt,
|
||||
uint32_t aFlags);
|
||||
|
||||
bool CanOptimizeToImageLayer();
|
||||
|
||||
nsRect GetDestRect(const nsPoint& aOffset, Maybe<nsPoint>& aAnchorPoint);
|
||||
@ -163,6 +170,21 @@ public:
|
||||
// event receiver for us
|
||||
virtual void Paint(nsDisplayListBuilder* aBuilder,
|
||||
gfxContext* aCtx) override;
|
||||
|
||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aParameters) override;
|
||||
|
||||
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aContainerParameters) override;
|
||||
|
||||
virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
|
||||
const StackingContextHelper& aSc,
|
||||
nsTArray<WebRenderParentCommand>& aParentCommands,
|
||||
mozilla::layers::WebRenderLayerManager* aManager,
|
||||
nsDisplayListBuilder* aDisplayListBuilder) override;
|
||||
|
||||
NS_DISPLAY_DECL_NAME("XULImage", TYPE_XUL_IMAGE)
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user