mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
restore old bmp screenshot code as fallback solution
This commit is contained in:
parent
6513df2111
commit
64f58ef2d2
@ -9,6 +9,7 @@
|
|||||||
#include "blt.h"
|
#include "blt.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src);
|
||||||
|
|
||||||
static BOOL ss_screenshot_8bit(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)
|
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)
|
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)
|
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;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user