From 0c6d5b3ac8b05786128f211d9ec7dd981f34ddb4 Mon Sep 17 00:00:00 2001
From: Charlie Birks <[EMAIL REDACTED]>
Date: Fri, 30 Sep 2022 16:28:57 +0100
Subject: [PATCH] emscripten: drop CanvasPixelArray support from framebuffer
---
.../emscripten/SDL_emscriptenframebuffer.c | 102 ++++++++----------
1 file changed, 43 insertions(+), 59 deletions(-)
diff --git a/src/video/emscripten/SDL_emscriptenframebuffer.c b/src/video/emscripten/SDL_emscriptenframebuffer.c
index 03fea04efa30..93620213a8eb 100644
--- a/src/video/emscripten/SDL_emscriptenframebuffer.c
+++ b/src/video/emscripten/SDL_emscriptenframebuffer.c
@@ -92,66 +92,50 @@ int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rec
var src = pixels >> 2;
var dst = 0;
var num;
- if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) {
- // IE10/IE11: ImageData objects are backed by the deprecated CanvasPixelArray,
- // not UInt8ClampedArray. These don't have buffers, so we need to revert
- // to copying a byte at a time. We do the undefined check because modern
- // browsers do not define CanvasPixelArray anymore.
- num = data.length;
- while (dst < num) {
- var val = HEAP32[src]; // This is optimized. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}};
- data[dst ] = val & 0xff;
- data[dst+1] = (val >> 8) & 0xff;
- data[dst+2] = (val >> 16) & 0xff;
- data[dst+3] = 0xff;
- src++;
- dst += 4;
- }
- } else {
- if (SDL2.data32Data !== data) {
- SDL2.data32 = new Int32Array(data.buffer);
- SDL2.data8 = new Uint8Array(data.buffer);
- SDL2.data32Data = data;
+
+ if (SDL2.data32Data !== data) {
+ SDL2.data32 = new Int32Array(data.buffer);
+ SDL2.data8 = new Uint8Array(data.buffer);
+ SDL2.data32Data = data;
+ }
+ var data32 = SDL2.data32;
+ num = data32.length;
+ // logically we need to do
+ // while (dst < num) {
+ // data32[dst++] = HEAP32[src++] | 0xff000000
+ // }
+ // the following code is faster though, because
+ // .set() is almost free - easily 10x faster due to
+ // native SDL_memcpy efficiencies, and the remaining loop
+ // just stores, not load + store, so it is faster
+ data32.set(HEAP32.subarray(src, src + num));
+ var data8 = SDL2.data8;
+ var i = 3;
+ var j = i + 4*num;
+ if (num % 8 == 0) {
+ // unrolling gives big speedups
+ while (i < j) {
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
+ data8[i] = 0xff;
+ i = i + 4 | 0;
}
- var data32 = SDL2.data32;
- num = data32.length;
- // logically we need to do
- // while (dst < num) {
- // data32[dst++] = HEAP32[src++] | 0xff000000
- // }
- // the following code is faster though, because
- // .set() is almost free - easily 10x faster due to
- // native SDL_memcpy efficiencies, and the remaining loop
- // just stores, not load + store, so it is faster
- data32.set(HEAP32.subarray(src, src + num));
- var data8 = SDL2.data8;
- var i = 3;
- var j = i + 4*num;
- if (num % 8 == 0) {
- // unrolling gives big speedups
- while (i < j) {
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- data8[i] = 0xff;
- i = i + 4 | 0;
- }
- } else {
- while (i < j) {
- data8[i] = 0xff;
- i = i + 4 | 0;
- }
+ } else {
+ while (i < j) {
+ data8[i] = 0xff;
+ i = i + 4 | 0;
}
}