trash.cpp:
void TakeScreenshot() {
auto pDevice = reinterpret_cast<LPDIRECT3DDEVICE9>(RwD3D9GetCurrentD3DDevice());
std::string sFileName;
int iCount = GetScreenshotFileName(sFileName);
g_Log.Write("sFileName: %s", sFileName.c_str());
//LPDIRECT3DTEXTURE9 pFrontBuff;
LPDIRECT3DSURFACE9 pTemp;
//D3DXCreateTexture(pDevice, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 1, NULL, D3DFMT_A8R8G8B8,
//D3DPOOL_SCRATCH, &pFrontBuff);
//pFrontBuff->GetSurfaceLevel(0, &pTemp);
pDevice->CreateOffscreenPlainSurface(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pTemp, NULL);
if (SUCCEEDED(pDevice->GetFrontBufferData(0, pTemp))) {
POINT point{};
ClientToScreen(**(HWND**)0xC17054, &point);
RECT rect;
GetClientRect(**(HWND**)0xC17054, &rect);
rect.left += point.x; rect.right += point.x;
rect.top += point.y; rect.bottom += point.y;
//D3DXSaveTextureToFileA(sFileName.c_str(), D3DXIFF_PNG, pFrontBuff, nullptr);
D3DXSaveSurfaceToFileA(sFileName.c_str(), D3DXIFF_PNG, pTemp, NULL, &rect); // <- на конце строки будет .png. Да, я не дурак, я это проверил
g_pSAMP->addChatMessage(0x99'00'00, "Скриншот сделан - sa-mp-%03i.png", iCount);
} else {
g_pSAMP->addChatMessage(0x99'00'00, "Не удалось сохранить скриншот.");
}
pTemp->Release();
*LPBOOL(g_sampBase.getAddress(0x12DD3C)) = FALSE; // g_bTakeScreenshot
}
Но, если заменить на D3DXIFF_JPG, то изображение получается нормальным.
Мне jpg не нужен, нужен именно png. Как быть? Попробовал даже обновить DXSDK, но ничего не поменялось. Если использовать функу из SAMP(вызов импла, __imp_D3DXSaveSurfaceToFileA), то всё ок. что я делаю не так?😢