mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-20 10:18:13 +00:00
Consistently use SDL_PIXELFORMAT_RGBA32 with Emscripten
This commit is contained in:

committed by
Sam Lantinga

parent
c78e279d3c
commit
bd680bdbcc
@@ -30,7 +30,7 @@
|
|||||||
bool Emscripten_CreateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *window, SDL_PixelFormat *format, void **pixels, int *pitch)
|
bool Emscripten_CreateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *window, SDL_PixelFormat *format, void **pixels, int *pitch)
|
||||||
{
|
{
|
||||||
SDL_Surface *surface;
|
SDL_Surface *surface;
|
||||||
const SDL_PixelFormat surface_format = SDL_PIXELFORMAT_XBGR8888;
|
const SDL_PixelFormat surface_format = SDL_PIXELFORMAT_RGBA32;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
// Free the old framebuffer surface
|
// Free the old framebuffer surface
|
||||||
@@ -89,54 +89,13 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
|
|||||||
}
|
}
|
||||||
var data = SDL3.image.data;
|
var data = SDL3.image.data;
|
||||||
var src = pixels / 4;
|
var src = pixels / 4;
|
||||||
var dst = 0;
|
|
||||||
var num;
|
|
||||||
|
|
||||||
if (SDL3.data32Data !== data) {
|
if (SDL3.data32Data !== data) {
|
||||||
SDL3.data32 = new Int32Array(data.buffer);
|
SDL3.data32 = new Int32Array(data.buffer);
|
||||||
SDL3.data8 = new Uint8Array(data.buffer);
|
|
||||||
SDL3.data32Data = data;
|
SDL3.data32Data = data;
|
||||||
}
|
}
|
||||||
var data32 = SDL3.data32;
|
var data32 = SDL3.data32;
|
||||||
num = data32.length;
|
data32.set(HEAP32.subarray(src, src + 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 = SDL3.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL3.ctx.putImageData(SDL3.image, 0, 0);
|
SDL3.ctx.putImageData(SDL3.image, 0, 0);
|
||||||
}, surface->w, surface->h, surface->pixels, data->canvas_id);
|
}, surface->w, surface->h, surface->pixels, data->canvas_id);
|
||||||
|
@@ -74,7 +74,7 @@ static SDL_Cursor *Emscripten_CreateCursor(SDL_Surface *surface, int hot_x, int
|
|||||||
const char *cursor_url = NULL;
|
const char *cursor_url = NULL;
|
||||||
SDL_Surface *conv_surf;
|
SDL_Surface *conv_surf;
|
||||||
|
|
||||||
conv_surf = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_ABGR8888);
|
conv_surf = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_RGBA32);
|
||||||
|
|
||||||
if (!conv_surf) {
|
if (!conv_surf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -376,7 +376,7 @@ bool Emscripten_VideoInit(SDL_VideoDevice *_this)
|
|||||||
|
|
||||||
// Use a fake 32-bpp desktop mode
|
// Use a fake 32-bpp desktop mode
|
||||||
SDL_zero(mode);
|
SDL_zero(mode);
|
||||||
mode.format = SDL_PIXELFORMAT_XRGB8888;
|
mode.format = SDL_PIXELFORMAT_RGBA32;
|
||||||
emscripten_get_screen_size(&mode.w, &mode.h);
|
emscripten_get_screen_size(&mode.w, &mode.h);
|
||||||
mode.pixel_density = emscripten_get_device_pixel_ratio();
|
mode.pixel_density = emscripten_get_device_pixel_ratio();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user