Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DirectXTexP.h
Go to the documentation of this file.
1 //-------------------------------------------------------------------------------------
2 // DirectXTexp.h
3 //
4 // DirectX Texture Library - Private header
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 #define NOMINMAX
21 #include <windows.h>
22 #include <directxmath.h>
23 #include <directxpackedvector.h>
24 #include <assert.h>
25 
26 #include <malloc.h>
27 #include <memory>
28 
29 #include <vector>
30 
31 #include <stdlib.h>
32 #include <search.h>
33 
34 #include <ole2.h>
35 
36 #include "directxtex.h"
37 
38 // VS 2010's stdint.h conflicts with intsafe.h
39 #pragma warning(push)
40 #pragma warning(disable : 4005)
41 #include <wincodec.h>
42 #include <wrl.h>
43 #pragma warning(pop)
44 
45 #include "scoped.h"
46 
47 struct IWICImagingFactory;
48 
49 #define TEX_FILTER_MASK 0xF00000
50 
51 namespace DirectX
52 {
53  //---------------------------------------------------------------------------------
54  // WIC helper functions
55  DXGI_FORMAT _WICToDXGI( _In_ const GUID& guid );
56  bool _DXGIToWIC( _In_ DXGI_FORMAT format, _Out_ GUID& guid, _In_ bool ignoreRGBvsBGR = false );
57 
58  DWORD _CheckWICColorSpace( _In_ const GUID& sourceGUID, _In_ const GUID& targetGUID );
59 
60  IWICImagingFactory* _GetWIC();
61 
62  bool _IsWIC2();
63 
64  inline WICBitmapDitherType _GetWICDither( _In_ DWORD flags )
65  {
66  static_assert( TEX_FILTER_DITHER == 0x10000, "TEX_FILTER_DITHER* flag values don't match mask" );
67 
68  static_assert( TEX_FILTER_DITHER == WIC_FLAGS_DITHER, "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*" );
69  static_assert( TEX_FILTER_DITHER_DIFFUSION == WIC_FLAGS_DITHER_DIFFUSION, "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*" );
70 
71  switch( flags & 0xF0000 )
72  {
73  case TEX_FILTER_DITHER:
74  return WICBitmapDitherTypeOrdered4x4;
75 
77  return WICBitmapDitherTypeErrorDiffusion;
78 
79  default:
80  return WICBitmapDitherTypeNone;
81  }
82  }
83 
84  inline WICBitmapInterpolationMode _GetWICInterp( _In_ DWORD flags )
85  {
86  static_assert( TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MASK" );
87 
88  static_assert( TEX_FILTER_POINT == WIC_FLAGS_FILTER_POINT, "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*" );
89  static_assert( TEX_FILTER_LINEAR == WIC_FLAGS_FILTER_LINEAR, "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*" );
90  static_assert( TEX_FILTER_CUBIC == WIC_FLAGS_FILTER_CUBIC, "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*" );
91  static_assert( TEX_FILTER_FANT == WIC_FLAGS_FILTER_FANT, "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*" );
92 
93  switch( flags & TEX_FILTER_MASK )
94  {
95  case TEX_FILTER_POINT:
96  return WICBitmapInterpolationModeNearestNeighbor;
97 
98  case TEX_FILTER_LINEAR:
99  return WICBitmapInterpolationModeLinear;
100 
101  case TEX_FILTER_CUBIC:
102  return WICBitmapInterpolationModeCubic;
103 
104  case TEX_FILTER_FANT:
105  default:
106  return WICBitmapInterpolationModeFant;
107  }
108  }
109 
110  //---------------------------------------------------------------------------------
111  // Image helper functions
112  void _DetermineImageArray( _In_ const TexMetadata& metadata, _In_ DWORD cpFlags,
113  _Out_ size_t& nImages, _Out_ size_t& pixelSize );
114 
115  _Success_(return != false)
117  _In_ const TexMetadata& metadata, _In_ DWORD cpFlags,
118  _Out_writes_(nImages) Image* images, _In_ size_t nImages );
119 
120  //---------------------------------------------------------------------------------
121  // Conversion helper functions
122 
124  {
126  TEXP_SCANLINE_SETALPHA = 0x1, // Set alpha channel to known opaque value
127  TEXP_SCANLINE_LEGACY = 0x2, // Enables specific legacy format conversion cases
128  };
129 
131  {
132  CONVF_FLOAT = 0x1,
133  CONVF_UNORM = 0x2,
134  CONVF_UINT = 0x4,
135  CONVF_SNORM = 0x8,
136  CONVF_SINT = 0x10,
137  CONVF_DEPTH = 0x20,
140  CONVF_BGR = 0x100,
141  CONVF_XR = 0x200,
142  CONVF_PACKED = 0x400,
143  CONVF_BC = 0x800,
144  CONVF_YUV = 0x1000,
145  CONVF_R = 0x10000,
146  CONVF_G = 0x20000,
147  CONVF_B = 0x40000,
148  CONVF_A = 0x80000,
149  CONVF_RGB_MASK = 0x70000,
150  CONVF_RGBA_MASK = 0xF0000,
151  };
152 
153  DWORD _GetConvertFlags( _In_ DXGI_FORMAT format );
154 
155  void _CopyScanline( _When_(pDestination == pSource, _Inout_updates_bytes_(outSize))
156  _When_(pDestination != pSource, _Out_writes_bytes_(outSize))
157  LPVOID pDestination, _In_ size_t outSize,
158  _In_reads_bytes_(inSize) LPCVOID pSource, _In_ size_t inSize,
159  _In_ DXGI_FORMAT format, _In_ DWORD flags );
160 
161  void _SwizzleScanline( _When_(pDestination == pSource, _In_)
162  _When_(pDestination != pSource, _Out_writes_bytes_(outSize))
163  LPVOID pDestination, _In_ size_t outSize,
164  _In_reads_bytes_(inSize) LPCVOID pSource, _In_ size_t inSize,
165  _In_ DXGI_FORMAT format, _In_ DWORD flags );
166 
167  _Success_(return != false)
168  bool _ExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestination, _In_ size_t outSize,
169  _In_ DXGI_FORMAT outFormat,
170  _In_reads_bytes_(inSize) LPCVOID pSource, _In_ size_t inSize,
171  _In_ DXGI_FORMAT inFormat, _In_ DWORD flags );
172 
173  _Success_(return != false)
174  bool _LoadScanline( _Out_writes_(count) XMVECTOR* pDestination, _In_ size_t count,
175  _In_reads_bytes_(size) LPCVOID pSource, _In_ size_t size, _In_ DXGI_FORMAT format );
176 
177  _Success_(return != false)
178  bool _LoadScanlineLinear( _Out_writes_(count) XMVECTOR* pDestination, _In_ size_t count,
179  _In_reads_bytes_(size) LPCVOID pSource, _In_ size_t size, _In_ DXGI_FORMAT format, _In_ DWORD flags );
180 
181  _Success_(return != false)
182  bool _StoreScanline( LPVOID pDestination, _In_ size_t size, _In_ DXGI_FORMAT format,
183  _In_reads_(count) const XMVECTOR* pSource, _In_ size_t count, _In_ float threshold = 0 );
184 
185  _Success_(return != false)
186  bool _StoreScanlineLinear( LPVOID pDestination, _In_ size_t size, _In_ DXGI_FORMAT format,
187  _Inout_updates_all_(count) XMVECTOR* pSource, _In_ size_t count, _In_ DWORD flags );
188 
189  _Success_(return != false)
190  bool _StoreScanlineDither( LPVOID pDestination, _In_ size_t size, _In_ DXGI_FORMAT format,
191  _Inout_updates_all_(count) XMVECTOR* pSource, _In_ size_t count, _In_ float threshold, size_t y, size_t z,
192  _Inout_updates_all_opt_(count+2) XMVECTOR* pDiffusionErrors );
193 
194  HRESULT _ConvertToR32G32B32A32( _In_ const Image& srcImage, _Inout_ ScratchImage& image );
195 
196  HRESULT _ConvertFromR32G32B32A32( _In_ const Image& srcImage, _In_ const Image& destImage );
197  HRESULT _ConvertFromR32G32B32A32( _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _Inout_ ScratchImage& image );
198  HRESULT _ConvertFromR32G32B32A32( _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata,
199  _In_ DXGI_FORMAT format, _Out_ ScratchImage& result );
200 
201  void _ConvertScanline( _Inout_updates_all_(count) XMVECTOR* pBuffer, _In_ size_t count,
202  _In_ DXGI_FORMAT outFormat, _In_ DXGI_FORMAT inFormat, _In_ DWORD flags );
203 
204  //---------------------------------------------------------------------------------
205  // DDS helper functions
206  HRESULT _EncodeDDSHeader( _In_ const TexMetadata& metadata, DWORD flags,
207  _Out_writes_bytes_to_opt_(maxsize, required) LPVOID pDestination, _In_ size_t maxsize, _Out_ size_t& required );
208 
209 }; // namespace
_Use_decl_annotations_ HRESULT _EncodeDDSHeader(const TexMetadata &metadata, DWORD flags, LPVOID pDestination, size_t maxsize, size_t &required)
_In_ size_t _In_ const TexMetadata _In_ DWORD cpFlags
Definition: DirectXTexP.h:116
_Use_decl_annotations_ bool _ExpandScanline(LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat, LPCVOID pSource, size_t inSize, DXGI_FORMAT inFormat, DWORD flags)
_In_ size_t _In_ const TexMetadata _In_ DWORD _In_ size_t nImages
Definition: DirectXTexP.h:118
size_t outSize
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
Definition: DirectXTexP.h:170
void _CopyScanline(_When_(pDestination==pSource, _Inout_updates_bytes_(outSize)) _When_(pDestination!=pSource, _Out_writes_bytes_(outSize)) LPVOID pDestination, _In_ size_t outSize, _In_reads_bytes_(inSize) LPCVOID pSource, _In_ size_t inSize, _In_ DXGI_FORMAT format, _In_ DWORD flags)
_Use_decl_annotations_ HRESULT _ConvertFromR32G32B32A32(const Image &srcImage, const Image &destImage)
_Use_decl_annotations_ HRESULT _ConvertToR32G32B32A32(const Image &srcImage, ScratchImage &image)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float threshold
Definition: DirectXTexP.h:183
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
Definition: DirectXTexP.h:191
_In_ size_t pixelSize
Definition: DirectXTexP.h:116
_Use_decl_annotations_ bool _LoadScanline(XMVECTOR *pDestination, size_t count, LPCVOID pSource, size_t size, DXGI_FORMAT format)
IWICImagingFactory * _GetWIC()
_In_ size_t _In_ const TexMetadata & metadata
Definition: DirectXTexP.h:116
_Use_decl_annotations_ void _ConvertScanline(XMVECTOR *pBuffer, size_t count, DXGI_FORMAT outFormat, DXGI_FORMAT inFormat, DWORD flags)
_In_ size_t count
Definition: DirectXTexP.h:174
_Use_decl_annotations_ void _SwizzleScanline(LPVOID pDestination, size_t outSize, LPCVOID pSource, size_t inSize, DXGI_FORMAT format, DWORD flags)
TEXP_SCANLINE_FLAGS
Definition: DirectXTexP.h:123
_Use_decl_annotations_ DWORD _GetConvertFlags(DXGI_FORMAT format)
bool _IsWIC2()
_In_ size_t _In_ DXGI_FORMAT _Inout_updates_all_(count) XMVECTOR *pSource
size_t _In_ DXGI_FORMAT outFormat
_In_ size_t _In_ const TexMetadata _In_ DWORD _Out_writes_(nImages) Image *images
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT inFormat
size_t _In_ DXGI_FORMAT size_t inSize
_Use_decl_annotations_ void _DetermineImageArray(const TexMetadata &metadata, DWORD cpFlags, size_t &nImages, size_t &pixelSize)
size_t _In_ DXGI_FORMAT _In_reads_bytes_(inSize) LPCVOID pSource
WICBitmapDitherType _GetWICDither(_In_ DWORD flags)
Definition: DirectXTexP.h:64
DWORD _CheckWICColorSpace(_In_ const GUID &sourceGUID, _In_ const GUID &targetGUID)
_In_ size_t _In_ DXGI_FORMAT _In_reads_(count) const XMVECTOR *pSource
_Use_decl_annotations_ bool _LoadScanlineLinear(XMVECTOR *pDestination, size_t count, LPCVOID pSource, size_t size, DXGI_FORMAT format, DWORD flags)
_Use_decl_annotations_ bool _StoreScanlineLinear(LPVOID pDestination, size_t size, DXGI_FORMAT format, XMVECTOR *pSource, size_t count, DWORD flags)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t size_t _Inout_updates_all_opt_(count+2) XMVECTOR *pDiffusionErrors)
return false
DXGI_FORMAT _WICToDXGI(_In_ const GUID &guid)
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
Definition: DirectXTexP.h:175
_Success_(return!=false) static bool _LegacyExpandScanline(_Out_writes_bytes_(outSize) LPVOID pDestination
#define TEX_FILTER_MASK
Definition: DirectXTexP.h:49
bool _DXGIToWIC(_In_ DXGI_FORMAT format, _Out_ GUID &guid, _In_ bool ignoreRGBvsBGR=false)
_In_ size_t _In_ size_t size
Definition: DirectXTexP.h:175
_Use_decl_annotations_ bool _SetupImageArray(uint8_t *pMemory, size_t pixelSize, const TexMetadata &metadata, DWORD cpFlags, Image *images, size_t nImages)
_Use_decl_annotations_ bool _StoreScanline(LPVOID pDestination, size_t size, DXGI_FORMAT format, const XMVECTOR *pSource, size_t count, float threshold)
WICBitmapInterpolationMode _GetWICInterp(_In_ DWORD flags)
Definition: DirectXTexP.h:84
_Use_decl_annotations_ bool _StoreScanlineDither(LPVOID pDestination, size_t size, DXGI_FORMAT format, XMVECTOR *pSource, size_t count, float threshold, size_t y, size_t z, XMVECTOR *pDiffusionErrors)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t size_t z
Definition: DirectXTexP.h:191