From 710a1e3bca24acdc906db6d1d659ad5e18b8876f Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Sat, 2 Oct 2021 15:49:58 +0200
Subject: [PATCH] support screenshots with 32bit surfaces

---
 src/screenshot.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/src/screenshot.c b/src/screenshot.c
index 608cc2f..02e3d22 100644
--- a/src/screenshot.c
+++ b/src/screenshot.c
@@ -75,6 +75,39 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src)
     return !error;
 }
 
+static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src)
+{
+    unsigned int error = TRUE;
+    unsigned int* dst_buf = malloc(src->width * src->height * 4);
+
+    if (dst_buf)
+    {
+        unsigned int* src_buf = (unsigned int*)dds_GetBuffer(src);
+
+        for (int y = 0; y < src->height; y++)
+        {
+            int dst_row = y * src->width;
+
+            for (int x = 0; x < src->width; x++)
+            {
+                unsigned int pixel = src_buf[dst_row + x];
+
+                BYTE red =   (pixel >> 16) & 0xFF;
+                BYTE green = (pixel >> 8) & 0xFF;
+                BYTE blue =   pixel & 0xFF;
+
+                dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red;
+            }
+        }
+
+        error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height);
+
+        free(dst_buf);
+    }
+
+    return !error;
+}
+
 BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
 {
     if (!src || !dds_GetBuffer(src))
@@ -110,6 +143,10 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
     {
         return ss_screenshot_16bit(filename, src);
     }
+    else if (src->bpp == 32)
+    {
+        return ss_screenshot_32bit(filename, src);
+    }
 
     return FALSE;
 }