shithub: npe

Download patch

ref: 0cfec2702bfc37f0d5c0ca5f72659563711037ad
parent: 9ad38e532689b5ed8581f0f57c7f9ba458c10119
author: Jacob Moody <moody@posixcafe.org>
date: Sun Aug 27 16:14:15 EDT 2023

sdl2: add SDL_PIXELFORMAT_ABGR8888

--- a/include/npe/SDL2/SDL.h
+++ b/include/npe/SDL2/SDL.h
@@ -196,6 +196,7 @@
 	SDL_PIXELFORMAT_XRGB8888 = 0x16161804,
 	SDL_PIXELFORMAT_INDEX8 = 0x13000801,
 	SDL_PIXELFORMAT_RGB24 = 0x17101803,
+	SDL_PIXELFORMAT_ABGR8888 = 0x16762004,
 	SDL_PIXELFORMAT_RGB888 = SDL_PIXELFORMAT_XRGB8888,
 
 	/* shit no one cares about */
--- a/libnpe_sdl2/sdl2.c
+++ b/libnpe_sdl2/sdl2.c
@@ -29,6 +29,10 @@
 	.format = SDL_PIXELFORMAT_XRGB8888,
 };
 
+static SDL_PixelFormat abgr8888 = {
+	.format = SDL_PIXELFORMAT_ABGR8888,
+};
+
 static SDL_PixelFormat rgb24 = {
 	.format = SDL_PIXELFORMAT_RGB24,
 };
@@ -217,14 +221,25 @@
 SDL_CreateTexture(SDL_Renderer *, Uint32 format, int, int w, int h)
 {
 	SDL_Texture *t;
+	int dformat;
 
-	if(format != SDL_PIXELFORMAT_ARGB8888 && format != SDL_PIXELFORMAT_XRGB8888){
-		werrstr("SDL_CreateTexture: only SDL_PIXELFORMAT_*RGB8888 is supported");
+	switch(format){
+	case SDL_PIXELFORMAT_ARGB8888:
+		dformat = ARGB32;
+		break;
+	case SDL_PIXELFORMAT_XRGB8888:
+		dformat = XRGB32;
+		break;
+	case SDL_PIXELFORMAT_ABGR8888:
+		dformat = ABGR32;
+		break;
+	default:
+		werrstr("SDL_CreateTexture: format is not supported");
 		goto err;
 	}
 	if((t = malloc(sizeof(*t))) == nil)
 		goto err;
-	if((t->m = allocmemimage(Rect(0, 0, w, h), format == SDL_PIXELFORMAT_ARGB8888 ? ARGB32 : XRGB32)) == nil){
+	if((t->m = allocmemimage(Rect(0, 0, w, h), dformat)) == nil){
 		free(t);
 		goto err;
 	}
@@ -430,6 +445,8 @@
 		f = &xrgb8888;
 	else if(fmt == SDL_PIXELFORMAT_RGB24)
 		f = &rgb24;
+	else if(fmt == SDL_PIXELFORMAT_ABGR8888)
+		f = &abgr8888;
 	else{
 		werrstr("SDL_CreateRGBSurfaceWithFormat: FIXME format %8ux not implemented", fmt);
 		return nil;
@@ -453,6 +470,7 @@
 	switch(dst->format->format){
 	case SDL_PIXELFORMAT_XRGB8888:
 	case SDL_PIXELFORMAT_ARGB8888:
+	case SDL_PIXELFORMAT_ABGR8888:
 		p = (Uint32*)dst->pixels;
 		for(i = 0; i < dst->n / sizeof(*p); i++)
 			p[i] = color;
@@ -951,6 +969,14 @@
 		n *= 4;
 		m = back;
 		break;
+	case SDL_PIXELFORMAT_ABGR8888:
+		n *= 4;
+		r2 = Rect(0,0,Dx(r),Dy(r));
+		if((m = allocmemimage(r2, ABGR32)) == nil)
+			return -1;
+		memfillcolor(m, DBlack);
+		memimagedraw(m, r2, back, r.min, nil, ZP, S);
+		break;
 	case SDL_PIXELFORMAT_RGB24:
 		n *= 3;
 		r2 = Rect(0,0,Dx(r),Dy(r));
@@ -960,7 +986,7 @@
 		memimagedraw(m, r2, back, r.min, nil, ZP, S);
 		break;
 	default:
-		werrstr("SDL_RenderReadPixels: FIXME non-*rgb{8888,24}");
+		werrstr("SDL_RenderReadPixels: format not supported");
 		return -1;
 	}