#include <assert.h>
+#include <iostream>
+
#include "image.hpp"
#include "dxgistate.hpp"
static DXGI_FORMAT
-ChooseConversionFormat(DXGI_FORMAT Format)
+ChooseConversionFormat(DXGI_FORMAT Format, unsigned &numChannels, image::ChannelType &channelType)
{
+ numChannels = 4;
+ channelType = image::TYPE_UNORM8;
+
switch (Format) {
// Float
case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
case DXGI_FORMAT_BC6H_UF16:
case DXGI_FORMAT_BC6H_SF16:
- return DXGI_FORMAT_R8G8B8A8_UNORM;
+ channelType = image::TYPE_FLOAT;
+ return DXGI_FORMAT_R32G32B32A32_FLOAT;
// Unsigned normalized
case DXGI_FORMAT_R16G16B16A16_UNORM:
case DXGI_FORMAT_D24_UNORM_S8_UINT:
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
case DXGI_FORMAT_D16_UNORM:
- return DXGI_FORMAT_R8G8B8A8_UNORM;
+ numChannels = 1;
+ channelType = image::TYPE_FLOAT;
+ return DXGI_FORMAT_D32_FLOAT;
// Typeless
case DXGI_FORMAT_UNKNOWN:
DirectX::Rect rect(0, 0, Width, Height);
+ hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ assert(SUCCEEDED(hr));
+ if (FAILED(hr)) {
+ return hr;
+ }
+
if (SrcFormat != DstFormat) {
DirectX::ScratchImage ScratchImage;
ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1);
- hr = DirectX::Convert(SrcImage, DstFormat, DirectX::TEX_FILTER_DEFAULT, 0.0f, ScratchImage);
+ if (DirectX::IsCompressed(SrcFormat)) {
+ hr = DirectX::Decompress(SrcImage, DstFormat, ScratchImage);
+ } else {
+ hr = DirectX::Convert(SrcImage, DstFormat, DirectX::TEX_FILTER_DEFAULT, 0.0f, ScratchImage);
+ }
+
if (SUCCEEDED(hr)) {
hr = CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0);
}
UINT SrcPitch,
UINT Width, UINT Height)
{
+ unsigned numChannels;
+ image::ChannelType channelType;
- DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat);
+ DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat, numChannels, channelType);
if (DstFormat == DXGI_FORMAT_UNKNOWN) {
return NULL;
}
- image::Image *image = new image::Image(Width, Height, 4);
+ image::Image *image = new image::Image(Width, Height, numChannels, false, channelType);
if (!image) {
return NULL;
}
image->start(), image->stride(),
Width, Height);
if (FAILED(hr)) {
+ std::cerr << "warning: failed to convert from format " << SrcFormat << " to format " << DstFormat << "\n";
delete image;
image = NULL;
}