From 5c5c04b2341e070ad6c2bb48a9543580705655c3 Mon Sep 17 00:00:00 2001 From: Bartlomiej Bloniarz Date: Mon, 5 Oct 2026 08:32:07 -0700 Subject: [PATCH] Default Image `resizeMode` to `cover` in C++ Summary: `ImageProps` defaulted `resizeMode` to `stretch`, while the JS `Image` default, the documented default and every Android image view use `cover`. On Android, props equal to their C++ default are not sent when a view is created, so an explicit `resizeMode="stretch"` never reached the view and the image rendered as `cover`. The C++ default is now `cover`. `Image` always sends `resizeMode` on every platform, so the value components receive is unchanged, and iOS initializes its content mode from the default props. Changelog: [General][Fixed] - Fix explicit `resizeMode="stretch"` being ignored on newly created Android `Image`s Differential Revision: D123029410 --- .../Libraries/Image/__tests__/Image-itest.js | 22 +++++-------------- .../renderer/components/image/ImageProps.cpp | 2 +- .../renderer/components/image/ImageProps.h | 2 +- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/react-native/Libraries/Image/__tests__/Image-itest.js b/packages/react-native/Libraries/Image/__tests__/Image-itest.js index b06caca14ea6..346e79e13369 100644 --- a/packages/react-native/Libraries/Image/__tests__/Image-itest.js +++ b/packages/react-native/Libraries/Image/__tests__/Image-itest.js @@ -36,12 +36,7 @@ describe('', () => { }); expect(root.getRenderedOutput().toJSX()).toEqual( - , + , ); Fantom.runTask(() => { @@ -49,12 +44,7 @@ describe('', () => { }); expect(root.getRenderedOutput().toJSX()).toEqual( - , + , ); }); }); @@ -282,7 +272,7 @@ describe('', () => { }); expect(root.getRenderedOutput({props: ['resizeMode']}).toJSX()).toEqual( - , + , ); }); @@ -294,11 +284,11 @@ describe('', () => { }); expect(root.getRenderedOutput({props: ['resizeMode']}).toJSX()).toEqual( - , + , ); }); - it('can be set to "stretch", which is the same as not setting it', () => { + it('can be set to "stretch"', () => { const root = Fantom.createRoot(); Fantom.runTask(() => { @@ -306,7 +296,7 @@ describe('', () => { }); expect(root.getRenderedOutput({props: ['resizeMode']}).toJSX()).toEqual( - , + , ); }); diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp index 8c2b59bbd6ad..bdebe03b4db5 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp @@ -42,7 +42,7 @@ ImageProps::ImageProps( rawProps, "resizeMode", sourceProps.resizeMode, - ImageResizeMode::Stretch)), + ImageResizeMode::Cover)), blurRadius(convertRawProp( context, rawProps, diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h index e8a9be18cd6a..df3a21ad7f9c 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h @@ -33,7 +33,7 @@ class ImageProps final : public ViewProps { ImageSources sources{}; ImageSource defaultSource{}; ImageSource loadingIndicatorSource{}; - ImageResizeMode resizeMode{ImageResizeMode::Stretch}; + ImageResizeMode resizeMode{ImageResizeMode::Cover}; Float blurRadius{}; EdgeInsets capInsets{}; std::optional tintColor{};