mirror of
https://github.com/microsoft/DirectXTex.git
synced 2025-07-09 19:50:13 +02:00
Reformat code
This commit is contained in:
parent
45fb8623d2
commit
91d783dc22
@ -863,6 +863,8 @@ namespace
|
|||||||
return DXGI_FORMAT_UNKNOWN;
|
return DXGI_FORMAT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef ISBITMASK
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) noexcept
|
DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) noexcept
|
||||||
|
@ -880,6 +880,8 @@ namespace
|
|||||||
return DXGI_FORMAT_UNKNOWN;
|
return DXGI_FORMAT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef ISBITMASK
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT format ) noexcept
|
DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT format ) noexcept
|
||||||
|
@ -111,7 +111,7 @@ namespace
|
|||||||
|
|
||||||
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
||||||
|
|
||||||
inline HANDLE safe_handle( HANDLE h ) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
HRESULT LoadTextureDataFromMemory(
|
HRESULT LoadTextureDataFromMemory(
|
||||||
@ -730,6 +730,8 @@ namespace
|
|||||||
return D3DFMT_UNKNOWN;
|
return D3DFMT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef ISBITMASK
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
HRESULT CreateTextureFromDDS(
|
HRESULT CreateTextureFromDDS(
|
||||||
@ -805,7 +807,7 @@ namespace
|
|||||||
if (NumBytes > UINT32_MAX || RowBytes > UINT32_MAX)
|
if (NumBytes > UINT32_MAX || RowBytes > UINT32_MAX)
|
||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
|
|
||||||
if ((pSrcBits + (NumBytes*iDepth)) > pEndBits)
|
if ((pSrcBits + (NumBytes * iDepth)) > pEndBits)
|
||||||
{
|
{
|
||||||
return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
|
return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
|
||||||
}
|
}
|
||||||
@ -816,8 +818,8 @@ namespace
|
|||||||
|
|
||||||
for (UINT j = 0; j < iDepth; ++j)
|
for (UINT j = 0; j < iDepth; ++j)
|
||||||
{
|
{
|
||||||
uint8_t *dptr = pDestBits;
|
uint8_t* dptr = pDestBits;
|
||||||
const uint8_t *sptr = pSrcBits;
|
const uint8_t* sptr = pSrcBits;
|
||||||
|
|
||||||
// Copy stride line by line
|
// Copy stride line by line
|
||||||
for (size_t h = 0; h < NumRows; h++)
|
for (size_t h = 0; h < NumRows; h++)
|
||||||
|
@ -199,7 +199,7 @@ namespace
|
|||||||
|
|
||||||
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
||||||
|
|
||||||
inline HANDLE safe_handle( HANDLE h ) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
||||||
|
|
||||||
class auto_delete_file
|
class auto_delete_file
|
||||||
{
|
{
|
||||||
@ -256,9 +256,9 @@ namespace
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
// Return the BPP for a particular format
|
// Return the BPP for a particular format
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
size_t BitsPerPixel( _In_ DXGI_FORMAT fmt ) noexcept
|
size_t BitsPerPixel(_In_ DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
switch( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
|
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
||||||
@ -406,9 +406,9 @@ namespace
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
// Determines if the format is block compressed
|
// Determines if the format is block compressed
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
bool IsCompressed( _In_ DXGI_FORMAT fmt ) noexcept
|
bool IsCompressed(_In_ DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
switch ( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_BC1_TYPELESS:
|
case DXGI_FORMAT_BC1_TYPELESS:
|
||||||
case DXGI_FORMAT_BC1_UNORM:
|
case DXGI_FORMAT_BC1_UNORM:
|
||||||
@ -589,10 +589,10 @@ namespace
|
|||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
DXGI_FORMAT EnsureNotTypeless( DXGI_FORMAT fmt ) noexcept
|
DXGI_FORMAT EnsureNotTypeless(DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
// Assumes UNORM or FLOAT; doesn't use UINT or SINT
|
// Assumes UNORM or FLOAT; doesn't use UINT or SINT
|
||||||
switch( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT;
|
case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
@ -623,58 +623,58 @@ namespace
|
|||||||
_In_ ID3D11DeviceContext* pContext,
|
_In_ ID3D11DeviceContext* pContext,
|
||||||
_In_ ID3D11Resource* pSource,
|
_In_ ID3D11Resource* pSource,
|
||||||
D3D11_TEXTURE2D_DESC& desc,
|
D3D11_TEXTURE2D_DESC& desc,
|
||||||
ComPtr<ID3D11Texture2D>& pStaging ) noexcept
|
ComPtr<ID3D11Texture2D>& pStaging) noexcept
|
||||||
{
|
{
|
||||||
if ( !pContext || !pSource )
|
if (!pContext || !pSource)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN;
|
D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN;
|
||||||
pSource->GetType( &resType );
|
pSource->GetType(&resType);
|
||||||
|
|
||||||
if ( resType != D3D11_RESOURCE_DIMENSION_TEXTURE2D )
|
if (resType != D3D11_RESOURCE_DIMENSION_TEXTURE2D)
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
|
|
||||||
ComPtr<ID3D11Texture2D> pTexture;
|
ComPtr<ID3D11Texture2D> pTexture;
|
||||||
HRESULT hr = pSource->QueryInterface(IID_ID3D11Texture2D, reinterpret_cast<void**>(pTexture.GetAddressOf()));
|
HRESULT hr = pSource->QueryInterface(IID_ID3D11Texture2D, reinterpret_cast<void**>(pTexture.GetAddressOf()));
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
assert( pTexture );
|
assert(pTexture);
|
||||||
|
|
||||||
pTexture->GetDesc( &desc );
|
pTexture->GetDesc(&desc);
|
||||||
|
|
||||||
ComPtr<ID3D11Device> d3dDevice;
|
ComPtr<ID3D11Device> d3dDevice;
|
||||||
pContext->GetDevice( d3dDevice.GetAddressOf() );
|
pContext->GetDevice(d3dDevice.GetAddressOf());
|
||||||
|
|
||||||
if ( desc.SampleDesc.Count > 1 )
|
if (desc.SampleDesc.Count > 1)
|
||||||
{
|
{
|
||||||
// MSAA content must be resolved before being copied to a staging texture
|
// MSAA content must be resolved before being copied to a staging texture
|
||||||
desc.SampleDesc.Count = 1;
|
desc.SampleDesc.Count = 1;
|
||||||
desc.SampleDesc.Quality = 0;
|
desc.SampleDesc.Quality = 0;
|
||||||
|
|
||||||
ComPtr<ID3D11Texture2D> pTemp;
|
ComPtr<ID3D11Texture2D> pTemp;
|
||||||
hr = d3dDevice->CreateTexture2D( &desc, nullptr, pTemp.GetAddressOf() );
|
hr = d3dDevice->CreateTexture2D(&desc, nullptr, pTemp.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
assert( pTemp );
|
assert(pTemp);
|
||||||
|
|
||||||
DXGI_FORMAT fmt = EnsureNotTypeless( desc.Format );
|
DXGI_FORMAT fmt = EnsureNotTypeless(desc.Format);
|
||||||
|
|
||||||
UINT support = 0;
|
UINT support = 0;
|
||||||
hr = d3dDevice->CheckFormatSupport( fmt, &support );
|
hr = d3dDevice->CheckFormatSupport(fmt, &support);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( !(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE) )
|
if (!(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
for( UINT item = 0; item < desc.ArraySize; ++item )
|
for (UINT item = 0; item < desc.ArraySize; ++item)
|
||||||
{
|
{
|
||||||
for( UINT level = 0; level < desc.MipLevels; ++level )
|
for (UINT level = 0; level < desc.MipLevels; ++level)
|
||||||
{
|
{
|
||||||
UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
|
UINT index = D3D11CalcSubresource(level, item, desc.MipLevels);
|
||||||
pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, fmt );
|
pContext->ResolveSubresource(pTemp.Get(), index, pSource, index, fmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,14 +684,14 @@ namespace
|
|||||||
desc.Usage = D3D11_USAGE_STAGING;
|
desc.Usage = D3D11_USAGE_STAGING;
|
||||||
|
|
||||||
hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf());
|
hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
assert( pStaging );
|
assert(pStaging);
|
||||||
|
|
||||||
pContext->CopyResource( pStaging.Get(), pTemp.Get() );
|
pContext->CopyResource(pStaging.Get(), pTemp.Get());
|
||||||
}
|
}
|
||||||
else if ( (desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) )
|
else if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ))
|
||||||
{
|
{
|
||||||
// Handle case where the source is already a staging texture we can use directly
|
// Handle case where the source is already a staging texture we can use directly
|
||||||
pStaging = pTexture;
|
pStaging = pTexture;
|
||||||
@ -705,12 +705,12 @@ namespace
|
|||||||
desc.Usage = D3D11_USAGE_STAGING;
|
desc.Usage = D3D11_USAGE_STAGING;
|
||||||
|
|
||||||
hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf());
|
hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
assert( pStaging );
|
assert(pStaging);
|
||||||
|
|
||||||
pContext->CopyResource( pStaging.Get(), pSource );
|
pContext->CopyResource(pStaging.Get(), pSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -780,25 +780,25 @@ _Use_decl_annotations_
|
|||||||
HRESULT DirectX::SaveDDSTextureToFile(
|
HRESULT DirectX::SaveDDSTextureToFile(
|
||||||
ID3D11DeviceContext* pContext,
|
ID3D11DeviceContext* pContext,
|
||||||
ID3D11Resource* pSource,
|
ID3D11Resource* pSource,
|
||||||
const wchar_t* fileName ) noexcept
|
const wchar_t* fileName) noexcept
|
||||||
{
|
{
|
||||||
if ( !fileName )
|
if (!fileName)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
D3D11_TEXTURE2D_DESC desc = {};
|
D3D11_TEXTURE2D_DESC desc = {};
|
||||||
ComPtr<ID3D11Texture2D> pStaging;
|
ComPtr<ID3D11Texture2D> pStaging;
|
||||||
HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging );
|
HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Create file
|
// Create file
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
|
||||||
ScopedHandle hFile( safe_handle( CreateFile2( fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr ) ) );
|
ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr)));
|
||||||
#else
|
#else
|
||||||
ScopedHandle hFile( safe_handle( CreateFileW( fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr ) ) );
|
ScopedHandle hFile(safe_handle(CreateFileW(fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr)));
|
||||||
#endif
|
#endif
|
||||||
if ( !hFile )
|
if (!hFile)
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
auto_delete_file delonfail(hFile.get());
|
auto_delete_file delonfail(hFile.get());
|
||||||
|
|
||||||
@ -810,7 +810,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
auto header = reinterpret_cast<DDS_HEADER*>(&fileHeader[0] + sizeof(uint32_t));
|
auto header = reinterpret_cast<DDS_HEADER*>(&fileHeader[0] + sizeof(uint32_t));
|
||||||
size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER);
|
size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER);
|
||||||
header->size = sizeof( DDS_HEADER );
|
header->size = sizeof(DDS_HEADER);
|
||||||
header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP;
|
header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP;
|
||||||
header->height = desc.Height;
|
header->height = desc.Height;
|
||||||
header->width = desc.Width;
|
header->width = desc.Width;
|
||||||
@ -819,32 +819,32 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
// Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension
|
// Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension
|
||||||
DDS_HEADER_DXT10* extHeader = nullptr;
|
DDS_HEADER_DXT10* extHeader = nullptr;
|
||||||
switch( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16G16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16G16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC2_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC2_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC3_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC3_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC4_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC4_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC5_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC5_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16G16_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16G16_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1
|
case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1
|
||||||
case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1
|
case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1
|
||||||
case DXGI_FORMAT_YUY2: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2
|
case DXGI_FORMAT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2
|
||||||
case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2
|
case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2
|
||||||
|
|
||||||
// Legacy D3DX formats using D3DFMT enum value as FourCC
|
// Legacy D3DX formats using D3DFMT enum value as FourCC
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F
|
case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F
|
||||||
@ -860,7 +860,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
case DXGI_FORMAT_IA44:
|
case DXGI_FORMAT_IA44:
|
||||||
case DXGI_FORMAT_P8:
|
case DXGI_FORMAT_P8:
|
||||||
case DXGI_FORMAT_A8P8:
|
case DXGI_FORMAT_A8P8:
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT));
|
memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT));
|
||||||
@ -874,65 +874,65 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t rowPitch, slicePitch, rowCount;
|
size_t rowPitch, slicePitch, rowCount;
|
||||||
hr = GetSurfaceInfo( desc.Width, desc.Height, desc.Format, &slicePitch, &rowPitch, &rowCount );
|
hr = GetSurfaceInfo(desc.Width, desc.Height, desc.Format, &slicePitch, &rowPitch, &rowCount);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (rowPitch > UINT32_MAX || slicePitch > UINT32_MAX)
|
if (rowPitch > UINT32_MAX || slicePitch > UINT32_MAX)
|
||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
|
|
||||||
if ( IsCompressed( desc.Format ) )
|
if (IsCompressed(desc.Format))
|
||||||
{
|
{
|
||||||
header->flags |= DDS_HEADER_FLAGS_LINEARSIZE;
|
header->flags |= DDS_HEADER_FLAGS_LINEARSIZE;
|
||||||
header->pitchOrLinearSize = static_cast<uint32_t>( slicePitch );
|
header->pitchOrLinearSize = static_cast<uint32_t>(slicePitch);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
header->flags |= DDS_HEADER_FLAGS_PITCH;
|
header->flags |= DDS_HEADER_FLAGS_PITCH;
|
||||||
header->pitchOrLinearSize = static_cast<uint32_t>( rowPitch );
|
header->pitchOrLinearSize = static_cast<uint32_t>(rowPitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup pixels
|
// Setup pixels
|
||||||
std::unique_ptr<uint8_t[]> pixels( new (std::nothrow) uint8_t[ slicePitch ] );
|
std::unique_ptr<uint8_t[]> pixels(new (std::nothrow) uint8_t[slicePitch]);
|
||||||
if (!pixels)
|
if (!pixels)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
D3D11_MAPPED_SUBRESOURCE mapped;
|
D3D11_MAPPED_SUBRESOURCE mapped;
|
||||||
hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped );
|
hr = pContext->Map(pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
auto sptr = static_cast<const uint8_t*>( mapped.pData );
|
auto sptr = static_cast<const uint8_t*>(mapped.pData);
|
||||||
if ( !sptr )
|
if (!sptr)
|
||||||
{
|
{
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* dptr = pixels.get();
|
uint8_t* dptr = pixels.get();
|
||||||
|
|
||||||
size_t msize = std::min<size_t>( rowPitch, mapped.RowPitch );
|
size_t msize = std::min<size_t>(rowPitch, mapped.RowPitch);
|
||||||
for( size_t h = 0; h < rowCount; ++h )
|
for (size_t h = 0; h < rowCount; ++h)
|
||||||
{
|
{
|
||||||
memcpy_s( dptr, rowPitch, sptr, msize );
|
memcpy_s(dptr, rowPitch, sptr, msize);
|
||||||
sptr += mapped.RowPitch;
|
sptr += mapped.RowPitch;
|
||||||
dptr += rowPitch;
|
dptr += rowPitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
|
|
||||||
// Write header & pixels
|
// Write header & pixels
|
||||||
DWORD bytesWritten;
|
DWORD bytesWritten;
|
||||||
if ( !WriteFile( hFile.get(), fileHeader, static_cast<DWORD>( headerSize ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), fileHeader, static_cast<DWORD>(headerSize), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != headerSize )
|
if (bytesWritten != headerSize)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
if ( !WriteFile( hFile.get(), pixels.get(), static_cast<DWORD>( slicePitch ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), pixels.get(), static_cast<DWORD>(slicePitch), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != slicePitch )
|
if (bytesWritten != slicePitch)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
@ -951,19 +951,19 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
std::function<void(IPropertyBag2*)> setCustomProps,
|
std::function<void(IPropertyBag2*)> setCustomProps,
|
||||||
bool forceSRGB) noexcept
|
bool forceSRGB) noexcept
|
||||||
{
|
{
|
||||||
if ( !fileName )
|
if (!fileName)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
D3D11_TEXTURE2D_DESC desc = {};
|
D3D11_TEXTURE2D_DESC desc = {};
|
||||||
ComPtr<ID3D11Texture2D> pStaging;
|
ComPtr<ID3D11Texture2D> pStaging;
|
||||||
HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging );
|
HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Determine source format's WIC equivalent
|
// Determine source format's WIC equivalent
|
||||||
WICPixelFormatGUID pfGuid = {};
|
WICPixelFormatGUID pfGuid = {};
|
||||||
bool sRGB = forceSRGB;
|
bool sRGB = forceSRGB;
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break;
|
case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break;
|
||||||
case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break;
|
case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break;
|
||||||
@ -1006,37 +1006,37 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pWIC = _GetWIC();
|
auto pWIC = _GetWIC();
|
||||||
if ( !pWIC )
|
if (!pWIC)
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
|
|
||||||
ComPtr<IWICStream> stream;
|
ComPtr<IWICStream> stream;
|
||||||
hr = pWIC->CreateStream( stream.GetAddressOf() );
|
hr = pWIC->CreateStream(stream.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = stream->InitializeFromFilename( fileName, GENERIC_WRITE );
|
hr = stream->InitializeFromFilename(fileName, GENERIC_WRITE);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
auto_delete_file_wic delonfail(stream, fileName);
|
auto_delete_file_wic delonfail(stream, fileName);
|
||||||
|
|
||||||
ComPtr<IWICBitmapEncoder> encoder;
|
ComPtr<IWICBitmapEncoder> encoder;
|
||||||
hr = pWIC->CreateEncoder( guidContainerFormat, nullptr, encoder.GetAddressOf() );
|
hr = pWIC->CreateEncoder(guidContainerFormat, nullptr, encoder.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Initialize( stream.Get(), WICBitmapEncoderNoCache );
|
hr = encoder->Initialize(stream.Get(), WICBitmapEncoderNoCache);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
ComPtr<IWICBitmapFrameEncode> frame;
|
ComPtr<IWICBitmapFrameEncode> frame;
|
||||||
ComPtr<IPropertyBag2> props;
|
ComPtr<IPropertyBag2> props;
|
||||||
hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() );
|
hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0 && g_WIC2)
|
if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0 && g_WIC2)
|
||||||
@ -1051,33 +1051,33 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
(void)props->Write(1, &option, &varValue);
|
(void)props->Write(1, &option, &varValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( setCustomProps )
|
if (setCustomProps)
|
||||||
{
|
{
|
||||||
setCustomProps( props.Get() );
|
setCustomProps(props.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->Initialize( props.Get() );
|
hr = frame->Initialize(props.Get());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetSize( desc.Width , desc.Height );
|
hr = frame->SetSize(desc.Width, desc.Height);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetResolution( 72, 72 );
|
hr = frame->SetResolution(72, 72);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Pick a target format
|
// Pick a target format
|
||||||
WICPixelFormatGUID targetGuid = {};
|
WICPixelFormatGUID targetGuid = {};
|
||||||
if ( targetFormat )
|
if (targetFormat)
|
||||||
{
|
{
|
||||||
targetGuid = *targetFormat;
|
targetGuid = *targetFormat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Screenshots don't typically include the alpha channel of the render target
|
// Screenshots don't typically include the alpha channel of the render target
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
||||||
@ -1111,11 +1111,11 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->SetPixelFormat( &targetGuid );
|
hr = frame->SetPixelFormat(&targetGuid);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( targetFormat && memcmp( targetFormat, &targetGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (targetFormat && memcmp(targetFormat, &targetGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Requested output pixel format is not supported by the WIC codec
|
// Requested output pixel format is not supported by the WIC codec
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
@ -1123,18 +1123,18 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
|
|
||||||
// Encode WIC metadata
|
// Encode WIC metadata
|
||||||
ComPtr<IWICMetadataQueryWriter> metawriter;
|
ComPtr<IWICMetadataQueryWriter> metawriter;
|
||||||
if ( SUCCEEDED( frame->GetMetadataQueryWriter( metawriter.GetAddressOf() ) ) )
|
if (SUCCEEDED(frame->GetMetadataQueryWriter(metawriter.GetAddressOf())))
|
||||||
{
|
{
|
||||||
PROPVARIANT value;
|
PROPVARIANT value;
|
||||||
PropVariantInit( &value );
|
PropVariantInit(&value);
|
||||||
|
|
||||||
value.vt = VT_LPSTR;
|
value.vt = VT_LPSTR;
|
||||||
value.pszVal = const_cast<char*>("DirectXTK");
|
value.pszVal = const_cast<char*>("DirectXTK");
|
||||||
|
|
||||||
if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 )
|
if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0)
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"/tEXt/{str=Software}", &value );
|
(void)metawriter->SetMetadataByName(L"/tEXt/{str=Software}", &value);
|
||||||
|
|
||||||
// Set sRGB chunk
|
// Set sRGB chunk
|
||||||
if (sRGB)
|
if (sRGB)
|
||||||
@ -1157,21 +1157,21 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"System.ApplicationName", &value );
|
(void)metawriter->SetMetadataByName(L"System.ApplicationName", &value);
|
||||||
|
|
||||||
if ( sRGB )
|
if (sRGB)
|
||||||
{
|
{
|
||||||
// Set EXIF Colorspace of sRGB
|
// Set EXIF Colorspace of sRGB
|
||||||
value.vt = VT_UI2;
|
value.vt = VT_UI2;
|
||||||
value.uiVal = 1;
|
value.uiVal = 1;
|
||||||
(void)metawriter->SetMetadataByName( L"System.Image.ColorSpace", &value );
|
(void)metawriter->SetMetadataByName(L"System.Image.ColorSpace", &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11_MAPPED_SUBRESOURCE mapped;
|
D3D11_MAPPED_SUBRESOURCE mapped;
|
||||||
hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped );
|
hr = pContext->Map(pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
uint64_t imageSize = uint64_t(mapped.RowPitch) * uint64_t(desc.Height);
|
uint64_t imageSize = uint64_t(mapped.RowPitch) * uint64_t(desc.Height);
|
||||||
@ -1181,7 +1181,7 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( memcmp( &targetGuid, &pfGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (memcmp(&targetGuid, &pfGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Conversion required to write
|
// Conversion required to write
|
||||||
ComPtr<IWICBitmap> source;
|
ComPtr<IWICBitmap> source;
|
||||||
@ -1189,55 +1189,55 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
pfGuid,
|
pfGuid,
|
||||||
mapped.RowPitch, static_cast<UINT>(imageSize),
|
mapped.RowPitch, static_cast<UINT>(imageSize),
|
||||||
static_cast<BYTE*>(mapped.pData), source.GetAddressOf());
|
static_cast<BYTE*>(mapped.pData), source.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IWICFormatConverter> FC;
|
ComPtr<IWICFormatConverter> FC;
|
||||||
hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
|
hr = pWIC->CreateFormatConverter(FC.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL canConvert = FALSE;
|
BOOL canConvert = FALSE;
|
||||||
hr = FC->CanConvert( pfGuid, targetGuid, &canConvert );
|
hr = FC->CanConvert(pfGuid, targetGuid, &canConvert);
|
||||||
if ( FAILED(hr) || !canConvert )
|
if (FAILED(hr) || !canConvert)
|
||||||
{
|
{
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = FC->Initialize( source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut );
|
hr = FC->Initialize(source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
WICRect rect = { 0, 0, static_cast<INT>( desc.Width ), static_cast<INT>( desc.Height ) };
|
WICRect rect = { 0, 0, static_cast<INT>(desc.Width), static_cast<INT>(desc.Height) };
|
||||||
hr = frame->WriteSource( FC.Get(), &rect );
|
hr = frame->WriteSource(FC.Get(), &rect);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// No conversion required
|
// No conversion required
|
||||||
hr = frame->WritePixels( desc.Height, mapped.RowPitch, static_cast<UINT>(imageSize), static_cast<BYTE*>( mapped.pData ) );
|
hr = frame->WritePixels(desc.Height, mapped.RowPitch, static_cast<UINT>(imageSize), static_cast<BYTE*>(mapped.pData));
|
||||||
}
|
}
|
||||||
|
|
||||||
pContext->Unmap( pStaging.Get(), 0 );
|
pContext->Unmap(pStaging.Get(), 0);
|
||||||
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->Commit();
|
hr = frame->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Commit();
|
hr = encoder->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
|
@ -202,7 +202,7 @@ namespace
|
|||||||
|
|
||||||
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
||||||
|
|
||||||
inline HANDLE safe_handle( HANDLE h ) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
||||||
|
|
||||||
class auto_delete_file
|
class auto_delete_file
|
||||||
{
|
{
|
||||||
@ -259,9 +259,9 @@ namespace
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
// Return the BPP for a particular format
|
// Return the BPP for a particular format
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
size_t BitsPerPixel( _In_ DXGI_FORMAT fmt ) noexcept
|
size_t BitsPerPixel(_In_ DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
switch( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
|
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
||||||
@ -412,9 +412,9 @@ namespace
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
// Determines if the format is block compressed
|
// Determines if the format is block compressed
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
bool IsCompressed( _In_ DXGI_FORMAT fmt ) noexcept
|
bool IsCompressed(_In_ DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
switch ( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_BC1_TYPELESS:
|
case DXGI_FORMAT_BC1_TYPELESS:
|
||||||
case DXGI_FORMAT_BC1_UNORM:
|
case DXGI_FORMAT_BC1_UNORM:
|
||||||
@ -596,10 +596,10 @@ namespace
|
|||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
DXGI_FORMAT EnsureNotTypeless( DXGI_FORMAT fmt ) noexcept
|
DXGI_FORMAT EnsureNotTypeless(DXGI_FORMAT fmt) noexcept
|
||||||
{
|
{
|
||||||
// Assumes UNORM or FLOAT; doesn't use UINT or SINT
|
// Assumes UNORM or FLOAT; doesn't use UINT or SINT
|
||||||
switch( fmt )
|
switch (fmt)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT;
|
case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
@ -856,7 +856,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
D3D12_RESOURCE_STATES beforeState,
|
D3D12_RESOURCE_STATES beforeState,
|
||||||
D3D12_RESOURCE_STATES afterState) noexcept
|
D3D12_RESOURCE_STATES afterState) noexcept
|
||||||
{
|
{
|
||||||
if ( !fileName )
|
if (!fileName)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
ComPtr<ID3D12Device> device;
|
ComPtr<ID3D12Device> device;
|
||||||
@ -889,14 +889,14 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
|
|
||||||
ComPtr<ID3D12Resource> pStaging;
|
ComPtr<ID3D12Resource> pStaging;
|
||||||
HRESULT hr = CaptureTexture( device.Get(), pCommandQ, pSource, dstRowPitch, desc, pStaging, beforeState, afterState );
|
HRESULT hr = CaptureTexture(device.Get(), pCommandQ, pSource, dstRowPitch, desc, pStaging, beforeState, afterState);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Create file
|
// Create file
|
||||||
ScopedHandle hFile( safe_handle( CreateFile2( fileName, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr ) ) );
|
ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr)));
|
||||||
if ( !hFile )
|
if (!hFile)
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
auto_delete_file delonfail(hFile.get());
|
auto_delete_file delonfail(hFile.get());
|
||||||
|
|
||||||
@ -908,7 +908,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
auto header = reinterpret_cast<DDS_HEADER*>(&fileHeader[0] + sizeof(uint32_t));
|
auto header = reinterpret_cast<DDS_HEADER*>(&fileHeader[0] + sizeof(uint32_t));
|
||||||
size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER);
|
size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER);
|
||||||
header->size = sizeof( DDS_HEADER );
|
header->size = sizeof(DDS_HEADER);
|
||||||
header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP;
|
header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP;
|
||||||
header->height = desc.Height;
|
header->height = desc.Height;
|
||||||
header->width = static_cast<uint32_t>(desc.Width);
|
header->width = static_cast<uint32_t>(desc.Width);
|
||||||
@ -917,32 +917,32 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
// Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension
|
// Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension
|
||||||
DDS_HEADER_DXT10* extHeader = nullptr;
|
DDS_HEADER_DXT10* extHeader = nullptr;
|
||||||
switch( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16G16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16G16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC2_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC2_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC3_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC3_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC4_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC4_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_BC5_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_BC5_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_R16G16_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_R16G16_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_YUY2: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT) ); break;
|
case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
|
|
||||||
// Legacy D3DX formats using D3DFMT enum value as FourCC
|
// Legacy D3DX formats using D3DFMT enum value as FourCC
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F
|
case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F
|
||||||
@ -958,7 +958,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
case DXGI_FORMAT_IA44:
|
case DXGI_FORMAT_IA44:
|
||||||
case DXGI_FORMAT_P8:
|
case DXGI_FORMAT_P8:
|
||||||
case DXGI_FORMAT_A8P8:
|
case DXGI_FORMAT_A8P8:
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT));
|
memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT));
|
||||||
@ -979,19 +979,19 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
if (rowPitch > UINT32_MAX || slicePitch > UINT32_MAX)
|
if (rowPitch > UINT32_MAX || slicePitch > UINT32_MAX)
|
||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
|
|
||||||
if ( IsCompressed( desc.Format ) )
|
if (IsCompressed(desc.Format))
|
||||||
{
|
{
|
||||||
header->flags |= DDS_HEADER_FLAGS_LINEARSIZE;
|
header->flags |= DDS_HEADER_FLAGS_LINEARSIZE;
|
||||||
header->pitchOrLinearSize = static_cast<uint32_t>( slicePitch );
|
header->pitchOrLinearSize = static_cast<uint32_t>(slicePitch);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
header->flags |= DDS_HEADER_FLAGS_PITCH;
|
header->flags |= DDS_HEADER_FLAGS_PITCH;
|
||||||
header->pitchOrLinearSize = static_cast<uint32_t>( rowPitch );
|
header->pitchOrLinearSize = static_cast<uint32_t>(rowPitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup pixels
|
// Setup pixels
|
||||||
std::unique_ptr<uint8_t[]> pixels( new (std::nothrow) uint8_t[ slicePitch ] );
|
std::unique_ptr<uint8_t[]> pixels(new (std::nothrow) uint8_t[slicePitch]);
|
||||||
if (!pixels)
|
if (!pixels)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
@ -1005,12 +1005,12 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
void* pMappedMemory = nullptr;
|
void* pMappedMemory = nullptr;
|
||||||
D3D12_RANGE readRange = { 0, static_cast<SIZE_T>(imageSize) };
|
D3D12_RANGE readRange = { 0, static_cast<SIZE_T>(imageSize) };
|
||||||
D3D12_RANGE writeRange = { 0, 0 };
|
D3D12_RANGE writeRange = { 0, 0 };
|
||||||
hr = pStaging->Map(0, &readRange, &pMappedMemory );
|
hr = pStaging->Map(0, &readRange, &pMappedMemory);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
auto sptr = static_cast<const uint8_t*>(pMappedMemory);
|
auto sptr = static_cast<const uint8_t*>(pMappedMemory);
|
||||||
if ( !sptr )
|
if (!sptr)
|
||||||
{
|
{
|
||||||
pStaging->Unmap(0, &writeRange);
|
pStaging->Unmap(0, &writeRange);
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
@ -1018,28 +1018,28 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
uint8_t* dptr = pixels.get();
|
uint8_t* dptr = pixels.get();
|
||||||
|
|
||||||
size_t msize = std::min<size_t>( rowPitch, rowPitch );
|
size_t msize = std::min<size_t>(rowPitch, rowPitch);
|
||||||
for( size_t h = 0; h < rowCount; ++h )
|
for (size_t h = 0; h < rowCount; ++h)
|
||||||
{
|
{
|
||||||
memcpy_s( dptr, rowPitch, sptr, msize );
|
memcpy_s(dptr, rowPitch, sptr, msize);
|
||||||
sptr += dstRowPitch;
|
sptr += dstRowPitch;
|
||||||
dptr += rowPitch;
|
dptr += rowPitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStaging->Unmap( 0, &writeRange );
|
pStaging->Unmap(0, &writeRange);
|
||||||
|
|
||||||
// Write header & pixels
|
// Write header & pixels
|
||||||
DWORD bytesWritten;
|
DWORD bytesWritten;
|
||||||
if ( !WriteFile( hFile.get(), fileHeader, static_cast<DWORD>( headerSize ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), fileHeader, static_cast<DWORD>(headerSize), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != headerSize )
|
if (bytesWritten != headerSize)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
if ( !WriteFile( hFile.get(), pixels.get(), static_cast<DWORD>( slicePitch ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), pixels.get(), static_cast<DWORD>(slicePitch), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != slicePitch )
|
if (bytesWritten != slicePitch)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
@ -1060,7 +1060,7 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
std::function<void(IPropertyBag2*)> setCustomProps,
|
std::function<void(IPropertyBag2*)> setCustomProps,
|
||||||
bool forceSRGB) noexcept
|
bool forceSRGB) noexcept
|
||||||
{
|
{
|
||||||
if ( !fileName )
|
if (!fileName)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
ComPtr<ID3D12Device> device;
|
ComPtr<ID3D12Device> device;
|
||||||
@ -1100,7 +1100,7 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
// Determine source format's WIC equivalent
|
// Determine source format's WIC equivalent
|
||||||
WICPixelFormatGUID pfGuid = {};
|
WICPixelFormatGUID pfGuid = {};
|
||||||
bool sRGB = forceSRGB;
|
bool sRGB = forceSRGB;
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break;
|
case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break;
|
||||||
case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break;
|
case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break;
|
||||||
@ -1143,40 +1143,40 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pWIC = _GetWIC();
|
auto pWIC = _GetWIC();
|
||||||
if ( !pWIC )
|
if (!pWIC)
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
|
|
||||||
ComPtr<IWICStream> stream;
|
ComPtr<IWICStream> stream;
|
||||||
hr = pWIC->CreateStream( stream.GetAddressOf() );
|
hr = pWIC->CreateStream(stream.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = stream->InitializeFromFilename( fileName, GENERIC_WRITE );
|
hr = stream->InitializeFromFilename(fileName, GENERIC_WRITE);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
auto_delete_file_wic delonfail(stream, fileName);
|
auto_delete_file_wic delonfail(stream, fileName);
|
||||||
|
|
||||||
ComPtr<IWICBitmapEncoder> encoder;
|
ComPtr<IWICBitmapEncoder> encoder;
|
||||||
hr = pWIC->CreateEncoder( guidContainerFormat, nullptr, encoder.GetAddressOf() );
|
hr = pWIC->CreateEncoder(guidContainerFormat, nullptr, encoder.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Initialize( stream.Get(), WICBitmapEncoderNoCache );
|
hr = encoder->Initialize(stream.Get(), WICBitmapEncoderNoCache);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
ComPtr<IWICBitmapFrameEncode> frame;
|
ComPtr<IWICBitmapFrameEncode> frame;
|
||||||
ComPtr<IPropertyBag2> props;
|
ComPtr<IPropertyBag2> props;
|
||||||
hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() );
|
hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( targetFormat && memcmp( &guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID) ) == 0 )
|
if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0)
|
||||||
{
|
{
|
||||||
// Opt-in to the WIC2 support for writing 32-bit Windows BMP files with an alpha channel
|
// Opt-in to the WIC2 support for writing 32-bit Windows BMP files with an alpha channel
|
||||||
PROPBAG2 option = {};
|
PROPBAG2 option = {};
|
||||||
@ -1185,36 +1185,36 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
VARIANT varValue;
|
VARIANT varValue;
|
||||||
varValue.vt = VT_BOOL;
|
varValue.vt = VT_BOOL;
|
||||||
varValue.boolVal = VARIANT_TRUE;
|
varValue.boolVal = VARIANT_TRUE;
|
||||||
(void)props->Write( 1, &option, &varValue );
|
(void)props->Write(1, &option, &varValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( setCustomProps )
|
if (setCustomProps)
|
||||||
{
|
{
|
||||||
setCustomProps( props.Get() );
|
setCustomProps(props.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->Initialize( props.Get() );
|
hr = frame->Initialize(props.Get());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetSize(static_cast<UINT>(desc.Width), desc.Height );
|
hr = frame->SetSize(static_cast<UINT>(desc.Width), desc.Height);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetResolution( 72, 72 );
|
hr = frame->SetResolution(72, 72);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Pick a target format
|
// Pick a target format
|
||||||
WICPixelFormatGUID targetGuid = {};
|
WICPixelFormatGUID targetGuid = {};
|
||||||
if ( targetFormat )
|
if (targetFormat)
|
||||||
{
|
{
|
||||||
targetGuid = *targetFormat;
|
targetGuid = *targetFormat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Screenshots don't typically include the alpha channel of the render target
|
// Screenshots don't typically include the alpha channel of the render target
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
||||||
case DXGI_FORMAT_R16G16B16A16_FLOAT:
|
case DXGI_FORMAT_R16G16B16A16_FLOAT:
|
||||||
@ -1239,11 +1239,11 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->SetPixelFormat( &targetGuid );
|
hr = frame->SetPixelFormat(&targetGuid);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( targetFormat && memcmp( targetFormat, &targetGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (targetFormat && memcmp(targetFormat, &targetGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Requested output pixel format is not supported by the WIC codec
|
// Requested output pixel format is not supported by the WIC codec
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
@ -1251,18 +1251,18 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
|
|
||||||
// Encode WIC metadata
|
// Encode WIC metadata
|
||||||
ComPtr<IWICMetadataQueryWriter> metawriter;
|
ComPtr<IWICMetadataQueryWriter> metawriter;
|
||||||
if ( SUCCEEDED( frame->GetMetadataQueryWriter( metawriter.GetAddressOf() ) ) )
|
if (SUCCEEDED(frame->GetMetadataQueryWriter(metawriter.GetAddressOf())))
|
||||||
{
|
{
|
||||||
PROPVARIANT value;
|
PROPVARIANT value;
|
||||||
PropVariantInit( &value );
|
PropVariantInit(&value);
|
||||||
|
|
||||||
value.vt = VT_LPSTR;
|
value.vt = VT_LPSTR;
|
||||||
value.pszVal = const_cast<char*>("DirectXTK");
|
value.pszVal = const_cast<char*>("DirectXTK");
|
||||||
|
|
||||||
if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 )
|
if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0)
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"/tEXt/{str=Software}", &value );
|
(void)metawriter->SetMetadataByName(L"/tEXt/{str=Software}", &value);
|
||||||
|
|
||||||
// Set sRGB chunk
|
// Set sRGB chunk
|
||||||
if (sRGB)
|
if (sRGB)
|
||||||
@ -1285,14 +1285,14 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"System.ApplicationName", &value );
|
(void)metawriter->SetMetadataByName(L"System.ApplicationName", &value);
|
||||||
|
|
||||||
if ( sRGB )
|
if (sRGB)
|
||||||
{
|
{
|
||||||
// Set EXIF Colorspace of sRGB
|
// Set EXIF Colorspace of sRGB
|
||||||
value.vt = VT_UI2;
|
value.vt = VT_UI2;
|
||||||
value.uiVal = 1;
|
value.uiVal = 1;
|
||||||
(void)metawriter->SetMetadataByName( L"System.Image.ColorSpace", &value );
|
(void)metawriter->SetMetadataByName(L"System.Image.ColorSpace", &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1302,50 +1302,50 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
|
|
||||||
void* pMappedMemory = nullptr;
|
void* pMappedMemory = nullptr;
|
||||||
D3D12_RANGE readRange = {0, static_cast<SIZE_T>(imageSize)};
|
D3D12_RANGE readRange = { 0, static_cast<SIZE_T>(imageSize) };
|
||||||
D3D12_RANGE writeRange = {0, 0};
|
D3D12_RANGE writeRange = { 0, 0 };
|
||||||
hr = pStaging->Map(0, &readRange, &pMappedMemory);
|
hr = pStaging->Map(0, &readRange, &pMappedMemory);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( memcmp( &targetGuid, &pfGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (memcmp(&targetGuid, &pfGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Conversion required to write
|
// Conversion required to write
|
||||||
ComPtr<IWICBitmap> source;
|
ComPtr<IWICBitmap> source;
|
||||||
hr = pWIC->CreateBitmapFromMemory(static_cast<UINT>(desc.Width), desc.Height, pfGuid,
|
hr = pWIC->CreateBitmapFromMemory(static_cast<UINT>(desc.Width), desc.Height, pfGuid,
|
||||||
static_cast<UINT>(dstRowPitch), static_cast<UINT>(imageSize),
|
static_cast<UINT>(dstRowPitch), static_cast<UINT>(imageSize),
|
||||||
static_cast<BYTE*>(pMappedMemory), source.GetAddressOf() );
|
static_cast<BYTE*>(pMappedMemory), source.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pStaging->Unmap( 0, &writeRange );
|
pStaging->Unmap(0, &writeRange);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IWICFormatConverter> FC;
|
ComPtr<IWICFormatConverter> FC;
|
||||||
hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
|
hr = pWIC->CreateFormatConverter(FC.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pStaging->Unmap(0, &writeRange);
|
pStaging->Unmap(0, &writeRange);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL canConvert = FALSE;
|
BOOL canConvert = FALSE;
|
||||||
hr = FC->CanConvert( pfGuid, targetGuid, &canConvert );
|
hr = FC->CanConvert(pfGuid, targetGuid, &canConvert);
|
||||||
if ( FAILED(hr) || !canConvert )
|
if (FAILED(hr) || !canConvert)
|
||||||
{
|
{
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = FC->Initialize( source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut );
|
hr = FC->Initialize(source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pStaging->Unmap(0, &writeRange);
|
pStaging->Unmap(0, &writeRange);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
WICRect rect = { 0, 0, static_cast<INT>( desc.Width ), static_cast<INT>( desc.Height ) };
|
WICRect rect = { 0, 0, static_cast<INT>(desc.Width), static_cast<INT>(desc.Height) };
|
||||||
hr = frame->WriteSource( FC.Get(), &rect );
|
hr = frame->WriteSource(FC.Get(), &rect);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pStaging->Unmap(0, &writeRange);
|
pStaging->Unmap(0, &writeRange);
|
||||||
return hr;
|
return hr;
|
||||||
@ -1354,19 +1354,19 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// No conversion required
|
// No conversion required
|
||||||
hr = frame->WritePixels( desc.Height, static_cast<UINT>(dstRowPitch), static_cast<UINT>(imageSize), static_cast<BYTE*>( pMappedMemory ) );
|
hr = frame->WritePixels(desc.Height, static_cast<UINT>(dstRowPitch), static_cast<UINT>(imageSize), static_cast<BYTE*>(pMappedMemory));
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStaging->Unmap(0, &writeRange);
|
pStaging->Unmap(0, &writeRange);
|
||||||
|
|
||||||
hr = frame->Commit();
|
hr = frame->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Commit();
|
hr = encoder->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
|
@ -211,7 +211,7 @@ namespace
|
|||||||
|
|
||||||
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
using ScopedHandle = std::unique_ptr<void, handle_closer>;
|
||||||
|
|
||||||
inline HANDLE safe_handle( HANDLE h ) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
|
||||||
|
|
||||||
class auto_delete_file
|
class auto_delete_file
|
||||||
{
|
{
|
||||||
@ -561,9 +561,9 @@ namespace
|
|||||||
_Use_decl_annotations_
|
_Use_decl_annotations_
|
||||||
HRESULT DirectX::SaveDDSTextureToFile(
|
HRESULT DirectX::SaveDDSTextureToFile(
|
||||||
LPDIRECT3DSURFACE9 pSource,
|
LPDIRECT3DSURFACE9 pSource,
|
||||||
const wchar_t* fileName ) noexcept
|
const wchar_t* fileName) noexcept
|
||||||
{
|
{
|
||||||
if ( !pSource|| !fileName )
|
if (!pSource || !fileName)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
D3DSURFACE_DESC desc = {};
|
D3DSURFACE_DESC desc = {};
|
||||||
@ -583,12 +583,12 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
// Create file
|
// Create file
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
|
||||||
ScopedHandle hFile( safe_handle( CreateFile2( fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr ) ) );
|
ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr)));
|
||||||
#else
|
#else
|
||||||
ScopedHandle hFile( safe_handle( CreateFileW( fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr ) ) );
|
ScopedHandle hFile(safe_handle(CreateFileW(fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr)));
|
||||||
#endif
|
#endif
|
||||||
if ( !hFile )
|
if (!hFile)
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
auto_delete_file delonfail(hFile.get());
|
auto_delete_file delonfail(hFile.get());
|
||||||
|
|
||||||
@ -607,7 +607,7 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
header->mipMapCount = 1;
|
header->mipMapCount = 1;
|
||||||
header->caps = DDS_SURFACE_FLAGS_TEXTURE;
|
header->caps = DDS_SURFACE_FLAGS_TEXTURE;
|
||||||
|
|
||||||
switch( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case D3DFMT_R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
case D3DFMT_R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
case D3DFMT_A8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
case D3DFMT_A8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break;
|
||||||
@ -702,9 +702,9 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
uint8_t* dptr = pixels.get();
|
uint8_t* dptr = pixels.get();
|
||||||
|
|
||||||
size_t msize = std::min<size_t>(rowPitch, static_cast<size_t>(lockedRect.Pitch));
|
size_t msize = std::min<size_t>(rowPitch, static_cast<size_t>(lockedRect.Pitch));
|
||||||
for( size_t h = 0; h < rowCount; ++h )
|
for (size_t h = 0; h < rowCount; ++h)
|
||||||
{
|
{
|
||||||
memcpy_s( dptr, rowPitch, sptr, msize );
|
memcpy_s(dptr, rowPitch, sptr, msize);
|
||||||
sptr += lockedRect.Pitch;
|
sptr += lockedRect.Pitch;
|
||||||
dptr += rowPitch;
|
dptr += rowPitch;
|
||||||
}
|
}
|
||||||
@ -713,16 +713,16 @@ HRESULT DirectX::SaveDDSTextureToFile(
|
|||||||
|
|
||||||
// Write header & pixels
|
// Write header & pixels
|
||||||
DWORD bytesWritten;
|
DWORD bytesWritten;
|
||||||
if ( !WriteFile( hFile.get(), fileHeader, static_cast<DWORD>( headerSize ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), fileHeader, static_cast<DWORD>(headerSize), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != headerSize )
|
if (bytesWritten != headerSize)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
if ( !WriteFile( hFile.get(), pixels.get(), static_cast<DWORD>( slicePitch ), &bytesWritten, nullptr ) )
|
if (!WriteFile(hFile.get(), pixels.get(), static_cast<DWORD>(slicePitch), &bytesWritten, nullptr))
|
||||||
return HRESULT_FROM_WIN32( GetLastError() );
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
if ( bytesWritten != slicePitch )
|
if (bytesWritten != slicePitch)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
@ -764,7 +764,7 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
|
|
||||||
// Determine source format's WIC equivalent
|
// Determine source format's WIC equivalent
|
||||||
WICPixelFormatGUID pfGuid = {};
|
WICPixelFormatGUID pfGuid = {};
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
case D3DFMT_R8G8B8: pfGuid = GUID_WICPixelFormat24bppBGR; break;
|
case D3DFMT_R8G8B8: pfGuid = GUID_WICPixelFormat24bppBGR; break;
|
||||||
case D3DFMT_A8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGRA; break;
|
case D3DFMT_A8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGRA; break;
|
||||||
@ -793,33 +793,33 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
|
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IWICStream> stream;
|
ComPtr<IWICStream> stream;
|
||||||
hr = pWIC->CreateStream( stream.GetAddressOf() );
|
hr = pWIC->CreateStream(stream.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = stream->InitializeFromFilename( fileName, GENERIC_WRITE );
|
hr = stream->InitializeFromFilename(fileName, GENERIC_WRITE);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
auto_delete_file_wic delonfail(stream, fileName);
|
auto_delete_file_wic delonfail(stream, fileName);
|
||||||
|
|
||||||
ComPtr<IWICBitmapEncoder> encoder;
|
ComPtr<IWICBitmapEncoder> encoder;
|
||||||
hr = pWIC->CreateEncoder( guidContainerFormat, nullptr, encoder.GetAddressOf() );
|
hr = pWIC->CreateEncoder(guidContainerFormat, nullptr, encoder.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Initialize( stream.Get(), WICBitmapEncoderNoCache );
|
hr = encoder->Initialize(stream.Get(), WICBitmapEncoderNoCache);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
ComPtr<IWICBitmapFrameEncode> frame;
|
ComPtr<IWICBitmapFrameEncode> frame;
|
||||||
ComPtr<IPropertyBag2> props;
|
ComPtr<IPropertyBag2> props;
|
||||||
hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() );
|
hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0 && g_WIC2)
|
if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0 && g_WIC2)
|
||||||
@ -834,33 +834,33 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
(void)props->Write(1, &option, &varValue);
|
(void)props->Write(1, &option, &varValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( setCustomProps )
|
if (setCustomProps)
|
||||||
{
|
{
|
||||||
setCustomProps( props.Get() );
|
setCustomProps(props.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->Initialize( props.Get() );
|
hr = frame->Initialize(props.Get());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetSize( desc.Width , desc.Height );
|
hr = frame->SetSize(desc.Width, desc.Height);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->SetResolution( 72, 72 );
|
hr = frame->SetResolution(72, 72);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
// Pick a target format
|
// Pick a target format
|
||||||
WICPixelFormatGUID targetGuid = {};
|
WICPixelFormatGUID targetGuid = {};
|
||||||
if ( targetFormat )
|
if (targetFormat)
|
||||||
{
|
{
|
||||||
targetGuid = *targetFormat;
|
targetGuid = *targetFormat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Screenshots don't typically include the alpha channel of the render target
|
// Screenshots don't typically include the alpha channel of the render target
|
||||||
switch ( desc.Format )
|
switch (desc.Format)
|
||||||
{
|
{
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
|
||||||
case D3DFMT_A32B32G32R32F:
|
case D3DFMT_A32B32G32R32F:
|
||||||
@ -900,11 +900,11 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = frame->SetPixelFormat( &targetGuid );
|
hr = frame->SetPixelFormat(&targetGuid);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if ( targetFormat && memcmp( targetFormat, &targetGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (targetFormat && memcmp(targetFormat, &targetGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Requested output pixel format is not supported by the WIC codec
|
// Requested output pixel format is not supported by the WIC codec
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
@ -912,23 +912,23 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
|
|
||||||
// Encode WIC metadata
|
// Encode WIC metadata
|
||||||
ComPtr<IWICMetadataQueryWriter> metawriter;
|
ComPtr<IWICMetadataQueryWriter> metawriter;
|
||||||
if ( SUCCEEDED( frame->GetMetadataQueryWriter( metawriter.GetAddressOf() ) ) )
|
if (SUCCEEDED(frame->GetMetadataQueryWriter(metawriter.GetAddressOf())))
|
||||||
{
|
{
|
||||||
PROPVARIANT value;
|
PROPVARIANT value;
|
||||||
PropVariantInit( &value );
|
PropVariantInit(&value);
|
||||||
|
|
||||||
value.vt = VT_LPSTR;
|
value.vt = VT_LPSTR;
|
||||||
value.pszVal = const_cast<char*>("DirectXTK");
|
value.pszVal = const_cast<char*>("DirectXTK");
|
||||||
|
|
||||||
if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 )
|
if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0)
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"/tEXt/{str=Software}", &value );
|
(void)metawriter->SetMetadataByName(L"/tEXt/{str=Software}", &value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Set Software name
|
// Set Software name
|
||||||
(void)metawriter->SetMetadataByName( L"System.ApplicationName", &value );
|
(void)metawriter->SetMetadataByName(L"System.ApplicationName", &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -944,44 +944,44 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( memcmp( &targetGuid, &pfGuid, sizeof(WICPixelFormatGUID) ) != 0 )
|
if (memcmp(&targetGuid, &pfGuid, sizeof(WICPixelFormatGUID)) != 0)
|
||||||
{
|
{
|
||||||
// Conversion required to write
|
// Conversion required to write
|
||||||
ComPtr<IWICBitmap> source;
|
ComPtr<IWICBitmap> source;
|
||||||
hr = pWIC->CreateBitmapFromMemory(desc.Width, desc.Height, pfGuid,
|
hr = pWIC->CreateBitmapFromMemory(desc.Width, desc.Height, pfGuid,
|
||||||
static_cast<UINT>(lockedRect.Pitch), static_cast<UINT>(imageSize),
|
static_cast<UINT>(lockedRect.Pitch), static_cast<UINT>(imageSize),
|
||||||
static_cast<BYTE*>(lockedRect.pBits), source.GetAddressOf());
|
static_cast<BYTE*>(lockedRect.pBits), source.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pSource->UnlockRect();
|
pSource->UnlockRect();
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IWICFormatConverter> FC;
|
ComPtr<IWICFormatConverter> FC;
|
||||||
hr = pWIC->CreateFormatConverter( FC.GetAddressOf() );
|
hr = pWIC->CreateFormatConverter(FC.GetAddressOf());
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pSource->UnlockRect();
|
pSource->UnlockRect();
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL canConvert = FALSE;
|
BOOL canConvert = FALSE;
|
||||||
hr = FC->CanConvert( pfGuid, targetGuid, &canConvert );
|
hr = FC->CanConvert(pfGuid, targetGuid, &canConvert);
|
||||||
if ( FAILED(hr) || !canConvert )
|
if (FAILED(hr) || !canConvert)
|
||||||
{
|
{
|
||||||
pSource->UnlockRect();
|
pSource->UnlockRect();
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = FC->Initialize( source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut );
|
hr = FC->Initialize(source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut);
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
pSource->UnlockRect();
|
pSource->UnlockRect();
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
WICRect rect = { 0, 0, static_cast<INT>( desc.Width ), static_cast<INT>( desc.Height ) };
|
WICRect rect = { 0, 0, static_cast<INT>(desc.Width), static_cast<INT>(desc.Height) };
|
||||||
hr = frame->WriteSource( FC.Get(), &rect );
|
hr = frame->WriteSource(FC.Get(), &rect);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -997,11 +997,11 @@ HRESULT DirectX::SaveWICTextureToFile(
|
|||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = frame->Commit();
|
hr = frame->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = encoder->Commit();
|
hr = encoder->Commit();
|
||||||
if ( FAILED(hr) )
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
delonfail.clear();
|
delonfail.clear();
|
||||||
|
@ -346,7 +346,7 @@ namespace
|
|||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
HRESULT CreateTextureFromWIC(_In_ ID3D11Device* d3dDevice,
|
HRESULT CreateTextureFromWIC(_In_ ID3D11Device* d3dDevice,
|
||||||
_In_opt_ ID3D11DeviceContext* d3dContext,
|
_In_opt_ ID3D11DeviceContext* d3dContext,
|
||||||
_In_ IWICBitmapFrameDecode *frame,
|
_In_ IWICBitmapFrameDecode* frame,
|
||||||
_In_ size_t maxsize,
|
_In_ size_t maxsize,
|
||||||
_In_ D3D11_USAGE usage,
|
_In_ D3D11_USAGE usage,
|
||||||
_In_ unsigned int bindFlags,
|
_In_ unsigned int bindFlags,
|
||||||
|
@ -259,7 +259,7 @@ namespace
|
|||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
HRESULT CreateTextureFromWIC(
|
HRESULT CreateTextureFromWIC(
|
||||||
_In_ LPDIRECT3DDEVICE9 device,
|
_In_ LPDIRECT3DDEVICE9 device,
|
||||||
_In_ IWICBitmapFrameDecode *frame,
|
_In_ IWICBitmapFrameDecode* frame,
|
||||||
_In_ size_t maxsize,
|
_In_ size_t maxsize,
|
||||||
_In_ unsigned int loadFlags,
|
_In_ unsigned int loadFlags,
|
||||||
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept
|
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept
|
||||||
|
Loading…
x
Reference in New Issue
Block a user