]> git.cworth.org Git - apitrace/blob - thirdparty/directxtex/DirectXTex/DirectXTex.inl
thirdparty/directxtex: Import DirectXTex library.
[apitrace] / thirdparty / directxtex / DirectXTex / DirectXTex.inl
1 //-------------------------------------------------------------------------------------
2 // DirectXTex.inl
3 //  
4 // DirectX Texture Library
5 //
6 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
7 // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
8 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
9 // PARTICULAR PURPOSE.
10 //
11 // Copyright (c) Microsoft Corporation. All rights reserved.
12 //
13 // http://go.microsoft.com/fwlink/?LinkId=248926
14 //-------------------------------------------------------------------------------------
15
16 #if defined(_MSC_VER) && (_MSC_VER > 1000)
17 #pragma once
18 #endif
19
20 //=====================================================================================
21 // DXGI Format Utilities
22 //=====================================================================================
23
24 inline bool IsValid( DXGI_FORMAT fmt )
25 {
26 #ifdef DXGI_1_2_FORMATS
27     return ( static_cast<size_t>(fmt) >= 1 && static_cast<size_t>(fmt) <= 115 );
28 #else
29     return ( static_cast<size_t>(fmt) >= 1 && static_cast<size_t>(fmt) <= 99 );
30 #endif
31 }
32
33 inline bool IsCompressed( DXGI_FORMAT fmt )
34 {
35     switch ( fmt )
36     {
37     case DXGI_FORMAT_BC1_TYPELESS:
38     case DXGI_FORMAT_BC1_UNORM:
39     case DXGI_FORMAT_BC1_UNORM_SRGB:
40     case DXGI_FORMAT_BC2_TYPELESS:
41     case DXGI_FORMAT_BC2_UNORM:
42     case DXGI_FORMAT_BC2_UNORM_SRGB:
43     case DXGI_FORMAT_BC3_TYPELESS:
44     case DXGI_FORMAT_BC3_UNORM:
45     case DXGI_FORMAT_BC3_UNORM_SRGB:
46     case DXGI_FORMAT_BC4_TYPELESS:
47     case DXGI_FORMAT_BC4_UNORM:
48     case DXGI_FORMAT_BC4_SNORM:
49     case DXGI_FORMAT_BC5_TYPELESS:
50     case DXGI_FORMAT_BC5_UNORM:
51     case DXGI_FORMAT_BC5_SNORM:
52     case DXGI_FORMAT_BC6H_TYPELESS:
53     case DXGI_FORMAT_BC6H_UF16:
54     case DXGI_FORMAT_BC6H_SF16:
55     case DXGI_FORMAT_BC7_TYPELESS:
56     case DXGI_FORMAT_BC7_UNORM:
57     case DXGI_FORMAT_BC7_UNORM_SRGB:
58         return true;
59
60     default:
61         return false;
62     }
63 }
64
65 inline bool IsPacked( DXGI_FORMAT fmt )
66 {
67     return ( (fmt == DXGI_FORMAT_R8G8_B8G8_UNORM) || (fmt == DXGI_FORMAT_G8R8_G8B8_UNORM) );
68 }
69
70 inline bool IsVideo( DXGI_FORMAT fmt )
71 {
72 #ifdef DXGI_1_2_FORMATS
73     switch ( fmt )
74     {
75     case DXGI_FORMAT_AYUV:
76     case DXGI_FORMAT_Y410:
77     case DXGI_FORMAT_Y416:
78     case DXGI_FORMAT_NV12:
79     case DXGI_FORMAT_P010:
80     case DXGI_FORMAT_P016:
81     case DXGI_FORMAT_YUY2:
82     case DXGI_FORMAT_Y210:
83     case DXGI_FORMAT_Y216:
84     case DXGI_FORMAT_NV11:
85         // These video formats can be used with the 3D pipeline through special view mappings
86         return true;
87
88     case DXGI_FORMAT_420_OPAQUE:
89     case DXGI_FORMAT_AI44:
90     case DXGI_FORMAT_IA44:
91     case DXGI_FORMAT_P8:
92     case DXGI_FORMAT_A8P8:
93         // These are limited use video formats not usable in any way by the 3D pipeline
94         return true;
95
96     default:
97         return false;
98     }
99 #else // !DXGI_1_2_FORMATS
100     UNREFERENCED_PARAMETER(fmt);
101     return false;
102 #endif
103 }
104
105 inline bool IsSRGB( DXGI_FORMAT fmt )
106 {
107     switch( fmt )
108     {
109     case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
110     case DXGI_FORMAT_BC1_UNORM_SRGB:
111     case DXGI_FORMAT_BC2_UNORM_SRGB:
112     case DXGI_FORMAT_BC3_UNORM_SRGB:
113     case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
114     case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
115     case DXGI_FORMAT_BC7_UNORM_SRGB:
116         return true;
117
118     default:
119         return false;
120     }
121 }
122
123 inline bool IsTypeless( DXGI_FORMAT fmt )
124 {
125     switch( fmt )
126     {
127     case DXGI_FORMAT_R32G32B32A32_TYPELESS:
128     case DXGI_FORMAT_R32G32B32_TYPELESS:
129     case DXGI_FORMAT_R16G16B16A16_TYPELESS:
130     case DXGI_FORMAT_R32G32_TYPELESS:
131     case DXGI_FORMAT_R32G8X24_TYPELESS:
132     case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
133     case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
134     case DXGI_FORMAT_R10G10B10A2_TYPELESS:
135     case DXGI_FORMAT_R8G8B8A8_TYPELESS:
136     case DXGI_FORMAT_R16G16_TYPELESS:
137     case DXGI_FORMAT_R32_TYPELESS:
138     case DXGI_FORMAT_R24G8_TYPELESS:
139     case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
140     case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
141     case DXGI_FORMAT_R8G8_TYPELESS:
142     case DXGI_FORMAT_R16_TYPELESS:
143     case DXGI_FORMAT_R8_TYPELESS:
144     case DXGI_FORMAT_BC1_TYPELESS:
145     case DXGI_FORMAT_BC2_TYPELESS:
146     case DXGI_FORMAT_BC3_TYPELESS:
147     case DXGI_FORMAT_BC4_TYPELESS:
148     case DXGI_FORMAT_BC5_TYPELESS:
149     case DXGI_FORMAT_B8G8R8A8_TYPELESS:
150     case DXGI_FORMAT_B8G8R8X8_TYPELESS:
151     case DXGI_FORMAT_BC6H_TYPELESS:
152     case DXGI_FORMAT_BC7_TYPELESS:
153         return true;
154
155     default:
156         return false;
157     }
158 }
159
160 inline size_t ComputeScanlines( _In_ DXGI_FORMAT fmt, _In_ size_t height )
161 {
162     switch ( fmt )
163     {
164     case DXGI_FORMAT_BC1_TYPELESS:
165     case DXGI_FORMAT_BC1_UNORM:
166     case DXGI_FORMAT_BC1_UNORM_SRGB:
167     case DXGI_FORMAT_BC2_TYPELESS:
168     case DXGI_FORMAT_BC2_UNORM:
169     case DXGI_FORMAT_BC2_UNORM_SRGB:
170     case DXGI_FORMAT_BC3_TYPELESS:
171     case DXGI_FORMAT_BC3_UNORM:
172     case DXGI_FORMAT_BC3_UNORM_SRGB:
173     case DXGI_FORMAT_BC4_TYPELESS:
174     case DXGI_FORMAT_BC4_UNORM:
175     case DXGI_FORMAT_BC4_SNORM:
176     case DXGI_FORMAT_BC5_TYPELESS:
177     case DXGI_FORMAT_BC5_UNORM:
178     case DXGI_FORMAT_BC5_SNORM:
179     case DXGI_FORMAT_BC6H_TYPELESS:
180     case DXGI_FORMAT_BC6H_UF16:
181     case DXGI_FORMAT_BC6H_SF16:
182     case DXGI_FORMAT_BC7_TYPELESS:
183     case DXGI_FORMAT_BC7_UNORM:
184     case DXGI_FORMAT_BC7_UNORM_SRGB:
185         return std::max<size_t>( 1, (height + 3) / 4 );
186
187     default:
188         return height;
189     }
190 }
191
192 //=====================================================================================
193 // Image I/O
194 //=====================================================================================
195 inline HRESULT SaveToDDSMemory( const Image& image, DWORD flags, Blob& blob )
196 {
197     TexMetadata mdata;
198     memset( &mdata, 0, sizeof(mdata) );
199     mdata.width = image.width;
200     mdata.height = image.height;
201     mdata.depth = 1;
202     mdata.arraySize = 1;
203     mdata.mipLevels = 1;
204     mdata.format = image.format;
205     mdata.dimension = TEX_DIMENSION_TEXTURE2D;
206
207     return SaveToDDSMemory( &image, 1, mdata, flags, blob );
208 }
209
210 inline HRESULT SaveToDDSFile( const Image& image, DWORD flags, LPCWSTR szFile )
211 {
212     TexMetadata mdata;
213     memset( &mdata, 0, sizeof(mdata) );
214     mdata.width = image.width;
215     mdata.height = image.height;
216     mdata.depth = 1;
217     mdata.arraySize = 1;
218     mdata.mipLevels = 1;
219     mdata.format = image.format;
220     mdata.dimension = TEX_DIMENSION_TEXTURE2D;
221
222     return SaveToDDSFile( &image, 1, mdata, flags, szFile );
223 }