Skip to content

Commit acb2504

Browse files
committedDec 10, 2024
Bug 1936030 - Don't store mImage / mPrevImage in nsDisplayImage. r=tnikkel,layout-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D231552
1 parent 2d346e4 commit acb2504

File tree

2 files changed

+43
-36
lines changed

2 files changed

+43
-36
lines changed
 

‎layout/generic/nsImageFrame.cpp

+36-28
Original file line numberDiff line numberDiff line change
@@ -1052,8 +1052,9 @@ bool nsImageFrame::ShouldCreateImageFrameForContentProperty(
10521052
// Check if we want to use an image frame or just let the frame constructor make
10531053
// us into an inline, and if so, which kind of image frame should we create.
10541054
/* static */
1055-
auto nsImageFrame::ImageFrameTypeFor(
1056-
const Element& aElement, const ComputedStyle& aStyle) -> ImageFrameType {
1055+
auto nsImageFrame::ImageFrameTypeFor(const Element& aElement,
1056+
const ComputedStyle& aStyle)
1057+
-> ImageFrameType {
10571058
if (ShouldCreateImageFrameForContentProperty(aElement, aStyle)) {
10581059
// Prefer the content property, for compat reasons, see bug 1484928.
10591060
return ImageFrameType::ForContentProperty;
@@ -2236,12 +2237,17 @@ void nsImageFrame::AssertSyncDecodingHintIsInSync() const {
22362237
#endif
22372238

22382239
void nsDisplayImage::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) {
2239-
MOZ_ASSERT(mImage);
2240-
auto* frame = static_cast<nsImageFrame*>(mFrame);
2240+
auto* frame = Frame();
22412241
frame->AssertSyncDecodingHintIsInSync();
22422242

2243+
auto* image = frame->mImage.get();
2244+
auto* prevImage = frame->mPrevImage.get();
2245+
if (!image) {
2246+
return;
2247+
}
2248+
22432249
const bool oldImageIsDifferent =
2244-
OldImageHasDifferentRatio(*frame, *mImage, mPrevImage);
2250+
OldImageHasDifferentRatio(*frame, *image, prevImage);
22452251

22462252
uint32_t flags = aBuilder->GetImageDecodeFlags();
22472253
if (aBuilder->ShouldSyncDecodeImages() || oldImageIsDifferent ||
@@ -2250,17 +2256,17 @@ void nsDisplayImage::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) {
22502256
}
22512257

22522258
ImgDrawResult result = frame->PaintImage(
2253-
*aCtx, ToReferenceFrame(), GetPaintRect(aBuilder, aCtx), mImage, flags);
2259+
*aCtx, ToReferenceFrame(), GetPaintRect(aBuilder, aCtx), image, flags);
22542260

22552261
if (result == ImgDrawResult::NOT_READY ||
22562262
result == ImgDrawResult::INCOMPLETE ||
22572263
result == ImgDrawResult::TEMPORARY_ERROR) {
22582264
// If the current image failed to paint because it's still loading or
22592265
// decoding, try painting the previous image.
2260-
if (mPrevImage) {
2266+
if (prevImage) {
22612267
result =
22622268
frame->PaintImage(*aCtx, ToReferenceFrame(),
2263-
GetPaintRect(aBuilder, aCtx), mPrevImage, flags);
2269+
GetPaintRect(aBuilder, aCtx), prevImage, flags);
22642270
}
22652271
}
22662272
}
@@ -2275,7 +2281,8 @@ nsRect nsDisplayImage::GetDestRect() const {
22752281
nsRegion nsDisplayImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
22762282
bool* aSnap) const {
22772283
*aSnap = false;
2278-
if (mImage && mImage->WillDrawOpaqueNow()) {
2284+
auto* image = Frame()->mImage.get();
2285+
if (image && image->WillDrawOpaqueNow()) {
22792286
const nsRect frameContentBox = GetBounds(aSnap);
22802287
return GetDestRect().Intersect(frameContentBox);
22812288
}
@@ -2287,45 +2294,48 @@ bool nsDisplayImage::CreateWebRenderCommands(
22872294
mozilla::wr::IpcResourceUpdateQueue& aResources,
22882295
const StackingContextHelper& aSc, RenderRootStateManager* aManager,
22892296
nsDisplayListBuilder* aDisplayListBuilder) {
2290-
if (!mImage) {
2291-
return false;
2297+
MOZ_ASSERT(mFrame->IsImageFrame() || mFrame->IsImageControlFrame());
2298+
auto* frame = Frame();
2299+
auto* image = frame->mImage.get();
2300+
if (!image) {
2301+
// TODO: View transitions.
2302+
return true;
22922303
}
22932304

2294-
MOZ_ASSERT(mFrame->IsImageFrame() || mFrame->IsImageControlFrame());
2295-
// Image layer doesn't support draw focus ring for image map.
2296-
auto* frame = static_cast<nsImageFrame*>(mFrame);
22972305
if (frame->HasImageMap()) {
2306+
// Image layer doesn't support draw focus ring for image map.
22982307
return false;
22992308
}
23002309

2310+
auto* prevImage = frame->mPrevImage.get();
2311+
23012312
frame->AssertSyncDecodingHintIsInSync();
23022313
const bool oldImageIsDifferent =
2303-
OldImageHasDifferentRatio(*frame, *mImage, mPrevImage);
2314+
OldImageHasDifferentRatio(*frame, *image, prevImage);
23042315

23052316
uint32_t flags = aDisplayListBuilder->GetImageDecodeFlags();
23062317
if (aDisplayListBuilder->ShouldSyncDecodeImages() || oldImageIsDifferent ||
23072318
frame->mForceSyncDecoding) {
23082319
flags |= imgIContainer::FLAG_SYNC_DECODE;
23092320
}
23102321
if (StaticPrefs::image_svg_blob_image() &&
2311-
mImage->GetType() == imgIContainer::TYPE_VECTOR) {
2322+
image->GetType() == imgIContainer::TYPE_VECTOR) {
23122323
flags |= imgIContainer::FLAG_RECORD_BLOB;
23132324
}
23142325

23152326
const nsRect destAppUnits = GetDestRect();
23162327
const int32_t factor = mFrame->PresContext()->AppUnitsPerDevPixel();
2317-
LayoutDeviceRect destRect(
2318-
LayoutDeviceRect::FromAppUnits(destAppUnits, factor));
2328+
const auto destRect = LayoutDeviceRect::FromAppUnits(destAppUnits, factor);
23192329

23202330
SVGImageContext svgContext;
23212331
Maybe<ImageIntRegion> region;
23222332
IntSize decodeSize = nsLayoutUtils::ComputeImageContainerDrawingParameters(
2323-
mImage, mFrame, destRect, destRect, aSc, flags, svgContext, region);
2333+
image, mFrame, destRect, destRect, aSc, flags, svgContext, region);
23242334

23252335
RefPtr<image::WebRenderImageProvider> provider;
23262336
ImgDrawResult drawResult =
2327-
mImage->GetImageProvider(aManager->LayerManager(), decodeSize, svgContext,
2328-
region, flags, getter_AddRefs(provider));
2337+
image->GetImageProvider(aManager->LayerManager(), decodeSize, svgContext,
2338+
region, flags, getter_AddRefs(provider));
23292339

23302340
if (nsCOMPtr<imgIRequest> currentRequest = frame->GetCurrentRequest()) {
23312341
LCPHelpers::FinalizeLCPEntryForImage(
@@ -2342,20 +2352,20 @@ bool nsDisplayImage::CreateWebRenderCommands(
23422352
case ImgDrawResult::NOT_READY:
23432353
case ImgDrawResult::INCOMPLETE:
23442354
case ImgDrawResult::TEMPORARY_ERROR:
2345-
if (mPrevImage && mPrevImage != mImage) {
2355+
if (prevImage && prevImage != image) {
23462356
// The current image and the previous image might be switching between
23472357
// rasterized surfaces and blob recordings, so we need to update the
23482358
// flags appropriately.
23492359
uint32_t prevFlags = flags;
23502360
if (StaticPrefs::image_svg_blob_image() &&
2351-
mPrevImage->GetType() == imgIContainer::TYPE_VECTOR) {
2361+
prevImage->GetType() == imgIContainer::TYPE_VECTOR) {
23522362
prevFlags |= imgIContainer::FLAG_RECORD_BLOB;
23532363
} else {
23542364
prevFlags &= ~imgIContainer::FLAG_RECORD_BLOB;
23552365
}
23562366

23572367
RefPtr<image::WebRenderImageProvider> prevProvider;
2358-
ImgDrawResult prevDrawResult = mPrevImage->GetImageProvider(
2368+
ImgDrawResult prevDrawResult = prevImage->GetImageProvider(
23592369
aManager->LayerManager(), decodeSize, svgContext, region, prevFlags,
23602370
getter_AddRefs(prevProvider));
23612371
if (prevProvider && (prevDrawResult == ImgDrawResult::SUCCESS ||
@@ -2377,15 +2387,14 @@ bool nsDisplayImage::CreateWebRenderCommands(
23772387
case ImgDrawResult::NOT_SUPPORTED:
23782388
return false;
23792389
default:
2380-
updatePrevImage = mPrevImage != mImage;
2390+
updatePrevImage = prevImage != image;
23812391
break;
23822392
}
23832393

23842394
// The previous image was not used, and is different from the current image.
23852395
// We should forget about it. We need to update the frame as well because the
23862396
// display item may get recreated.
23872397
if (updatePrevImage) {
2388-
mPrevImage = mImage;
23892398
frame->mPrevImage = frame->mImage;
23902399
}
23912400

@@ -2525,8 +2534,7 @@ void nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
25252534
}
25262535
} else {
25272536
if (mImage) {
2528-
aLists.Content()->AppendNewToTop<nsDisplayImage>(aBuilder, this, mImage,
2529-
mPrevImage);
2537+
aLists.Content()->AppendNewToTop<nsDisplayImage>(aBuilder, this);
25302538
} else if (isImageFromStyle) {
25312539
aLists.Content()->AppendNewToTop<nsDisplayGradient>(aBuilder, this);
25322540
}

‎layout/generic/nsImageFrame.h

+7-8
Original file line numberDiff line numberDiff line change
@@ -426,11 +426,8 @@ class nsDisplayImage final : public nsPaintedDisplayItem {
426426
public:
427427
typedef mozilla::layers::LayerManager LayerManager;
428428

429-
nsDisplayImage(nsDisplayListBuilder* aBuilder, nsImageFrame* aFrame,
430-
imgIContainer* aImage, imgIContainer* aPrevImage)
431-
: nsPaintedDisplayItem(aBuilder, aFrame),
432-
mImage(aImage),
433-
mPrevImage(aPrevImage) {
429+
nsDisplayImage(nsDisplayListBuilder* aBuilder, nsImageFrame* aFrame)
430+
: nsPaintedDisplayItem(aBuilder, aFrame) {
434431
MOZ_COUNT_CTOR(nsDisplayImage);
435432
}
436433

@@ -461,10 +458,12 @@ class nsDisplayImage final : public nsPaintedDisplayItem {
461458
mozilla::layers::RenderRootStateManager*,
462459
nsDisplayListBuilder*) final;
463460

461+
nsImageFrame* Frame() const {
462+
MOZ_ASSERT(mFrame->IsImageFrame() || mFrame->IsImageControlFrame());
463+
return static_cast<nsImageFrame*>(mFrame);
464+
}
465+
464466
NS_DISPLAY_DECL_NAME("Image", TYPE_IMAGE)
465-
private:
466-
nsCOMPtr<imgIContainer> mImage;
467-
nsCOMPtr<imgIContainer> mPrevImage;
468467
};
469468

470469
} // namespace mozilla

0 commit comments

Comments
 (0)
Failed to load comments.