#include <assert.h>
+#include <iostream>
+
#include "image.hpp"
#include "dxgistate.hpp"
static DXGI_FORMAT
-ChooseConversionFormat(DXGI_FORMAT Format)
+ChooseConversionFormat(DXGI_FORMAT Format, image::ChannelType &channelType)
{
+ 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:
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)
{
+ image::ChannelType channelType;
- DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat);
+ DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat, 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, 4, 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;
}