-
Notifications
You must be signed in to change notification settings - Fork 17
/
dds.cpp
133 lines (113 loc) · 3.36 KB
/
dds.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "stdafx.h"
#include "dds.h"
unsigned const DDS_MAGIC = 0x20534444; // "DDS "
#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT
#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT
#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH
#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH
#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE
#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE
#define DDS_SURFACE_FLAGS_MIPMAP 0x00400008 // DDSCAPS_COMPLEX | DDSCAPS_MIPMAP
#define DDS_SURFACE_FLAGS_CUBEMAP 0x00000008 // DDSCAPS_COMPLEX
#define DDS_FOURCC 0x00000004 // DDPF_FOURCC
#define DDS_RGB 0x00000040 // DDPF_RGB
#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS
#define DDS_ALPHA 0x00000002 // DDPF_ALPHA
#define DDS_LUM 0x00020000 // DDPF_LUM
struct DDS_PIXELFORMAT
{
uint32_t dwSize;
uint32_t dwFlags;
uint32_t dwFourCC;
uint32_t dwRGBBitCount;
uint32_t dwRBitMask;
uint32_t dwGBitMask;
uint32_t dwBBitMask;
uint32_t dwABitMask;
};
#ifndef MAKEFOURCC
# define MAKEFOURCC(ch0, ch1, ch2, ch3) ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 ))
#endif
DDS_PIXELFORMAT const DDSPF_DX10 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','1','0'), 0, 0, 0, 0, 0 };
DDS_PIXELFORMAT const DDSPF_R16G16B16A16_FLOAT = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, 113, 0, 0, 0, 0, 0 };
DDS_PIXELFORMAT const DDSPF_BC6H = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, 808540228, 0, 0, 0, 0, 0 };
struct DDS_HEADER
{
uint32_t dwMagic;
uint32_t dwSize;
uint32_t dwFlags;
uint32_t dwHeight;
uint32_t dwWidth;
uint32_t dwPitchOrLinearSize;
uint32_t dwDepth;
uint32_t dwMipMapCount;
uint32_t dwReserved1[11];
DDS_PIXELFORMAT ddspf;
uint32_t dwSurfaceFlags;
uint32_t dwCubemapFlags;
uint32_t dwReserved2[3];
};
struct DDS_HEADER_DXT10
{
uint32_t dxgiFormat;
uint32_t resourceDimension;
uint32_t miscFlag;
uint32_t arraySize;
uint32_t reserved;
};
bool DDS::LoadA16B16G16R16F(char const* filename, SImage& img)
{
img.m_width = 0;
img.m_height = 0;
img.m_data = nullptr;
img.m_dataSize = 0;
FILE* f = nullptr;
fopen_s(&f, filename, "rb");
if (!f)
{
return false;
}
DDS_HEADER hdr;
fread(&hdr, sizeof(hdr), 1, f);
if (hdr.dwMagic == DDS_MAGIC && memcmp(&hdr.ddspf, &DDSPF_R16G16B16A16_FLOAT, sizeof(hdr.ddspf)) == 0)
{
img.m_dataSize = hdr.dwWidth * hdr.dwHeight * 8;
img.m_data = new uint8_t[img.m_dataSize];
img.m_width = hdr.dwWidth;
img.m_height = hdr.dwHeight;
fread(img.m_data, img.m_dataSize, 1, f);
fclose(f);
return true;
}
fclose(f);
return false;
}
bool DDS::LoadBC6H(char const* filename, SImage& img)
{
img.m_width = 0;
img.m_height = 0;
img.m_data = nullptr;
img.m_dataSize = 0;
FILE* f = nullptr;
fopen_s(&f, filename, "rb");
if (!f)
{
return false;
}
DDS_HEADER hdr;
fread(&hdr, sizeof(hdr), 1, f);
if (hdr.dwMagic == DDS_MAGIC && memcmp(&hdr.ddspf, &DDSPF_DX10, sizeof(hdr.ddspf)) == 0)
{
DDS_HEADER_DXT10 hdrDX10;
fread(&hdrDX10, sizeof(hdrDX10), 1, f);
img.m_dataSize = hdr.dwWidth * hdr.dwHeight;
img.m_data = new uint8_t[img.m_dataSize];
img.m_width = hdr.dwWidth;
img.m_height = hdr.dwHeight;
fread(img.m_data, img.m_dataSize, 1, f);
fclose(f);
return true;
}
fclose(f);
return false;
}