diff --git a/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj b/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj index fc240a71fd19..e861a8aebf07 100644 --- a/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj +++ b/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj @@ -33,6 +33,13 @@ $(DefineConstants);NATIVE_AOT + + + + + true + + @@ -66,7 +73,7 @@ - + diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs index 26b355683623..988d991be9ff 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Downsize.cs @@ -44,12 +44,29 @@ public class Issue16767_DownsizeDrawable : IDrawable { public void Draw(ICanvas canvas, RectF dirtyRect) { - IImage image; - var assembly = GetType().GetTypeInfo().Assembly; - using (var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png")) + IImage image = null; + + try { - image = PlatformImage.FromStream(stream); + // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach + var task = FileSystem.OpenAppPackageFileAsync("royals.png"); + task.Wait(); + using (var stream = task.Result) + { + // Copy to MemoryStream to ensure stream is properly buffered for marshal methods + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + memoryStream.Position = 0; + image = PlatformImage.FromStream(memoryStream); + } + } } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}"); + } + if (image is not null) { float spacing = 20; diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs index 2e0f47a448d7..9bd2fd12981e 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue16767_Resize.cs @@ -97,11 +97,27 @@ internal void SetResizeMode(ResizeMode resizeMode) public void Draw(ICanvas canvas, RectF dirtyRect) { - IImage image; - var assembly = GetType().GetTypeInfo().Assembly; - using (var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png")) + IImage image = null; + + try { - image = PlatformImage.FromStream(stream); + // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach + var task = FileSystem.OpenAppPackageFileAsync("royals.png"); + task.Wait(); + using (var stream = task.Result) + { + // Copy to MemoryStream to ensure stream is properly buffered for marshal methods + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + memoryStream.Position = 0; + image = PlatformImage.FromStream(memoryStream); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}"); } if (image is not null) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs index 7a1a89476415..4ded879abb05 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21886.cs @@ -45,9 +45,21 @@ Button CreateButton(string text, EventHandler handler) async Task LoadImageAsync() { - var assembly = GetType().GetTypeInfo().Assembly; - using var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png"); - return await Task.FromResult(PlatformImage.FromStream(stream)); + try + { + // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach + using var stream = await FileSystem.OpenAppPackageFileAsync("royals.png"); + // Copy to MemoryStream to ensure stream is properly buffered for marshal methods + using var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream); + memoryStream.Position = 0; + return PlatformImage.FromStream(memoryStream); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}"); + return null; + } } async void OnResize(object sender, EventArgs e) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs index 179e25dea3c0..165291db846d 100644 --- a/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue30006.cs @@ -45,9 +45,21 @@ Button CreateButton(string text, EventHandler handler) async Task LoadImageAsync() { - var assembly = GetType().GetTypeInfo().Assembly; - using var stream = assembly.GetManifestResourceStream("Controls.TestCases.HostApp.Resources.Images.royals.png"); - return await Task.FromResult(PlatformImage.FromStream(stream)); + try + { + // Use FileSystem.OpenAppPackageFileAsync for MauiAsset approach + using var stream = await FileSystem.OpenAppPackageFileAsync("royals.png"); + // Copy to MemoryStream to ensure stream is properly buffered for marshal methods + using var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream); + memoryStream.Position = 0; + return PlatformImage.FromStream(memoryStream); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to load image: {ex.Message}"); + return null; + } } async void OnDownSize(object sender, EventArgs e) diff --git a/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs b/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs index a08072db46d2..1b66d4dfa839 100644 --- a/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs +++ b/src/Graphics/src/Graphics/Platforms/Android/PlatformImage.cs @@ -156,8 +156,28 @@ public IImage ToPlatformImage() public static IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png) { - var bitmap = BitmapFactory.DecodeStream(stream); - return new PlatformImage(bitmap); + Bitmap bitmap; + + if (stream is null) + { + return null; + } + //For memory efficiency, use a single MemoryStream and access its buffer directly + using (var memoryStream = new MemoryStream()) + { + if (stream.CanSeek) + { + stream.Position = 0; + } + stream.CopyTo(memoryStream); + + // Get the buffer and actual length + byte[] buffer = memoryStream.GetBuffer(); + int length = (int)memoryStream.Length; + bitmap = BitmapFactory.DecodeByteArray(buffer, 0, length); + } + + return bitmap != null ? new PlatformImage(bitmap) : null; } } } diff --git a/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs b/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs index 180bbbd50afd..de003604fba5 100644 --- a/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs +++ b/src/Graphics/src/Graphics/Platforms/Mac/PlatformImage.cs @@ -174,9 +174,6 @@ public IImage ToPlatformImage() public static IImage FromStream(Stream stream, ImageFormat formatHint = ImageFormat.Png) { - if (stream == null) - return null; - var previous = NSApplication.CheckForIllegalCrossThreadCalls; NSApplication.CheckForIllegalCrossThreadCalls = false; var data = NSData.FromStream(stream);