1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

restore old bmp screenshot code as fallback solution

This commit is contained in:
FunkyFr3sh 2023-10-21 08:55:28 +02:00
parent 6513df2111
commit 64f58ef2d2

View File

@ -9,6 +9,7 @@
#include "blt.h"
#include "config.h"
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src);
static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src)
{
@ -154,16 +155,93 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
if (src->bpp == 8 && src->palette)
{
return ss_screenshot_8bit(filename, src);
if (!ss_screenshot_8bit(filename, src))
return ss_screenshot_bmp(filename, src);
return TRUE;
}
else if (src->bpp == 16)
{
return ss_screenshot_16bit(filename, src);
if (!ss_screenshot_bmp(filename, src))
return ss_screenshot_bmp(filename, src);
return TRUE;
}
else if (src->bpp == 32)
{
return ss_screenshot_32bit(filename, src);
}
if (!ss_screenshot_32bit(filename, src))
return ss_screenshot_bmp(filename, src);
return TRUE;
}
return FALSE;
}
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src)
{
BOOL result = TRUE;
// make sure file extension is correct
char* ext = filename + strlen(filename) - 4;
if (_strcmpi(ext, ".png") == 0)
{
strncpy(ext, ".bmp", 4);
}
// Create the .BMP file.
HANDLE hf = CreateFile(
filename,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
if (hf == INVALID_HANDLE_VALUE)
return FALSE;
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)src->bmi;
BITMAPFILEHEADER hdr;
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD);
// Copy the BITMAPFILEHEADER into the .BMP file.
DWORD tmp;
if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&tmp, NULL))
{
result = FALSE;
}
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&tmp, (NULL)))
{
result = FALSE;
}
// Copy the array of color indices into the .BMP file.
DWORD cb = pbih->biSizeImage;
DWORD total = pbih->biSizeImage;
if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL))
{
result = FALSE;
}
// Close the .BMP file.
if (!CloseHandle(hf))
{
result = FALSE;
}
return result;
}