@@ -1052,8 +1052,9 @@ bool nsImageFrame::ShouldCreateImageFrameForContentProperty(
1052
1052
// Check if we want to use an image frame or just let the frame constructor make
1053
1053
// us into an inline, and if so, which kind of image frame should we create.
1054
1054
/* 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 {
1057
1058
if (ShouldCreateImageFrameForContentProperty (aElement, aStyle)) {
1058
1059
// Prefer the content property, for compat reasons, see bug 1484928.
1059
1060
return ImageFrameType::ForContentProperty;
@@ -2236,12 +2237,17 @@ void nsImageFrame::AssertSyncDecodingHintIsInSync() const {
2236
2237
#endif
2237
2238
2238
2239
void nsDisplayImage::Paint (nsDisplayListBuilder* aBuilder, gfxContext* aCtx) {
2239
- MOZ_ASSERT (mImage );
2240
- auto * frame = static_cast <nsImageFrame*>(mFrame );
2240
+ auto * frame = Frame ();
2241
2241
frame->AssertSyncDecodingHintIsInSync ();
2242
2242
2243
+ auto * image = frame->mImage .get ();
2244
+ auto * prevImage = frame->mPrevImage .get ();
2245
+ if (!image) {
2246
+ return ;
2247
+ }
2248
+
2243
2249
const bool oldImageIsDifferent =
2244
- OldImageHasDifferentRatio (*frame, *mImage , mPrevImage );
2250
+ OldImageHasDifferentRatio (*frame, *image, prevImage );
2245
2251
2246
2252
uint32_t flags = aBuilder->GetImageDecodeFlags ();
2247
2253
if (aBuilder->ShouldSyncDecodeImages () || oldImageIsDifferent ||
@@ -2250,17 +2256,17 @@ void nsDisplayImage::Paint(nsDisplayListBuilder* aBuilder, gfxContext* aCtx) {
2250
2256
}
2251
2257
2252
2258
ImgDrawResult result = frame->PaintImage (
2253
- *aCtx, ToReferenceFrame (), GetPaintRect (aBuilder, aCtx), mImage , flags);
2259
+ *aCtx, ToReferenceFrame (), GetPaintRect (aBuilder, aCtx), image , flags);
2254
2260
2255
2261
if (result == ImgDrawResult::NOT_READY ||
2256
2262
result == ImgDrawResult::INCOMPLETE ||
2257
2263
result == ImgDrawResult::TEMPORARY_ERROR) {
2258
2264
// If the current image failed to paint because it's still loading or
2259
2265
// decoding, try painting the previous image.
2260
- if (mPrevImage ) {
2266
+ if (prevImage ) {
2261
2267
result =
2262
2268
frame->PaintImage (*aCtx, ToReferenceFrame (),
2263
- GetPaintRect (aBuilder, aCtx), mPrevImage , flags);
2269
+ GetPaintRect (aBuilder, aCtx), prevImage , flags);
2264
2270
}
2265
2271
}
2266
2272
}
@@ -2275,7 +2281,8 @@ nsRect nsDisplayImage::GetDestRect() const {
2275
2281
nsRegion nsDisplayImage::GetOpaqueRegion (nsDisplayListBuilder* aBuilder,
2276
2282
bool * aSnap) const {
2277
2283
*aSnap = false ;
2278
- if (mImage && mImage ->WillDrawOpaqueNow ()) {
2284
+ auto * image = Frame ()->mImage .get ();
2285
+ if (image && image->WillDrawOpaqueNow ()) {
2279
2286
const nsRect frameContentBox = GetBounds (aSnap);
2280
2287
return GetDestRect ().Intersect (frameContentBox);
2281
2288
}
@@ -2287,45 +2294,48 @@ bool nsDisplayImage::CreateWebRenderCommands(
2287
2294
mozilla::wr::IpcResourceUpdateQueue& aResources,
2288
2295
const StackingContextHelper& aSc, RenderRootStateManager* aManager,
2289
2296
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 ;
2292
2303
}
2293
2304
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 );
2297
2305
if (frame->HasImageMap ()) {
2306
+ // Image layer doesn't support draw focus ring for image map.
2298
2307
return false ;
2299
2308
}
2300
2309
2310
+ auto * prevImage = frame->mPrevImage .get ();
2311
+
2301
2312
frame->AssertSyncDecodingHintIsInSync ();
2302
2313
const bool oldImageIsDifferent =
2303
- OldImageHasDifferentRatio (*frame, *mImage , mPrevImage );
2314
+ OldImageHasDifferentRatio (*frame, *image, prevImage );
2304
2315
2305
2316
uint32_t flags = aDisplayListBuilder->GetImageDecodeFlags ();
2306
2317
if (aDisplayListBuilder->ShouldSyncDecodeImages () || oldImageIsDifferent ||
2307
2318
frame->mForceSyncDecoding ) {
2308
2319
flags |= imgIContainer::FLAG_SYNC_DECODE;
2309
2320
}
2310
2321
if (StaticPrefs::image_svg_blob_image () &&
2311
- mImage ->GetType () == imgIContainer::TYPE_VECTOR) {
2322
+ image ->GetType () == imgIContainer::TYPE_VECTOR) {
2312
2323
flags |= imgIContainer::FLAG_RECORD_BLOB;
2313
2324
}
2314
2325
2315
2326
const nsRect destAppUnits = GetDestRect ();
2316
2327
const int32_t factor = mFrame ->PresContext ()->AppUnitsPerDevPixel ();
2317
- LayoutDeviceRect destRect (
2318
- LayoutDeviceRect::FromAppUnits (destAppUnits, factor));
2328
+ const auto destRect = LayoutDeviceRect::FromAppUnits (destAppUnits, factor);
2319
2329
2320
2330
SVGImageContext svgContext;
2321
2331
Maybe<ImageIntRegion> region;
2322
2332
IntSize decodeSize = nsLayoutUtils::ComputeImageContainerDrawingParameters (
2323
- mImage , mFrame , destRect, destRect, aSc, flags, svgContext, region);
2333
+ image , mFrame , destRect, destRect, aSc, flags, svgContext, region);
2324
2334
2325
2335
RefPtr<image::WebRenderImageProvider> provider;
2326
2336
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));
2329
2339
2330
2340
if (nsCOMPtr<imgIRequest> currentRequest = frame->GetCurrentRequest ()) {
2331
2341
LCPHelpers::FinalizeLCPEntryForImage (
@@ -2342,20 +2352,20 @@ bool nsDisplayImage::CreateWebRenderCommands(
2342
2352
case ImgDrawResult::NOT_READY:
2343
2353
case ImgDrawResult::INCOMPLETE:
2344
2354
case ImgDrawResult::TEMPORARY_ERROR:
2345
- if (mPrevImage && mPrevImage != mImage ) {
2355
+ if (prevImage && prevImage != image ) {
2346
2356
// The current image and the previous image might be switching between
2347
2357
// rasterized surfaces and blob recordings, so we need to update the
2348
2358
// flags appropriately.
2349
2359
uint32_t prevFlags = flags;
2350
2360
if (StaticPrefs::image_svg_blob_image () &&
2351
- mPrevImage ->GetType () == imgIContainer::TYPE_VECTOR) {
2361
+ prevImage ->GetType () == imgIContainer::TYPE_VECTOR) {
2352
2362
prevFlags |= imgIContainer::FLAG_RECORD_BLOB;
2353
2363
} else {
2354
2364
prevFlags &= ~imgIContainer::FLAG_RECORD_BLOB;
2355
2365
}
2356
2366
2357
2367
RefPtr<image::WebRenderImageProvider> prevProvider;
2358
- ImgDrawResult prevDrawResult = mPrevImage ->GetImageProvider (
2368
+ ImgDrawResult prevDrawResult = prevImage ->GetImageProvider (
2359
2369
aManager->LayerManager (), decodeSize, svgContext, region, prevFlags,
2360
2370
getter_AddRefs (prevProvider));
2361
2371
if (prevProvider && (prevDrawResult == ImgDrawResult::SUCCESS ||
@@ -2377,15 +2387,14 @@ bool nsDisplayImage::CreateWebRenderCommands(
2377
2387
case ImgDrawResult::NOT_SUPPORTED:
2378
2388
return false ;
2379
2389
default :
2380
- updatePrevImage = mPrevImage != mImage ;
2390
+ updatePrevImage = prevImage != image ;
2381
2391
break ;
2382
2392
}
2383
2393
2384
2394
// The previous image was not used, and is different from the current image.
2385
2395
// We should forget about it. We need to update the frame as well because the
2386
2396
// display item may get recreated.
2387
2397
if (updatePrevImage) {
2388
- mPrevImage = mImage ;
2389
2398
frame->mPrevImage = frame->mImage ;
2390
2399
}
2391
2400
@@ -2525,8 +2534,7 @@ void nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
2525
2534
}
2526
2535
} else {
2527
2536
if (mImage ) {
2528
- aLists.Content ()->AppendNewToTop <nsDisplayImage>(aBuilder, this , mImage ,
2529
- mPrevImage );
2537
+ aLists.Content ()->AppendNewToTop <nsDisplayImage>(aBuilder, this );
2530
2538
} else if (isImageFromStyle) {
2531
2539
aLists.Content ()->AppendNewToTop <nsDisplayGradient>(aBuilder, this );
2532
2540
}
0 commit comments