Bug 1388162 - Add a Destroy function to nsDisplayItem to use instead of manually invoking the destructor, this will allow us to recycle them in the future. r=mstange

This commit is contained in:
Matt Woodrow 2017-08-07 16:07:43 +12:00
parent a3a130b6ff
commit 95f2e31f88
36 changed files with 265 additions and 208 deletions

View File

@ -3947,8 +3947,7 @@ nsDOMWindowUtils::GetOMTAStyle(nsIDOMElement* aElement,
if (frame && nsLayoutUtils::AreAsyncAnimationsEnabled()) {
if (aProperty.EqualsLiteral("opacity")) {
Layer* layer =
FrameLayerBuilder::GetDedicatedLayer(frame,
nsDisplayItem::TYPE_OPACITY);
FrameLayerBuilder::GetDedicatedLayer(frame, DisplayItemType::TYPE_OPACITY);
if (layer) {
float value = 0;
bool hadAnimatedOpacity = false;
@ -3972,8 +3971,7 @@ nsDOMWindowUtils::GetOMTAStyle(nsIDOMElement* aElement,
}
} else if (aProperty.EqualsLiteral("transform")) {
Layer* layer =
FrameLayerBuilder::GetDedicatedLayer(frame,
nsDisplayItem::TYPE_TRANSFORM);
FrameLayerBuilder::GetDedicatedLayer(frame, DisplayItemType::TYPE_TRANSFORM);
if (layer) {
MaybeTransform transform;
ShadowLayerForwarder* forwarder = layer->Manager()->AsShadowForwarder();

View File

@ -1069,7 +1069,7 @@ HTMLCanvasElement::InvalidateCanvasContent(const gfx::Rect* damageRect)
nsIFrame::WebRenderUserDataTable* userDataTable =
frame->GetProperty(nsIFrame::WebRenderUserDataProperty());
RefPtr<WebRenderUserData> data;
userDataTable->Get(nsDisplayItem::TYPE_CANVAS, getter_AddRefs(data));
userDataTable->Get(static_cast<uint32_t>(DisplayItemType::TYPE_CANVAS), getter_AddRefs(data));
if (data && data->AsCanvasData()) {
renderer = data->AsCanvasData()->GetCanvasRenderer();
}
@ -1084,10 +1084,10 @@ HTMLCanvasElement::InvalidateCanvasContent(const gfx::Rect* damageRect)
nsIntSize size = GetWidthHeight();
if (size.width != 0 && size.height != 0) {
gfx::IntRect invalRect = gfx::IntRect::Truncate(*damageRect);
layer = frame->InvalidateLayer(nsDisplayItem::TYPE_CANVAS, &invalRect);
layer = frame->InvalidateLayer(DisplayItemType::TYPE_CANVAS, &invalRect);
}
} else {
layer = frame->InvalidateLayer(nsDisplayItem::TYPE_CANVAS);
layer = frame->InvalidateLayer(DisplayItemType::TYPE_CANVAS);
}
if (layer) {

View File

@ -384,7 +384,7 @@ void VideoFrameContainer::InvalidateWithFlags(uint32_t aFlags)
if (invalidateFrame) {
frame->InvalidateFrame();
} else {
frame->InvalidateLayer(nsDisplayItem::TYPE_VIDEO, nullptr, nullptr,
frame->InvalidateLayer(DisplayItemType::TYPE_VIDEO, nullptr, nullptr,
asyncInvalidate ? nsIFrame::UPDATE_IS_ASYNC : 0);
}
}

View File

@ -558,7 +558,7 @@ NS_IMETHODIMP nsPluginInstanceOwner::InvalidateRect(NPRect *invalidRect)
double scaleFactor = 1.0;
GetContentsScaleFactor(&scaleFactor);
rect.ScaleRoundOut(scaleFactor);
mPluginFrame->InvalidateLayer(nsDisplayItem::TYPE_PLUGIN, &rect);
mPluginFrame->InvalidateLayer(DisplayItemType::TYPE_PLUGIN, &rect);
return NS_OK;
}
@ -571,7 +571,7 @@ NS_IMETHODIMP
nsPluginInstanceOwner::RedrawPlugin()
{
if (mPluginFrame) {
mPluginFrame->InvalidateLayer(nsDisplayItem::TYPE_PLUGIN);
mPluginFrame->InvalidateLayer(DisplayItemType::TYPE_PLUGIN);
}
return NS_OK;
}

View File

@ -201,15 +201,15 @@ WebRenderLayerManager::CreateWebRenderCommandsFromDisplayList(nsDisplayList* aDi
nsDisplayList savedItems;
nsDisplayItem* item;
while ((item = aDisplayList->RemoveBottom()) != nullptr) {
nsDisplayItem::Type itemType = item->GetType();
DisplayItemType itemType = item->GetType();
// If the item is a event regions item, but is empty (has no regions in it)
// then we should just throw it out
if (itemType == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
nsDisplayLayerEventRegions* eventRegions =
static_cast<nsDisplayLayerEventRegions*>(item);
if (eventRegions->IsEmpty()) {
item->~nsDisplayItem();
item->Destroy(aDisplayListBuilder);
continue;
}
}
@ -220,7 +220,7 @@ WebRenderLayerManager::CreateWebRenderCommandsFromDisplayList(nsDisplayList* aDi
while ((aboveItem = aDisplayList->GetBottom()) != nullptr) {
if (aboveItem->TryMerge(item)) {
aDisplayList->RemoveBottom();
item->~nsDisplayItem();
item->Destroy(aDisplayListBuilder);
item = aboveItem;
itemType = item->GetType();
} else {
@ -232,7 +232,7 @@ WebRenderLayerManager::CreateWebRenderCommandsFromDisplayList(nsDisplayList* aDi
= item->GetSameCoordinateSystemChildren();
if (item->ShouldFlattenAway(aDisplayListBuilder)) {
aDisplayList->AppendToBottom(itemSameCoordinateSystemChildren);
item->~nsDisplayItem();
item->Destroy(aDisplayListBuilder);
continue;
}
@ -384,7 +384,7 @@ PaintItemByDrawTarget(nsDisplayItem* aItem,
RefPtr<gfxContext> context = gfxContext::CreateOrNull(aDT, aOffset.ToUnknownPoint());
MOZ_ASSERT(context);
if (aItem->GetType() == nsDisplayItem::TYPE_MASK) {
if (aItem->GetType() == DisplayItemType::TYPE_MASK) {
context->SetMatrix(gfxMatrix::Translation(-aOffset.x, -aOffset.y));
static_cast<nsDisplayMask*>(aItem)->PaintMask(aDisplayListBuilder, context);
} else {
@ -460,7 +460,7 @@ WebRenderLayerManager::GenerateFallbackData(nsDisplayItem* aItem,
}
}
gfx::SurfaceFormat format = aItem->GetType() == nsDisplayItem::TYPE_MASK ?
gfx::SurfaceFormat format = aItem->GetType() == DisplayItemType::TYPE_MASK ?
gfx::SurfaceFormat::A8 : gfx::SurfaceFormat::B8G8R8A8;
if (!geometry || !invalidRegion.IsEmpty() || fallbackData->IsInvalid()) {
if (gfxPrefs::WebRenderBlobImages()) {

View File

@ -255,7 +255,7 @@ struct RangePaintInfo {
~RangePaintInfo()
{
mList.DeleteAll();
mList.DeleteAll(&mBuilder);
MOZ_COUNT_DTOR(RangePaintInfo);
}
};
@ -4864,7 +4864,7 @@ PresShell::ClipListToRange(nsDisplayListBuilder *aBuilder,
}
else {
// otherwise, just delete the item and don't readd it to the list
i->~nsDisplayItem();
i->Destroy(aBuilder);
}
}
@ -5240,14 +5240,14 @@ AddCanvasBackgroundColor(const nsDisplayList& aList, nsIFrame* aCanvasFrame,
{
for (nsDisplayItem* i = aList.GetBottom(); i; i = i->GetAbove()) {
if (i->Frame() == aCanvasFrame &&
i->GetType() == nsDisplayItem::TYPE_CANVAS_BACKGROUND_COLOR) {
i->GetType() == DisplayItemType::TYPE_CANVAS_BACKGROUND_COLOR) {
nsDisplayCanvasBackgroundColor* bg = static_cast<nsDisplayCanvasBackgroundColor*>(i);
bg->SetExtraBackgroundColor(aColor);
return true;
}
nsDisplayList* sublist = i->GetSameCoordinateSystemChildren();
if (sublist &&
!(i->GetType() == nsDisplayItem::TYPE_BLEND_CONTAINER && !aCSSBackgroundColor) &&
!(i->GetType() == DisplayItemType::TYPE_BLEND_CONTAINER && !aCSSBackgroundColor) &&
AddCanvasBackgroundColor(*sublist, aCanvasFrame, aColor, aCSSBackgroundColor))
return true;
}
@ -6131,7 +6131,7 @@ PresShell::DoUpdateApproximateFrameVisibility(bool aRemoveOnly)
ClearApproximateFrameVisibilityVisited(rootFrame->GetView(), true);
list.DeleteAll();
list.DeleteAll(&builder);
#endif
}

View File

@ -1774,7 +1774,7 @@ RestyleManager::AddLayerChangesForAnimation(nsIFrame* aFrame,
// so we can skip adding any change hint here. (If we *were* to add
// nsChangeHint_UpdateTransformLayer, ApplyRenderingChangeToTree would
// complain that we're updating a transform layer without a transform).
if (layerInfo.mLayerType == nsDisplayItem::TYPE_TRANSFORM &&
if (layerInfo.mLayerType == DisplayItemType::TYPE_TRANSFORM &&
!aFrame->StyleDisplay()->HasTransformStyle()) {
continue;
}

View File

@ -200,13 +200,13 @@ PrintDisplayItemTo(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem,
}
}
#ifdef MOZ_DUMP_PAINTING
if (aItem->GetType() == nsDisplayItem::TYPE_MASK) {
if (aItem->GetType() == DisplayItemType::TYPE_MASK) {
nsCString str;
(static_cast<nsDisplayMask*>(aItem))->PrintEffects(str);
aStream << str.get();
}
if (aItem->GetType() == nsDisplayItem::TYPE_FILTER) {
if (aItem->GetType() == DisplayItemType::TYPE_FILTER) {
nsCString str;
(static_cast<nsDisplayFilter*>(aItem))->PrintEffects(str);
aStream << str.get();

View File

@ -3274,7 +3274,7 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect,
nsDisplayItem::HitTestState hitTestState;
builder.SetHitTestShouldStopAtFirstOpaque(aFlags & ONLY_VISIBLE);
list.HitTest(&builder, aRect, &hitTestState, &aOutFrames);
list.DeleteAll();
list.DeleteAll(&builder);
return NS_OK;
}
@ -3852,7 +3852,7 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
// Flush the list so we don't trigger the IsEmpty-on-destruction assertion
list.DeleteAll();
list.DeleteAll(&builder);
return NS_OK;
}

View File

@ -1353,7 +1353,7 @@ nsComboboxDisplayFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// remove background items if parent frame is themed
if (mComboBox->IsThemed()) {
set.BorderBackground()->DeleteAll();
set.BorderBackground()->DeleteAll(aBuilder);
}
set.MoveTo(aLists);

View File

@ -129,7 +129,7 @@ nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
IsIndeterminate()
? PaintIndeterminateMark : PaintCheckMark,
"CheckedCheckbox",
nsDisplayItem::TYPE_CHECKED_CHECKBOX));
DisplayItemType::TYPE_CHECKED_CHECKBOX));
}
#endif

View File

@ -90,7 +90,7 @@ nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
aLists.Content()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, this, PaintCheckedRadioButton,
"CheckedRadioButton",
nsDisplayItem::TYPE_CHECKED_RADIOBUTTON));
DisplayItemType::TYPE_CHECKED_RADIOBUTTON));
}
#endif

View File

@ -202,7 +202,7 @@ public:
gfxContext* aCtx) override;
virtual uint32_t GetPerFrameKey() override {
return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey();
return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey();
}
void PaintTextToContext(gfxContext* aCtx,
nsPoint aOffsetFromRect);
@ -718,7 +718,7 @@ TextOverflow::PruneDisplayListContents(nsDisplayList* aList,
while ((item = aList->RemoveBottom())) {
nsIFrame* itemFrame = item->Frame();
if (IsFrameDescendantOfAny(itemFrame, aFramesToHide, mBlock)) {
item->~nsDisplayItem();
item->Destroy(mBuilder);
continue;
}

View File

@ -51,7 +51,7 @@ public:
virtual void Paint(nsDisplayListBuilder* aBuilder,
gfxContext* aCtx) override;
NS_DISPLAY_DECL_NAME("ColumnRule", nsDisplayItem::TYPE_COLUMN_RULE);
NS_DISPLAY_DECL_NAME("ColumnRule", TYPE_COLUMN_RULE);
private:
nsTArray<nsCSSBorderRenderer> mBorderRenderers;

View File

@ -2248,14 +2248,14 @@ DisplayDebugBorders(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
if (nsFrame::GetShowFrameBorders() && !aFrame->GetRect().IsEmpty()) {
aLists.Outlines()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, aFrame, PaintDebugBorder, "DebugBorder",
nsDisplayItem::TYPE_DEBUG_BORDER));
DisplayItemType::TYPE_DEBUG_BORDER));
}
// Draw a border around the current event target
if (nsFrame::GetShowEventTargetFrameBorder() &&
aFrame->PresContext()->PresShell()->GetDrawEventTargetFrame() == aFrame) {
aLists.Outlines()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, aFrame, PaintEventTargetBorder, "EventTargetBorder",
nsDisplayItem::TYPE_EVENT_TARGET_BORDER));
DisplayItemType::TYPE_EVENT_TARGET_BORDER));
}
}
#endif
@ -2336,9 +2336,9 @@ static bool
ItemParticipatesIn3DContext(nsIFrame* aAncestor, nsDisplayItem* aItem)
{
nsIFrame* transformFrame;
if (aItem->GetType() == nsDisplayItem::TYPE_TRANSFORM) {
if (aItem->GetType() == DisplayItemType::TYPE_TRANSFORM) {
transformFrame = aItem->Frame();
} else if (aItem->GetType() == nsDisplayItem::TYPE_PERSPECTIVE) {
} else if (aItem->GetType() == DisplayItemType::TYPE_PERSPECTIVE) {
transformFrame = static_cast<nsDisplayPerspective*>(aItem)->TransformFrame();
} else {
return false;
@ -2603,11 +2603,11 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
}
if (aBuilder->IsBackgroundOnly()) {
set.BlockBorderBackgrounds()->DeleteAll();
set.Floats()->DeleteAll();
set.Content()->DeleteAll();
set.PositionedDescendants()->DeleteAll();
set.Outlines()->DeleteAll();
set.BlockBorderBackgrounds()->DeleteAll(aBuilder);
set.Floats()->DeleteAll(aBuilder);
set.Content()->DeleteAll(aBuilder);
set.PositionedDescendants()->DeleteAll(aBuilder);
set.Outlines()->DeleteAll(aBuilder);
}
// Sort PositionedDescendants() in CSS 'z-order' order. The list is already
@ -2885,7 +2885,7 @@ WrapInWrapList(nsDisplayListBuilder* aBuilder,
// makes the perspective frame create one (so we have an atomic entry for z-index
// sorting).
nsIFrame *itemFrame = item->Frame();
if (item->GetType() == nsDisplayItem::TYPE_PERSPECTIVE) {
if (item->GetType() == DisplayItemType::TYPE_PERSPECTIVE) {
itemFrame = static_cast<nsDisplayPerspective*>(item)->TransformFrame();
}
@ -6606,7 +6606,7 @@ bool
nsIFrame::TryUpdateTransformOnly(Layer** aLayerResult)
{
Layer* layer = FrameLayerBuilder::GetDedicatedLayer(
this, nsDisplayItem::TYPE_TRANSFORM);
this, DisplayItemType::TYPE_TRANSFORM);
if (!layer || !layer->HasUserData(LayerIsPrerenderedDataKey())) {
// If this layer isn't prerendered or we clip composites to our OS
// window, then we can't correctly optimize to an empty
@ -6677,12 +6677,12 @@ nsIFrame::SchedulePaint(PaintType aType)
}
Layer*
nsIFrame::InvalidateLayer(uint32_t aDisplayItemKey,
nsIFrame::InvalidateLayer(DisplayItemType aDisplayItemKey,
const nsIntRect* aDamageRect,
const nsRect* aFrameDamageRect,
uint32_t aFlags /* = 0 */)
{
NS_ASSERTION(aDisplayItemKey > 0, "Need a key");
NS_ASSERTION(aDisplayItemKey > DisplayItemType::TYPE_ZERO, "Need a key");
Layer* layer = FrameLayerBuilder::GetDedicatedLayer(this, aDisplayItemKey);
@ -6707,16 +6707,16 @@ nsIFrame::InvalidateLayer(uint32_t aDisplayItemKey,
// screen because sometimes we don't have any retainned data
// for remote type displayitem and thus Repaint event is not
// triggered. So, always invalidate here as well.
uint32_t displayItemKey = aDisplayItemKey;
if (aDisplayItemKey == nsDisplayItem::TYPE_PLUGIN ||
aDisplayItemKey == nsDisplayItem::TYPE_REMOTE) {
displayItemKey = 0;
DisplayItemType displayItemKey = aDisplayItemKey;
if (aDisplayItemKey == DisplayItemType::TYPE_PLUGIN ||
aDisplayItemKey == DisplayItemType::TYPE_REMOTE) {
displayItemKey = DisplayItemType::TYPE_ZERO;
}
if (aFrameDamageRect) {
InvalidateFrameWithRect(*aFrameDamageRect, displayItemKey);
InvalidateFrameWithRect(*aFrameDamageRect, static_cast<uint32_t>(displayItemKey));
} else {
InvalidateFrame(displayItemKey);
InvalidateFrame(static_cast<uint32_t>(displayItemKey));
}
return nullptr;

View File

@ -2970,7 +2970,7 @@ MaxZIndexInListOfItemsContainedInFrame(nsDisplayList* aList, nsIFrame* aFrame)
nsIFrame* itemFrame = item->Frame();
// Perspective items return the scroll frame as their Frame(), so consider
// their TransformFrame() instead.
if (item->GetType() == nsDisplayItem::TYPE_PERSPECTIVE) {
if (item->GetType() == DisplayItemType::TYPE_PERSPECTIVE) {
itemFrame = static_cast<nsDisplayPerspective*>(item)->TransformFrame();
}
if (nsLayoutUtils::IsProperAncestorFrame(aFrame, itemFrame)) {
@ -3227,7 +3227,7 @@ ClipItemsExceptCaret(nsDisplayList* aList,
continue;
}
if (i->GetType() != nsDisplayItem::TYPE_CARET) {
if (i->GetType() != DisplayItemType::TYPE_CARET) {
const DisplayItemClipChain* clip = i->GetClipChain();
const DisplayItemClipChain* intersection = nullptr;
if (aCache.Get(clip, &intersection)) {

View File

@ -44,6 +44,7 @@
#include "nsChangeHint.h"
#include "nsStyleContextInlines.h"
#include "mozilla/gfx/MatrixFwd.h"
#include "nsDisplayItemTypes.h"
#ifdef ACCESSIBILITY
#include "mozilla/a11y/AccTypes.h"
@ -3030,7 +3031,7 @@ public:
enum {
UPDATE_IS_ASYNC = 1 << 0
};
Layer* InvalidateLayer(uint32_t aDisplayItemKey,
Layer* InvalidateLayer(DisplayItemType aDisplayItemKey,
const nsIntRect* aDamageRect = nullptr,
const nsRect* aFrameDamageRect = nullptr,
uint32_t aFlags = 0);

View File

@ -646,7 +646,7 @@ nsImageFrame::InvalidateSelf(const nsIntRect* aLayerInvalidRect,
nsIFrame::WebRenderUserDataTable* userDataTable =
GetProperty(nsIFrame::WebRenderUserDataProperty());
RefPtr<WebRenderUserData> data;
userDataTable->Get(nsDisplayItem::TYPE_IMAGE, getter_AddRefs(data));
userDataTable->Get(static_cast<uint32_t>(DisplayItemType::TYPE_IMAGE), getter_AddRefs(data));
if (data && data->AsFallbackData()) {
data->AsFallbackData()->SetInvalid(true);
}
@ -654,12 +654,12 @@ nsImageFrame::InvalidateSelf(const nsIntRect* aLayerInvalidRect,
return;
}
InvalidateLayer(nsDisplayItem::TYPE_IMAGE,
InvalidateLayer(DisplayItemType::TYPE_IMAGE,
aLayerInvalidRect,
aFrameInvalidRect);
if (!mFirstFrameComplete) {
InvalidateLayer(nsDisplayItem::TYPE_ALT_FEEDBACK,
InvalidateLayer(DisplayItemType::TYPE_ALT_FEEDBACK,
aLayerInvalidRect,
aFrameInvalidRect);
}
@ -1862,7 +1862,7 @@ nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (GetShowFrameBorders() && GetImageMap()) {
aLists.Outlines()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, this, PaintDebugImageMap, "DebugImageMap",
nsDisplayItem::TYPE_DEBUG_IMAGE_MAP));
DisplayItemType::TYPE_DEBUG_IMAGE_MAP));
}
#endif
}

View File

@ -421,7 +421,7 @@ PruneDisplayListForExtraPage(nsDisplayListBuilder* aBuilder,
if (!nsLayoutUtils::IsProperAncestorFrameCrossDoc(aPage, f)) {
// We're throwing this away so call its destructor now. The memory
// is owned by aBuilder which destroys all items at once.
i->~nsDisplayItem();
i->Destroy(aBuilder);
continue;
}
}
@ -496,7 +496,7 @@ public:
static_cast<nsPageFrame*>(mFrame)->
PaintHeaderFooter(*aCtx, ToReferenceFrame(), mDisableSubpixelAA);
}
NS_DISPLAY_DECL_NAME("HeaderFooter", nsDisplayItem::TYPE_HEADER_FOOTER)
NS_DISPLAY_DECL_NAME("HeaderFooter", TYPE_HEADER_FOOTER)
virtual nsRect GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder) override {
bool snap;

View File

@ -262,7 +262,7 @@ nsPlaceholderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
aLists.Outlines()->AppendNewToTop(
new (aBuilder) nsDisplayGeneric(aBuilder, this, PaintDebugPlaceholder,
"DebugPlaceholder",
nsDisplayItem::TYPE_DEBUG_PLACEHOLDER));
DisplayItemType::TYPE_DEBUG_PLACEHOLDER));
}
#endif
}

View File

@ -1173,7 +1173,7 @@ nsPluginFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (type == nsPresContext::eContext_Print) {
aLists.Content()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, this, PaintPrintPlugin, "PrintPlugin",
nsDisplayItem::TYPE_PRINT_PLUGIN));
DisplayItemType::TYPE_PRINT_PLUGIN));
} else {
LayerState state = GetLayerState(aBuilder, nullptr);
if (state == LAYER_INACTIVE &&
@ -1394,7 +1394,7 @@ nsPluginFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
RefPtr<Layer> layer =
(aManager->GetLayerBuilder()->GetLeafLayerFor(aBuilder, aItem));
if (aItem->GetType() == nsDisplayItem::TYPE_PLUGIN) {
if (aItem->GetType() == DisplayItemType::TYPE_PLUGIN) {
RefPtr<ImageContainer> container;
// Image for Windowed plugins that support window capturing for scroll
// operations or async windowless rendering.
@ -1447,7 +1447,7 @@ nsPluginFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
lm->AddDidCompositeObserver(mDidCompositeObserver.get());
}
} else {
NS_ASSERTION(aItem->GetType() == nsDisplayItem::TYPE_PLUGIN_READBACK,
NS_ASSERTION(aItem->GetType() == DisplayItemType::TYPE_PLUGIN_READBACK,
"Unknown item type");
MOZ_ASSERT(!IsOpaque(), "Opaque plugins don't use backgrounds");

View File

@ -316,7 +316,7 @@ WrapBackgroundColorInOwnLayer(nsDisplayListBuilder* aBuilder,
nsDisplayList tempItems;
nsDisplayItem* item;
while ((item = aList->RemoveBottom()) != nullptr) {
if (item->GetType() == nsDisplayItem::TYPE_BACKGROUND_COLOR) {
if (item->GetType() == DisplayItemType::TYPE_BACKGROUND_COLOR) {
nsDisplayList tmpList;
tmpList.AppendToTop(item);
item = new (aBuilder) nsDisplayOwnLayer(aBuilder, aFrame, &tmpList, aBuilder->CurrentActiveScrolledRoot());
@ -580,7 +580,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (aBuilder->IsForFrameVisibility()) {
// We don't add the childItems to the return list as we're dealing with them here.
presShell->RebuildApproximateFrameVisibilityDisplayList(childItems);
childItems.DeleteAll();
childItems.DeleteAll(aBuilder);
} else {
aLists.Content()->AppendToTop(&childItems);
}

View File

@ -5030,7 +5030,7 @@ public:
}
bool TryMerge(nsDisplayItem* aItem) override {
if (aItem->GetType() != TYPE_TEXT)
if (aItem->GetType() != DisplayItemType::TYPE_TEXT)
return false;
if (aItem->GetClipChain() != GetClipChain())
return false;

View File

@ -278,7 +278,7 @@ RenderFrameParent::TriggerRepaint()
return;
}
docFrame->InvalidateLayer(nsDisplayItem::TYPE_REMOTE);
docFrame->InvalidateLayer(DisplayItemType::TYPE_REMOTE);
}
void

View File

@ -1896,8 +1896,7 @@ public:
}
virtual uint32_t GetPerFrameKey() override {
return (mIndex << nsDisplayItem::TYPE_BITS)
| nsDisplayItem::GetPerFrameKey();
return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey();
}
private:

View File

@ -286,13 +286,13 @@ DisplayItemData::~DisplayItemData()
void
DisplayItemData::ClearAnimationCompositorState()
{
if (mDisplayItemKey != nsDisplayItem::TYPE_TRANSFORM &&
mDisplayItemKey != nsDisplayItem::TYPE_OPACITY) {
if (GetDisplayItemTypeFromKey(mDisplayItemKey) != DisplayItemType::TYPE_TRANSFORM &&
GetDisplayItemTypeFromKey(mDisplayItemKey) != DisplayItemType::TYPE_OPACITY) {
return;
}
for (nsIFrame* frame : mFrameList) {
nsCSSPropertyID prop = mDisplayItemKey == nsDisplayItem::TYPE_TRANSFORM ?
nsCSSPropertyID prop = GetDisplayItemTypeFromKey(mDisplayItemKey) == DisplayItemType::TYPE_TRANSFORM ?
eCSSProperty_transform : eCSSProperty_opacity;
EffectCompositor::ClearIsRunningOnCompositor(frame, prop);
}
@ -357,14 +357,14 @@ public:
case LAYER_SVG_EFFECTS:
layerState = "LAYER_SVG_EFFECTS"; break;
}
uint32_t mask = (1 << nsDisplayItem::TYPE_BITS) - 1;
uint32_t mask = (1 << TYPE_BITS) - 1;
nsAutoCString str;
str += prefix;
str += nsPrintfCString("Frame %p ", data->mFrameList[0]);
str += nsDisplayItem::DisplayItemTypeName(static_cast<nsDisplayItem::Type>(data->mDisplayItemKey & mask));
if ((data->mDisplayItemKey >> nsDisplayItem::TYPE_BITS)) {
str += nsPrintfCString("(%i)", data->mDisplayItemKey >> nsDisplayItem::TYPE_BITS);
if ((data->mDisplayItemKey >> TYPE_BITS)) {
str += nsPrintfCString("(%i)", data->mDisplayItemKey >> TYPE_BITS);
}
str += nsPrintfCString(", %s, Layer %p", layerState, data->mLayer.get());
if (data->mOptLayer) {
@ -2086,7 +2086,7 @@ FrameLayerBuilder::IterateRetainedDataFor(nsIFrame* aFrame, DisplayItemDataCallb
for (uint32_t i = 0; i < array.Length(); i++) {
DisplayItemData* data = DisplayItemData::AssertDisplayItemData(array.ElementAt(i));
if (data->mDisplayItemKey != nsDisplayItem::TYPE_ZERO) {
if (data->mDisplayItemKey != 0) {
aCallback(aFrame, data);
}
}
@ -2500,7 +2500,7 @@ AppUnitsPerDevPixel(nsDisplayItem* aItem)
// But zoom display items report their bounds etc using the parent document's
// APD because zoom items act as a conversion layer between the two different
// APDs.
if (aItem->GetType() == nsDisplayItem::TYPE_ZOOM) {
if (aItem->GetType() == DisplayItemType::TYPE_ZOOM) {
return static_cast<nsDisplayZoom*>(aItem)->GetParentAppUnitsPerDevPixel();
}
return aItem->Frame()->PresContext()->AppUnitsPerDevPixel();
@ -3167,7 +3167,7 @@ void ContainerState::FinishPaintedLayerData(PaintedLayerData& aData, FindOpaqueB
}
for (auto& item : data->mAssignedDisplayItems) {
MOZ_ASSERT(item.mItem->GetType() != nsDisplayItem::TYPE_LAYER_EVENT_REGIONS);
MOZ_ASSERT(item.mItem->GetType() != DisplayItemType::TYPE_LAYER_EVENT_REGIONS);
InvalidateForLayerChange(item.mItem, data->mLayer);
mLayerBuilder->AddPaintedDisplayItem(data, item.mItem, item.mClip,
@ -3711,12 +3711,12 @@ PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
basic->BeginTransaction();
basic->SetTarget(context);
if (aItem->GetType() == nsDisplayItem::TYPE_MASK) {
if (aItem->GetType() == DisplayItemType::TYPE_MASK) {
static_cast<nsDisplayMask*>(aItem)->PaintAsLayer(aBuilder, aCtx, basic);
if (basic->InTransaction()) {
basic->AbortTransaction();
}
} else if (aItem->GetType() == nsDisplayItem::TYPE_FILTER){
} else if (aItem->GetType() == DisplayItemType::TYPE_FILTER){
static_cast<nsDisplayFilter*>(aItem)->PaintAsLayer(aBuilder, aCtx, basic);
if (basic->InTransaction()) {
basic->AbortTransaction();
@ -3954,7 +3954,7 @@ ContainerState::SetupMaskLayerForCSSMask(Layer* aLayer,
static bool
IsScrollThumbLayer(nsDisplayItem* aItem)
{
return aItem->GetType() == nsDisplayItem::TYPE_OWN_LAYER &&
return aItem->GetType() == DisplayItemType::TYPE_OWN_LAYER &&
static_cast<nsDisplayOwnLayer*>(aItem)->IsScrollThumbLayer();
}
@ -3997,15 +3997,15 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
nsDisplayList savedItems;
nsDisplayItem* item;
while ((item = aList->RemoveBottom()) != nullptr) {
nsDisplayItem::Type itemType = item->GetType();
DisplayItemType itemType = item->GetType();
// If the item is a event regions item, but is empty (has no regions in it)
// then we should just throw it out
if (itemType == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
nsDisplayLayerEventRegions* eventRegions =
static_cast<nsDisplayLayerEventRegions*>(item);
if (eventRegions->IsEmpty()) {
item->~nsDisplayItem();
item->Destroy(mBuilder);
continue;
}
}
@ -4016,7 +4016,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
while ((aboveItem = aList->GetBottom()) != nullptr) {
if (aboveItem->TryMerge(item)) {
aList->RemoveBottom();
item->~nsDisplayItem();
item->Destroy(mBuilder);
item = aboveItem;
itemType = item->GetType();
} else {
@ -4028,7 +4028,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
= item->GetSameCoordinateSystemChildren();
if (item->ShouldFlattenAway(mBuilder)) {
aList->AppendToBottom(itemSameCoordinateSystemChildren);
item->~nsDisplayItem();
item->Destroy(mBuilder);
continue;
}
@ -4042,8 +4042,8 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
}
if (mParameters.mForEventsAndPluginsOnly && !item->GetChildren() &&
(itemType != nsDisplayItem::TYPE_LAYER_EVENT_REGIONS &&
itemType != nsDisplayItem::TYPE_PLUGIN)) {
(itemType != DisplayItemType::TYPE_LAYER_EVENT_REGIONS &&
itemType != DisplayItemType::TYPE_PLUGIN)) {
continue;
}
@ -4070,7 +4070,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
itemASR = item->GetActiveScrolledRoot();
const DisplayItemClipChain* itemClipChain = item->GetClipChain();
if (itemClipChain && itemClipChain->mASR == itemASR &&
itemType != nsDisplayItem::TYPE_STICKY_POSITION) {
itemType != DisplayItemType::TYPE_STICKY_POSITION) {
layerClipChain = itemClipChain->mParent;
} else {
layerClipChain = itemClipChain;
@ -4091,13 +4091,13 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
bool snap;
nsRect itemContent = item->GetBounds(mBuilder, &snap);
if (itemType == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
nsDisplayLayerEventRegions* eventRegions =
static_cast<nsDisplayLayerEventRegions*>(item);
itemContent = eventRegions->GetHitRegionBounds(mBuilder, &snap);
}
nsIntRect itemDrawRect = ScaleToOutsidePixels(itemContent, snap);
bool prerenderedTransform = itemType == nsDisplayItem::TYPE_TRANSFORM &&
bool prerenderedTransform = itemType == DisplayItemType::TYPE_TRANSFORM &&
static_cast<nsDisplayTransform*>(item)->MayBeAnimated(mBuilder);
ParentLayerIntRect clipRect;
const DisplayItemClip& itemClip = item->GetClip();
@ -4112,7 +4112,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
#ifdef DEBUG
nsRect bounds = itemContent;
bool dummy;
if (itemType == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
bounds = item->GetBounds(mBuilder, &dummy);
if (itemClip.HasClip()) {
bounds.IntersectRect(bounds, itemClip.GetClipRect());
@ -4176,7 +4176,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
// 3D-transformed layers don't necessarily draw in the order in which
// they're added to their parent container layer.
bool mayDrawOutOfOrder = itemType == nsDisplayItem::TYPE_TRANSFORM &&
bool mayDrawOutOfOrder = itemType == DisplayItemType::TYPE_TRANSFORM &&
(item->Frame()->Combines3DTransformWithAncestors() ||
item->Frame()->Extend3DContext());
@ -4201,7 +4201,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
bool hasScrolledClip = layerClipChain && layerClipChain->mClip.HasClip() &&
(!ActiveScrolledRoot::IsAncestor(layerClipChain->mASR, itemASR) ||
itemType == nsDisplayItem::TYPE_STICKY_POSITION);
itemType == DisplayItemType::TYPE_STICKY_POSITION);
if (hasScrolledClip) {
// If the clip is scrolled, reserve just the area of the clip for
@ -4264,11 +4264,11 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
params.mCompositorASR = params.mScrollMetadataASR != mContainerScrollMetadataASR
? params.mScrollMetadataASR
: mContainerCompositorASR;
if (itemType == nsDisplayItem::TYPE_FIXED_POSITION) {
if (itemType == DisplayItemType::TYPE_FIXED_POSITION) {
params.mCompositorASR = itemASR;
}
if (itemType == nsDisplayItem::TYPE_PERSPECTIVE) {
if (itemType == DisplayItemType::TYPE_PERSPECTIVE) {
// Perspective items have a single child item, an nsDisplayTransform.
// If the perspective item is scrolled, but the perspective-inducing
// frame is outside the scroll frame (indicated by item->Frame()
@ -4350,18 +4350,18 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
ownLayer->SetScrolledClip(Some(scrolledLayerClip));
}
if (item->GetType() == nsDisplayItem::TYPE_MASK) {
if (item->GetType() == DisplayItemType::TYPE_MASK) {
MOZ_ASSERT(itemClip.GetRoundedRectCount() == 0);
nsDisplayMask* maskItem = static_cast<nsDisplayMask*>(item);
SetupMaskLayerForCSSMask(ownLayer, maskItem);
nsDisplayItem* next = aList->GetBottom();
if (next && next->GetType() == nsDisplayItem::TYPE_SCROLL_INFO_LAYER) {
if (next && next->GetType() == DisplayItemType::TYPE_SCROLL_INFO_LAYER) {
// Since we do build a layer for mask, there is no need for this
// scroll info layer anymore.
aList->RemoveBottom();
next->~nsDisplayItem();
next->Destroy(mBuilder);
}
}
@ -4387,7 +4387,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
newLayerEntry->mScrollMetadataASR = scrollMetadataASR;
newLayerEntry->mClipChain = layerClipChain;
newLayerEntry->mLayerState = layerState;
if (itemType == nsDisplayItem::TYPE_FIXED_POSITION) {
if (itemType == DisplayItemType::TYPE_FIXED_POSITION) {
newLayerEntry->mIsFixedToRootScrollFrame =
item->Frame()->StyleDisplay()->mPosition == NS_STYLE_POSITION_FIXED &&
nsLayoutUtils::IsReallyFixedPos(item->Frame());
@ -4395,7 +4395,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
// Don't attempt to flatten compnent alpha layers that are within
// a forced active layer, or an active transform;
if (itemType == nsDisplayItem::TYPE_TRANSFORM ||
if (itemType == DisplayItemType::TYPE_TRANSFORM ||
layerState == LAYER_ACTIVE_FORCE) {
newLayerEntry->mPropagateComponentAlphaFlattening = false;
}
@ -4409,13 +4409,13 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
// nsDisplayTransform::BuildLayer must set layerContentsVisibleRect.
// We rely on this to ensure 3D transforms compute a reasonable
// layer visible region.
NS_ASSERTION(itemType != nsDisplayItem::TYPE_TRANSFORM ||
NS_ASSERTION(itemType != DisplayItemType::TYPE_TRANSFORM ||
layerContentsVisibleRect.width >= 0,
"Transform items must set layerContentsVisibleRect!");
if (mLayerBuilder->IsBuildingRetainedLayers()) {
newLayerEntry->mLayerContentsVisibleRect = layerContentsVisibleRect;
if (itemType == nsDisplayItem::TYPE_PERSPECTIVE ||
(itemType == nsDisplayItem::TYPE_TRANSFORM &&
if (itemType == DisplayItemType::TYPE_PERSPECTIVE ||
(itemType == DisplayItemType::TYPE_TRANSFORM &&
(item->Frame()->Extend3DContext() ||
item->Frame()->Combines3DTransformWithAncestors() ||
item->Frame()->HasPerspective()))) {
@ -4433,7 +4433,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
&newLayerEntry->mOpaqueForAnimatedGeometryRootParent);
} else {
bool useChildrenVisible =
itemType == nsDisplayItem::TYPE_TRANSFORM &&
itemType == DisplayItemType::TYPE_TRANSFORM &&
(item->Frame()->IsPreserve3DLeaf() ||
item->Frame()->HasPerspective());
const nsIntRegion &visible = useChildrenVisible ?
@ -4444,14 +4444,14 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
layerContentsVisibleRect.width >= 0 ? &layerContentsVisibleRect : nullptr,
useChildrenVisible);
}
if (itemType == nsDisplayItem::TYPE_SCROLL_INFO_LAYER) {
if (itemType == DisplayItemType::TYPE_SCROLL_INFO_LAYER) {
nsDisplayScrollInfoLayer* scrollItem = static_cast<nsDisplayScrollInfoLayer*>(item);
newLayerEntry->mOpaqueForAnimatedGeometryRootParent = false;
newLayerEntry->mBaseScrollMetadata =
scrollItem->ComputeScrollMetadata(ownLayer, mParameters);
} else if ((itemType == nsDisplayItem::TYPE_SUBDOCUMENT ||
itemType == nsDisplayItem::TYPE_ZOOM ||
itemType == nsDisplayItem::TYPE_RESOLUTION) &&
} else if ((itemType == DisplayItemType::TYPE_SUBDOCUMENT ||
itemType == DisplayItemType::TYPE_ZOOM ||
itemType == DisplayItemType::TYPE_RESOLUTION) &&
gfxPrefs::LayoutUseContainersForRootFrames())
{
newLayerEntry->mBaseScrollMetadata =
@ -4473,7 +4473,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
topLeft);
});
if (itemType == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (itemType == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
nsDisplayLayerEventRegions* eventRegions =
static_cast<nsDisplayLayerEventRegions*>(item);
paintedLayerData->AccumulateEventRegions(this, eventRegions);
@ -5473,7 +5473,7 @@ ChooseScaleAndSetTransform(FrameLayerBuilder* aLayerBuilder,
// If the container's transform is animated off main thread, fix a suitable scale size
// for animation
if (aContainerItem &&
aContainerItem->GetType() == nsDisplayItem::TYPE_TRANSFORM &&
aContainerItem->GetType() == DisplayItemType::TYPE_TRANSFORM &&
EffectCompositor::HasAnimationsForCompositor(
aContainerFrame, eCSSProperty_transform)) {
nsSize displaySize = ComputeDesiredDisplaySizeForAnimation(aContainerFrame);
@ -5573,7 +5573,7 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
uint32_t aFlags)
{
uint32_t containerDisplayItemKey =
aContainerItem ? aContainerItem->GetPerFrameKey() : nsDisplayItem::TYPE_ZERO;
aContainerItem ? aContainerItem->GetPerFrameKey() : 0;
NS_ASSERTION(aContainerFrame, "Container display items here should have a frame");
NS_ASSERTION(!aContainerItem ||
aContainerItem->Frame() == aContainerFrame,
@ -5829,7 +5829,7 @@ FrameLayerBuilder::InvalidateAllLayersForFrame(nsIFrame *aFrame)
/* static */
Layer*
FrameLayerBuilder::GetDedicatedLayer(nsIFrame* aFrame, uint32_t aDisplayItemKey)
FrameLayerBuilder::GetDedicatedLayer(nsIFrame* aFrame, DisplayItemType aDisplayItemKey)
{
//TODO: This isn't completely correct, since a frame could exist as a layer
// in the normal widget manager, and as a different layer (or no layer)
@ -5842,7 +5842,7 @@ FrameLayerBuilder::GetDedicatedLayer(nsIFrame* aFrame, uint32_t aDisplayItemKey)
if (!element->mParent->mLayerManager->IsWidgetLayerManager()) {
continue;
}
if (element->mDisplayItemKey == aDisplayItemKey) {
if (GetDisplayItemTypeFromKey(element->mDisplayItemKey) == aDisplayItemKey) {
if (element->mOptLayer) {
return element->mOptLayer;
}

View File

@ -18,6 +18,7 @@
#include "LayerState.h"
#include "Layers.h"
#include "LayerUserData.h"
#include "nsDisplayItemTypes.h"
class nsDisplayListBuilder;
class nsDisplayList;
@ -422,7 +423,7 @@ public:
* for the given display item key. If there isn't one, we return null,
* otherwise we return the layer.
*/
static Layer* GetDedicatedLayer(nsIFrame* aFrame, uint32_t aDisplayItemKey);
static Layer* GetDedicatedLayer(nsIFrame* aFrame, DisplayItemType aDisplayItemType);
/**
* This callback must be provided to EndTransaction. The callback data

View File

@ -10,12 +10,12 @@
* It's useful to be able to dynamically check the type of certain items.
* Every subclass of nsDisplayItem must have a new type added here for the purposes
* of easy comparison and matching of items in different display lists.
*
* This is #included inside nsDisplayItem.
*/
#ifndef NSDISPLAYITEMTYPES_H_
#define NSDISPLAYITEMTYPES_H_
enum Type {
enum class DisplayItemType {
TYPE_ZERO = 0, /** Spacer so that the first item starts at 1 */
#define DECLARE_DISPLAY_ITEM_TYPE(name) TYPE_##name,
@ -36,11 +36,11 @@ enum DisplayItemFlags {
TYPE_RENDERS_NO_IMAGES = 1 << 0
};
static const char* DisplayItemTypeName(Type aType)
inline const char* DisplayItemTypeName(DisplayItemType aType)
{
switch (aType) {
#define DECLARE_DISPLAY_ITEM_TYPE(name) case TYPE_##name: return #name;
#define DECLARE_DISPLAY_ITEM_TYPE_FLAGS(name,flags) case TYPE_##name: return #name;
#define DECLARE_DISPLAY_ITEM_TYPE(name) case DisplayItemType::TYPE_##name: return #name;
#define DECLARE_DISPLAY_ITEM_TYPE_FLAGS(name,flags) case DisplayItemType::TYPE_##name: return #name;
#include "nsDisplayItemTypesList.h"
#undef DECLARE_DISPLAY_ITEM_TYPE
#undef DECLARE_DISPLAY_ITEM_TYPE_FLAGS
@ -49,9 +49,9 @@ static const char* DisplayItemTypeName(Type aType)
}
}
static uint8_t GetDisplayItemFlagsForType(Type aType)
inline uint8_t GetDisplayItemFlagsForType(DisplayItemType aType)
{
static const uint8_t flags[TYPE_MAX] = {
static const uint8_t flags[static_cast<uint32_t>(DisplayItemType::TYPE_MAX)] = {
0
#define DECLARE_DISPLAY_ITEM_TYPE(name) ,0
#define DECLARE_DISPLAY_ITEM_TYPE_FLAGS(name,flags) ,flags
@ -60,13 +60,15 @@ static uint8_t GetDisplayItemFlagsForType(Type aType)
#undef DECLARE_DISPLAY_ITEM_TYPE_FLAGS
};
return flags[aType];
return flags[static_cast<uint32_t>(aType)];
}
static Type GetDisplayItemTypeFromKey(uint32_t aDisplayItemKey)
inline DisplayItemType GetDisplayItemTypeFromKey(uint32_t aDisplayItemKey)
{
static const uint32_t typeMask = (1 << TYPE_BITS) - 1;
Type type = static_cast<Type>(aDisplayItemKey & typeMask);
NS_ASSERTION(type > TYPE_ZERO && type < TYPE_MAX, "Invalid display item type!");
DisplayItemType type = static_cast<DisplayItemType>(aDisplayItemKey & typeMask);
NS_ASSERTION(type >= DisplayItemType::TYPE_ZERO && type < DisplayItemType::TYPE_MAX, "Invalid display item type!");
return type;
}
#endif /*NSDISPLAYITEMTYPES_H_*/

View File

@ -64,6 +64,7 @@ DECLARE_DISPLAY_ITEM_TYPE_FLAGS(PERSPECTIVE,TYPE_RENDERS_NO_IMAGES)
DECLARE_DISPLAY_ITEM_TYPE(VIDEO)
DECLARE_DISPLAY_ITEM_TYPE(WRAP_LIST)
DECLARE_DISPLAY_ITEM_TYPE(ZOOM)
DECLARE_DISPLAY_ITEM_TYPE(GENERIC)
#if defined(MOZ_REFLOW_PERF_DSP) && defined(MOZ_REFLOW_PERF)
DECLARE_DISPLAY_ITEM_TYPE(REFLOW_COUNT)

View File

@ -127,7 +127,7 @@ SpammyLayoutWarningsEnabled()
void*
AnimatedGeometryRoot::operator new(size_t aSize, nsDisplayListBuilder* aBuilder)
{
return aBuilder->Allocate(aSize);
return aBuilder->Allocate(aSize, DisplayItemType::TYPE_ZERO);
}
/* static */ bool
@ -952,7 +952,7 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame,
mFrameToAnimatedGeometryRootMap.Put(aReferenceFrame, &mRootAGR);
nsCSSRendering::BeginFrameTreesLocked();
static_assert(nsDisplayItem::TYPE_MAX < (1 << nsDisplayItem::TYPE_BITS),
static_assert(static_cast<uint32_t>(DisplayItemType::TYPE_MAX) < (1 << TYPE_BITS),
"Check nsDisplayItem::TYPE_MAX should not overflow");
}
@ -1219,13 +1219,13 @@ DisplayListIsNonBlank(nsDisplayList* aList)
{
for (nsDisplayItem* i = aList->GetBottom(); i != nullptr; i = i->GetAbove()) {
switch (i->GetType()) {
case nsDisplayItem::TYPE_LAYER_EVENT_REGIONS:
case nsDisplayItem::TYPE_CANVAS_BACKGROUND_COLOR:
case nsDisplayItem::TYPE_CANVAS_BACKGROUND_IMAGE:
case DisplayItemType::TYPE_LAYER_EVENT_REGIONS:
case DisplayItemType::TYPE_CANVAS_BACKGROUND_COLOR:
case DisplayItemType::TYPE_CANVAS_BACKGROUND_IMAGE:
continue;
case nsDisplayItem::TYPE_SOLID_COLOR:
case nsDisplayItem::TYPE_BACKGROUND:
case nsDisplayItem::TYPE_BACKGROUND_COLOR:
case DisplayItemType::TYPE_SOLID_COLOR:
case DisplayItemType::TYPE_BACKGROUND:
case DisplayItemType::TYPE_BACKGROUND_COLOR:
if (i->Frame()->IsCanvasFrame()) {
continue;
}
@ -1344,16 +1344,21 @@ nsDisplayListBuilder::MarkPreserve3DFramesForDisplayList(nsIFrame* aDirtyFrame)
}
void*
nsDisplayListBuilder::Allocate(size_t aSize)
nsDisplayListBuilder::Allocate(size_t aSize, DisplayItemType aType)
{
return mPool.Allocate(aSize);
}
void
nsDisplayListBuilder::Destroy(DisplayItemType aType, void* aPtr)
{
}
ActiveScrolledRoot*
nsDisplayListBuilder::AllocateActiveScrolledRoot(const ActiveScrolledRoot* aParent,
nsIScrollableFrame* aScrollableFrame)
{
void* p = Allocate(sizeof(ActiveScrolledRoot));
void* p = Allocate(sizeof(ActiveScrolledRoot), DisplayItemType::TYPE_ZERO);
ActiveScrolledRoot* asr =
new (KnownNotNull, p) ActiveScrolledRoot(aParent, aScrollableFrame);
mActiveScrolledRoots.AppendElement(asr);
@ -1365,7 +1370,7 @@ nsDisplayListBuilder::AllocateDisplayItemClipChain(const DisplayItemClip& aClip,
const ActiveScrolledRoot* aASR,
const DisplayItemClipChain* aParent)
{
void* p = Allocate(sizeof(DisplayItemClipChain));
void* p = Allocate(sizeof(DisplayItemClipChain), DisplayItemType::TYPE_ZERO);
DisplayItemClipChain* c = new (KnownNotNull, p) DisplayItemClipChain{ aClip, aASR, aParent };
mClipChainsToDestroy.AppendElement(c);
return c;
@ -1946,7 +1951,7 @@ TreatAsOpaque(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
bool snap;
nsRegion opaque = aItem->GetOpaqueRegion(aBuilder, &snap);
if (aBuilder->IsForPluginGeometry() &&
aItem->GetType() != nsDisplayItem::TYPE_LAYER_EVENT_REGIONS)
aItem->GetType() != DisplayItemType::TYPE_LAYER_EVENT_REGIONS)
{
// Treat all leaf chrome items as opaque, unless their frames are opacity:0.
// Since opacity:0 frames generate an nsDisplayOpacity, that item will
@ -2390,10 +2395,10 @@ nsDisplayItem* nsDisplayList::RemoveBottom() {
return item;
}
void nsDisplayList::DeleteAll() {
void nsDisplayList::DeleteAll(nsDisplayListBuilder* aBuilder) {
nsDisplayItem* item;
while ((item = RemoveBottom()) != nullptr) {
item->~nsDisplayItem();
item->Destroy(aBuilder);
}
}
@ -2468,7 +2473,7 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
// Collect leaves of the current 3D rendering context.
for (item = GetBottom(); item; item = item->GetAbove()) {
auto itemType = item->GetType();
if (itemType != nsDisplayItem::TYPE_TRANSFORM ||
if (itemType != DisplayItemType::TYPE_TRANSFORM ||
!static_cast<nsDisplayTransform*>(item)->IsLeafOf3DContext()) {
item->HitTest(aBuilder, aRect, aState, aOutFrames);
} else {
@ -2495,12 +2500,12 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
nsRect r = item->GetBounds(aBuilder, &snap).Intersect(aRect);
auto itemType = item->GetType();
bool same3DContext =
(itemType == nsDisplayItem::TYPE_TRANSFORM &&
(itemType == DisplayItemType::TYPE_TRANSFORM &&
static_cast<nsDisplayTransform*>(item)->IsParticipating3DContext()) ||
(itemType == nsDisplayItem::TYPE_PERSPECTIVE &&
(itemType == DisplayItemType::TYPE_PERSPECTIVE &&
item->Frame()->Extend3DContext());
if (same3DContext &&
(itemType != nsDisplayItem::TYPE_TRANSFORM ||
(itemType != DisplayItemType::TYPE_TRANSFORM ||
!static_cast<nsDisplayTransform*>(item)->IsLeafOf3DContext())) {
if (!item->GetClip().MayIntersect(aRect)) {
continue;
@ -2522,7 +2527,7 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
// For 3d transforms with preserve-3d we add hit frames into the temp list
// so we can sort them later, otherwise we add them directly to the output list.
nsTArray<nsIFrame*> *writeFrames = aOutFrames;
if (item->GetType() == nsDisplayItem::TYPE_TRANSFORM &&
if (item->GetType() == DisplayItemType::TYPE_TRANSFORM &&
static_cast<nsDisplayTransform*>(item)->IsLeafOf3DContext()) {
if (outFrames.Length()) {
nsDisplayTransform *transform = static_cast<nsDisplayTransform*>(item);
@ -3480,12 +3485,12 @@ nsDisplayBackgroundImage::ShouldCreateOwnLayer(nsDisplayListBuilder* aBuilder,
static void CheckForBorderItem(nsDisplayItem *aItem, uint32_t& aFlags)
{
nsDisplayItem* nextItem = aItem->GetAbove();
while (nextItem && nextItem->GetType() == nsDisplayItem::TYPE_BACKGROUND) {
while (nextItem && nextItem->GetType() == DisplayItemType::TYPE_BACKGROUND) {
nextItem = nextItem->GetAbove();
}
if (nextItem &&
nextItem->Frame() == aItem->Frame() &&
nextItem->GetType() == nsDisplayItem::TYPE_BORDER) {
nextItem->GetType() == DisplayItemType::TYPE_BORDER) {
aFlags |= nsCSSRendering::PAINTBG_WILL_PAINT_BORDER;
}
}
@ -3847,8 +3852,7 @@ nsDisplayBackgroundImage::GetBoundsInternal(nsDisplayListBuilder* aBuilder) {
uint32_t
nsDisplayBackgroundImage::GetPerFrameKey()
{
return (mLayer << nsDisplayItem::TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
return (mLayer << TYPE_BITS) | nsDisplayItem::GetPerFrameKey();
}
nsDisplayTableBackgroundImage::nsDisplayTableBackgroundImage(const InitData& aData,
@ -5647,7 +5651,7 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
// will have the correct reference frame set (since nsDisplayTransform
// handles this explictly).
nsDisplayItem *i = mList.GetBottom();
if (i && (!i->GetAbove() || i->GetType() == TYPE_TRANSFORM) &&
if (i && (!i->GetAbove() || i->GetType() == DisplayItemType::TYPE_TRANSFORM) &&
i->Frame() == mFrame) {
mReferenceFrame = i->ReferenceFrame();
mToReferenceFrame = i->ToReferenceFrame();
@ -5683,8 +5687,6 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder,
}
nsDisplayWrapList::~nsDisplayWrapList() {
mList.DeleteAll();
MOZ_COUNT_DTOR(nsDisplayWrapList);
}
@ -5765,7 +5767,7 @@ RequiredLayerStateForChildren(nsDisplayListBuilder* aBuilder,
}
LayerState state = i->GetLayerState(aBuilder, aManager, aParameters);
if (state == LAYER_ACTIVE && i->GetType() == nsDisplayItem::TYPE_BLEND_MODE) {
if (state == LAYER_ACTIVE && i->GetType() == DisplayItemType::TYPE_BLEND_MODE) {
// nsDisplayBlendMode always returns LAYER_ACTIVE to ensure that the
// blending operation happens in the intermediate surface of its parent
// display item (usually an nsDisplayBlendContainer). But this does not
@ -6024,7 +6026,7 @@ nsDisplayOpacity::ShouldFlattenAway(nsDisplayListBuilder* aBuilder)
bool snap;
uint32_t numChildren = 0;
for (; numChildren < ArrayLength(children) && child; numChildren++, child = child->GetAbove()) {
if (child->GetType() == nsDisplayItem::TYPE_LAYER_EVENT_REGIONS) {
if (child->GetType() == DisplayItemType::TYPE_LAYER_EVENT_REGIONS) {
numChildren--;
continue;
}
@ -6098,7 +6100,7 @@ nsDisplayOpacity::ComputeVisibility(nsDisplayListBuilder* aBuilder,
}
bool nsDisplayOpacity::TryMerge(nsDisplayItem* aItem) {
if (aItem->GetType() != TYPE_OPACITY)
if (aItem->GetType() != DisplayItemType::TYPE_OPACITY)
return false;
// items for the same content element should be merged into a single
// compositing group
@ -6247,7 +6249,7 @@ bool nsDisplayBlendMode::ComputeVisibility(nsDisplayListBuilder* aBuilder,
}
bool nsDisplayBlendMode::TryMerge(nsDisplayItem* aItem) {
if (aItem->GetType() != TYPE_BLEND_MODE)
if (aItem->GetType() != DisplayItemType::TYPE_BLEND_MODE)
return false;
nsDisplayBlendMode* item = static_cast<nsDisplayBlendMode*>(aItem);
// items for the same content element should be merged into a single
@ -6338,7 +6340,7 @@ nsDisplayBlendContainer::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder
}
bool nsDisplayBlendContainer::TryMerge(nsDisplayItem* aItem) {
if (aItem->GetType() != TYPE_BLEND_CONTAINER)
if (aItem->GetType() != DisplayItemType::TYPE_BLEND_CONTAINER)
return false;
// items for the same content element should be merged into a single
// compositing group
@ -6768,7 +6770,7 @@ nsDisplayFixedPosition::BuildLayer(nsDisplayListBuilder* aBuilder,
}
bool nsDisplayFixedPosition::TryMerge(nsDisplayItem* aItem) {
if (aItem->GetType() != TYPE_FIXED_POSITION)
if (aItem->GetType() != DisplayItemType::TYPE_FIXED_POSITION)
return false;
// Items with the same fixed position frame can be merged.
nsDisplayFixedPosition* other = static_cast<nsDisplayFixedPosition*>(aItem);
@ -6927,7 +6929,7 @@ nsDisplayStickyPosition::BuildLayer(nsDisplayListBuilder* aBuilder,
}
bool nsDisplayStickyPosition::TryMerge(nsDisplayItem* aItem) {
if (aItem->GetType() != TYPE_STICKY_POSITION)
if (aItem->GetType() != DisplayItemType::TYPE_STICKY_POSITION)
return false;
// Items with the same fixed position frame can be merged.
nsDisplayStickyPosition* other = static_cast<nsDisplayStickyPosition*>(aItem);
@ -8368,7 +8370,7 @@ nsDisplayPerspective::nsDisplayPerspective(nsDisplayListBuilder* aBuilder,
, mIndex(aBuilder->AllocatePerspectiveItemIndex())
{
MOZ_ASSERT(mList.GetChildren()->Count() == 1);
MOZ_ASSERT(mList.GetChildren()->GetTop()->GetType() == TYPE_TRANSFORM);
MOZ_ASSERT(mList.GetChildren()->GetTop()->GetType() == DisplayItemType::TYPE_TRANSFORM);
}
already_AddRefed<Layer>
@ -8716,7 +8718,7 @@ nsDisplayMask::~nsDisplayMask()
bool nsDisplayMask::TryMerge(nsDisplayItem* aItem)
{
if (aItem->GetType() != TYPE_MASK)
if (aItem->GetType() != DisplayItemType::TYPE_MASK)
return false;
// Do not merge items for box-decoration-break:clone elements,
@ -9055,7 +9057,7 @@ nsDisplayFilter::BuildLayer(nsDisplayListBuilder* aBuilder,
bool nsDisplayFilter::TryMerge(nsDisplayItem* aItem)
{
if (aItem->GetType() != TYPE_FILTER) {
if (aItem->GetType() != DisplayItemType::TYPE_FILTER) {
return false;
}

View File

@ -37,6 +37,7 @@
#include "mozilla/gfx/UserData.h"
#include "mozilla/layers/LayerAttributes.h"
#include "nsCSSRenderingBorders.h"
#include "nsDisplayItemTypes.h"
#include <stdint.h>
#include "nsTHashtable.h"
@ -120,8 +121,12 @@ typedef mozilla::EnumSet<mozilla::gfx::CompositionOp> BlendModeSet;
// All types are defined in nsDisplayItemTypes.h
#define NS_DISPLAY_DECL_NAME(n, e) \
virtual const char* Name() override { return n; } \
virtual Type GetType() override { return e; }
virtual const char* Name() const override { return n; } \
virtual DisplayItemType GetType() const override { return DisplayItemType::e; } \
void* operator new(size_t aSize, \
nsDisplayListBuilder* aBuilder) { \
return aBuilder->Allocate(aSize, DisplayItemType::e); \
}
/**
@ -743,7 +748,9 @@ public:
* builder is destroyed. This memory holds nsDisplayItems. nsDisplayItem
* destructors are called as soon as the item is no longer used.
*/
void* Allocate(size_t aSize);
void* Allocate(size_t aSize, DisplayItemType aType);
void Destroy(DisplayItemType aType, void* aPtr);
/**
* Allocate a new ActiveScrolledRoot in the arena. Will be cleaned up
@ -1627,6 +1634,7 @@ public:
nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame);
nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
const ActiveScrolledRoot* aActiveScrolledRoot);
/**
* This constructor is only used in rare cases when we need to construct
* temporary items.
@ -1644,15 +1652,17 @@ public:
#endif
{
}
virtual ~nsDisplayItem() {}
void* operator new(size_t aSize,
nsDisplayListBuilder* aBuilder) {
return aBuilder->Allocate(aSize);
protected:
virtual ~nsDisplayItem() {
}
public:
// Contains all the type integers for each display list item type
#include "nsDisplayItemTypes.h"
virtual void Destroy(nsDisplayListBuilder* aBuilder)
{
DisplayItemType type = GetType();
this->~nsDisplayItem();
aBuilder->Destroy(type, this);
}
struct HitTestState {
explicit HitTestState() : mInPreserves3D(false) {}
@ -1672,13 +1682,14 @@ public:
* outlines for the same element. For this, we need a way for items to
* identify their type. We use the type for other purposes too.
*/
virtual Type GetType() = 0;
virtual DisplayItemType GetType() const = 0;
/**
* Pairing this with the GetUnderlyingFrame() pointer gives a key that
* uniquely identifies this display item in the display item tree.
* XXX check nsOptionEventGrabberWrapper/nsXULEventRedirectorWrapper
*/
virtual uint32_t GetPerFrameKey() { return uint32_t(GetType()); }
/**
* This is called after we've constructed a display list for event handling.
* When this is called, we've already ensured that aRect intersects the
@ -2118,7 +2129,7 @@ public:
/**
* For debugging and stuff
*/
virtual const char* Name() = 0;
virtual const char* Name() const = 0;
virtual void WriteDebugInfo(std::stringstream& aStream) {}
@ -2274,7 +2285,6 @@ public:
if (mSentinel.mAbove) {
NS_WARNING("Nonempty list left over?");
}
DeleteAll();
}
/**
@ -2358,7 +2368,7 @@ public:
/**
* Remove all items from the list and call their destructors.
*/
void DeleteAll();
void DeleteAll(nsDisplayListBuilder* aBuilder);
/**
* @return the item at the top of the list, or null if the list is empty
@ -2606,6 +2616,15 @@ public:
*/
nsDisplayList* Content() const { return mContent; }
void DeleteAll(nsDisplayListBuilder* aBuilder) {
BorderBackground()->DeleteAll(aBuilder);
BlockBorderBackgrounds()->DeleteAll(aBuilder);
Floats()->DeleteAll(aBuilder);
PositionedDescendants()->DeleteAll(aBuilder);
Outlines()->DeleteAll(aBuilder);
Content()->DeleteAll(aBuilder);
}
nsDisplayListSet(nsDisplayList* aBorderBackground,
nsDisplayList* aBlockBorderBackgrounds,
nsDisplayList* aFloats,
@ -2735,7 +2754,7 @@ public:
const nsRect& aDirtyRect, nsPoint aFramePt);
nsDisplayGeneric(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
PaintCallback aPaint, const char* aName, Type aType)
PaintCallback aPaint, const char* aName, DisplayItemType aType)
: nsDisplayItem(aBuilder, aFrame)
, mPaint(aPaint)
, mOldPaint(nullptr)
@ -2747,7 +2766,7 @@ public:
// XXX: should be removed eventually
nsDisplayGeneric(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
OldPaintCallback aOldPaint, const char* aName, Type aType)
OldPaintCallback aOldPaint, const char* aName, DisplayItemType aType)
: nsDisplayItem(aBuilder, aFrame)
, mPaint(nullptr)
, mOldPaint(aOldPaint)
@ -2771,13 +2790,26 @@ public:
mOldPaint(mFrame, aCtx, mVisibleRect, ToReferenceFrame());
}
}
NS_DISPLAY_DECL_NAME(mName, mType)
virtual const char* Name() const override { return mName; }
virtual DisplayItemType GetType() const override { return mType; }
void* operator new(size_t aSize,
nsDisplayListBuilder* aBuilder) {
return aBuilder->Allocate(aSize, DisplayItemType::TYPE_GENERIC);
}
// This override is needed because GetType() for nsDisplayGeneric subclasses
// does not match TYPE_GENERIC that was used to allocate the object.
virtual void Destroy(nsDisplayListBuilder* aBuilder) override
{
this->~nsDisplayGeneric();
aBuilder->Destroy(DisplayItemType::TYPE_GENERIC, this);
}
protected:
PaintCallback mPaint;
OldPaintCallback mOldPaint; // XXX: should be removed eventually
const char* mName;
Type mType;
DisplayItemType mType;
};
#if defined(MOZ_REFLOW_PERF_DSP) && defined(MOZ_REFLOW_PERF)
@ -3086,14 +3118,14 @@ public:
}
}
NS_DISPLAY_DECL_NAME("SolidColorRegion", TYPE_SOLID_COLOR_REGION)
protected:
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) override;
virtual void Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) override;
virtual void WriteDebugInfo(std::stringstream& aStream) override;
NS_DISPLAY_DECL_NAME("SolidColorRegion", TYPE_SOLID_COLOR_REGION)
private:
nsRegion mRegion;
Color mColor;
@ -3297,7 +3329,7 @@ public:
nsDisplayTableBackgroundImage(const InitData& aInitData, nsIFrame* aCellFrame);
virtual uint32_t GetPerFrameKey() override {
return (static_cast<uint8_t>(mTableType) << nsDisplayItem::TYPE_BITS) |
return (static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
@ -3452,7 +3484,7 @@ public:
{ }
virtual uint32_t GetPerFrameKey() override {
return (static_cast<uint8_t>(mTableType) << nsDisplayItem::TYPE_BITS) |
return (static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
protected:
@ -3823,6 +3855,11 @@ public:
mBaseVisibleRect = mVisibleRect;
}
virtual ~nsDisplayWrapList();
virtual void Destroy(nsDisplayListBuilder* aBuilder) override {
mList.DeleteAll(aBuilder);
nsDisplayItem::Destroy(aBuilder);
}
/**
* Call this if the wrapped list is changed.
*/
@ -4055,8 +4092,7 @@ public:
// We don't need to compute an invalidation region since we have LayerTreeInvalidation
}
virtual uint32_t GetPerFrameKey() override {
return (mIndex << nsDisplayItem::TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey();
}
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
@ -4111,8 +4147,7 @@ public:
return false;
}
virtual uint32_t GetPerFrameKey() override {
return (mIsForBackground ? 1 << nsDisplayItem::TYPE_BITS : 0) |
nsDisplayItem::GetPerFrameKey();
return (mIsForBackground ? 1 << TYPE_BITS : 0) | nsDisplayItem::GetPerFrameKey();
}
NS_DISPLAY_DECL_NAME("BlendContainer", TYPE_BLEND_CONTAINER)
@ -4320,7 +4355,7 @@ public:
virtual bool ShouldFixToViewport(nsDisplayListBuilder* aBuilder) override { return mIsFixedBackground; }
virtual uint32_t GetPerFrameKey() override { return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual uint32_t GetPerFrameKey() override { return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
AnimatedGeometryRoot* AnimatedGeometryRootForScrollMetadata() const override {
return mAnimatedGeometryRootForScrollMetadata;
@ -4350,8 +4385,8 @@ public:
nsIFrame* aAncestorFrame);
virtual uint32_t GetPerFrameKey() override {
return (mIndex << (nsDisplayItem::TYPE_BITS + static_cast<uint8_t>(TableTypeBits::COUNT))) |
(static_cast<uint8_t>(mTableType) << nsDisplayItem::TYPE_BITS) |
return (mIndex << (TYPE_BITS + static_cast<uint8_t>(TableTypeBits::COUNT))) |
(static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
protected:
@ -4646,6 +4681,12 @@ class nsDisplayTransform: public nsDisplayItem
nsDisplayWrapList(aBuilder, aFrame, aItem) {}
virtual ~StoreList() {}
// This override is needed since StoreList is only allocated from the stack.
virtual void Destroy(nsDisplayListBuilder* aBuilder) override
{
mList.DeleteAll(aBuilder);
}
virtual void UpdateBounds(nsDisplayListBuilder* aBuilder) override {
// For extending 3d rendering context, the bounds would be
// updated by DoUpdateBoundsPreserves3D(), not here.
@ -4700,6 +4741,12 @@ public:
}
#endif
virtual void Destroy(nsDisplayListBuilder* aBuilder) override
{
mStoredList.Destroy(aBuilder);
nsDisplayItem::Destroy(aBuilder);
}
NS_DISPLAY_DECL_NAME("nsDisplayTransform", TYPE_TRANSFORM)
virtual nsRect GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder) override
@ -4734,7 +4781,7 @@ public:
nsRegion *aVisibleRegion) override;
virtual bool TryMerge(nsDisplayItem *aItem) override;
virtual uint32_t GetPerFrameKey() override { return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual uint32_t GetPerFrameKey() override { return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
@ -4763,7 +4810,7 @@ public:
}
enum {
INDEX_MAX = UINT32_MAX >> nsDisplayItem::TYPE_BITS
INDEX_MAX = UINT32_MAX >> TYPE_BITS
};
/**
@ -5015,7 +5062,7 @@ public:
nsIFrame* aPerspectiveFrame,
nsDisplayList* aList);
virtual uint32_t GetPerFrameKey() override { return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual uint32_t GetPerFrameKey() override { return (mIndex << TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) override
@ -5084,6 +5131,12 @@ public:
}
}
virtual void Destroy(nsDisplayListBuilder* aBuilder) override
{
mList.GetChildren()->DeleteAll(aBuilder);
nsDisplayItem::Destroy(aBuilder);
}
private:
nsDisplayWrapList mList;
nsIFrame* mTransformFrame;
@ -5147,8 +5200,8 @@ public:
}
static nsCharClipDisplayItem* CheckCast(nsDisplayItem* aItem) {
nsDisplayItem::Type t = aItem->GetType();
return (t == nsDisplayItem::TYPE_TEXT)
DisplayItemType t = aItem->GetType();
return (t == DisplayItemType::TYPE_TEXT)
? static_cast<nsCharClipDisplayItem*>(aItem) : nullptr;
}

View File

@ -325,16 +325,16 @@ ImageLoader::GetPresContext()
void InvalidateImagesCallback(nsIFrame* aFrame,
DisplayItemData* aItem)
{
nsDisplayItem::Type type = nsDisplayItem::GetDisplayItemTypeFromKey(aItem->GetDisplayItemKey());
uint8_t flags = nsDisplayItem::GetDisplayItemFlagsForType(type);
DisplayItemType type = GetDisplayItemTypeFromKey(aItem->GetDisplayItemKey());
uint8_t flags = GetDisplayItemFlagsForType(type);
if (flags & nsDisplayItem::TYPE_RENDERS_NO_IMAGES) {
if (flags & TYPE_RENDERS_NO_IMAGES) {
return;
}
if (nsLayoutUtils::InvalidationDebuggingIsEnabled()) {
printf_stderr("Invalidating display item(type=%d) based on frame %p \
because it might contain an invalidated image\n", type, aFrame);
because it might contain an invalidated image\n", static_cast<uint32_t>(type), aFrame);
}
aItem->Invalidate();
aFrame->SchedulePaint();

View File

@ -11,10 +11,10 @@ namespace mozilla {
/* static */ const LayerAnimationInfo::Record LayerAnimationInfo::sRecords[] =
{ { eCSSProperty_transform,
nsDisplayItem::TYPE_TRANSFORM,
DisplayItemType::TYPE_TRANSFORM,
nsChangeHint_UpdateTransformLayer },
{ eCSSProperty_opacity,
nsDisplayItem::TYPE_OPACITY,
DisplayItemType::TYPE_OPACITY,
nsChangeHint_UpdateOpacityLayer } };
#ifdef DEBUG

View File

@ -20,7 +20,7 @@ struct LayerAnimationInfo {
// a record of the corresponding layer type and change hint.
struct Record {
nsCSSPropertyID mProperty;
nsDisplayItem::Type mLayerType;
DisplayItemType mLayerType;
nsChangeHint mChangeHint;
};

View File

@ -513,7 +513,7 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayGeneric(aBuilder, this, ::PaintTableCellSelection,
"TableCellSelection",
nsDisplayItem::TYPE_TABLE_CELL_SELECTION));
DisplayItemType::TYPE_TABLE_CELL_SELECTION));
}
}

View File

@ -780,7 +780,7 @@ nsImageBoxFrame::OnFrameUpdate(imgIRequest* aRequest)
return NS_OK;
}
InvalidateLayer(nsDisplayItem::TYPE_XUL_IMAGE);
InvalidateLayer(DisplayItemType::TYPE_XUL_IMAGE);
return NS_OK;
}