From 7e78636e8e7c5b50d6d63ec55edc7be9578d2b80 Mon Sep 17 00:00:00 2001
From: Christian Semmler <[EMAIL REDACTED]>
Date: Sun, 7 Dec 2025 06:54:02 +0100
Subject: [PATCH] Handle SharedArrayBuffer for PNG data
The Emscripten support for setting window icons introduced in #14490 does not work when using pthreads. Using `SetWindowIcon` will cause the program to crash. The reason for that is that the `Blob` constructor does not accept shared memory (`SharedArrayBuffer`).
We need to create a local copy of the icon data if necessary.
---
src/video/emscripten/SDL_emscriptenvideo.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/video/emscripten/SDL_emscriptenvideo.c b/src/video/emscripten/SDL_emscriptenvideo.c
index e2b6a56854883..e7fd9d42fae85 100644
--- a/src/video/emscripten/SDL_emscriptenvideo.c
+++ b/src/video/emscripten/SDL_emscriptenvideo.c
@@ -812,6 +812,11 @@ static bool Emscripten_SetWindowIcon(SDL_VideoDevice *_this, SDL_Window *window,
// Pass PNG data to JavaScript
MAIN_THREAD_EM_ASM({
var pngData = HEAPU8.subarray($0, $0 + $1);
+ if (pngData.buffer instanceof SharedArrayBuffer) {
+ // explicitly create a copy
+ pngData = new Uint8Array(pngData);
+ }
+
var blob = new Blob([pngData], {type: 'image/png'});
var url = URL.createObjectURL(blob);