DDSHeader.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Math/Color.h>
  10. #include <AzCore/std/algorithm.h>
  11. #include <ImageProcessing_Traits_Platform.h>
  12. #include <ImageBuilderBaseType.h>
  13. #define IMAGE_BUIDER_MAKEFOURCC(ch0, ch1, ch2, ch3) \
  14. ((AZ::u32)(AZ::u8)(ch0) | ((AZ::u32)(AZ::u8)(ch1) << 8) | \
  15. ((AZ::u32)(AZ::u8)(ch2) << 16) | ((AZ::u32)(AZ::u8)(ch3) << 24))
  16. // This header defines constants and structures that are useful when parsing
  17. // DDS files. DDS files were originally designed to use several structures
  18. // and constants that are native to DirectDraw and are defined in ddraw.h,
  19. // such as DDSURFACEDESC2 and DDSCAPS2. This file defines similar
  20. // (compatible) constants and structures so that one can use DDS files
  21. // without needing to include ddraw.h.
  22. //Needed to write out DDS files on Mac
  23. #if AZ_TRAIT_IMAGEPROCESSING_DEFINE_DIRECT3D_CONSTANTS
  24. #define DDPF_ALPHAPIXELS 0x00000001 // Texture contains alpha data
  25. #define DDPF_ALPHA 0x00000002 // For alpha channel only uncompressed data
  26. #define DDPF_FOURCC 0x00000004 // Texture contains compressed RGB data
  27. #define DDPF_RGB 0x00000040 // Texture contains uncompressed RGB data
  28. #define DDPF_YUV 0x00000200 // For YUV uncompressed data
  29. #define DDPF_LUMINANCE 0x00020000 // For single channel color uncompressed data
  30. #define DDSCAPS_COMPLEX 0x00000008 // Must be used on any file that contains more than one surface
  31. #define DDSCAPS_MIPMAP 0x00400000 // Should be used for a mipmap
  32. #define DDSCAPS_TEXTURE 0x00001000 // Required
  33. #endif
  34. #define DDS_FOURCC 0x00000004 // DDPF_FOURCC
  35. #define DDS_RGB 0x00000040 // DDPF_RGB
  36. #define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE
  37. #define DDS_SIGNED 0x00080000 // DDPF_SIGNED; only used for lumbyard dds
  38. #define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS
  39. #define DDS_LUMINANCEA 0x00020001 // DDS_LUMINANCE | DDPF_ALPHAPIXELS
  40. #define DDS_A 0x00000001 // DDPF_ALPHAPIXELS
  41. #define DDS_A_ONLY 0x00000002 // DDPF_ALPHA
  42. #define DDS_FOURCC_A16B16G16R16 0x00000024 // FOURCC A16B16G16R16
  43. #define DDS_FOURCC_V16U16 0x00000040 // FOURCC V16U16
  44. #define DDS_FOURCC_Q16W16V16U16 0x0000006E // FOURCC Q16W16V16U16
  45. #define DDS_FOURCC_R16F 0x0000006F // FOURCC R16F
  46. #define DDS_FOURCC_G16R16F 0x00000070 // FOURCC G16R16F
  47. #define DDS_FOURCC_A16B16G16R16F 0x00000071 // FOURCC A16B16G16R16F
  48. #define DDS_FOURCC_R32F 0x00000072 // FOURCC R32F
  49. #define DDS_FOURCC_G32R32F 0x00000073 // FOURCC G32R32F
  50. #define DDS_FOURCC_A32B32G32R32F 0x00000074 // FOURCC A32B32G32R32F
  51. #define DDSD_CAPS 0x00000001l // default
  52. #define DDSD_PIXELFORMAT 0x00001000l
  53. #define DDSD_WIDTH 0x00000004l
  54. #define DDSD_HEIGHT 0x00000002l
  55. #define DDSD_LINEARSIZE 0x00080000l
  56. #define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT
  57. #define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT
  58. #define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH
  59. #define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH
  60. #define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE
  61. #define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE
  62. #define DDS_SURFACE_FLAGS_MIPMAP 0x00400008 // DDSCAPS_COMPLEX | DDSCAPS_MIPMAP
  63. #define DDS_SURFACE_FLAGS_CUBEMAP 0x00000008 // DDSCAPS_COMPLEX
  64. #define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP
  65. #define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX
  66. #define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX
  67. #define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY
  68. #define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY
  69. #define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ
  70. #define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ
  71. #define DDS_CUBEMAP_ALLFACES (DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX | \
  72. DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY | \
  73. DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ)
  74. #define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME
  75. #define DDS_RESF1_NORMALMAP 0x01000000
  76. #define DDS_RESF1_DSDT 0x02000000
  77. namespace ImageProcessingAtom
  78. {
  79. const static AZ::u32 FOURCC_DX10 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', '1', '0');
  80. const static AZ::u32 FOURCC_DDS = IMAGE_BUIDER_MAKEFOURCC('D', 'D', 'S', ' ');
  81. const static AZ::u32 FOURCC_FYRC = IMAGE_BUIDER_MAKEFOURCC('F', 'Y', 'R', 'C');
  82. //The values of each elements in this enum should be same as ITexture ETEX_TileMode enum.
  83. enum DDS_TileMode : AZ::u8
  84. {
  85. eTM_None = 0,
  86. eTM_LinearPadded,
  87. eTM_Optimal,
  88. };
  89. struct DDS_PIXELFORMAT
  90. {
  91. AZ::u32 dwSize;
  92. AZ::u32 dwFlags;
  93. AZ::u32 dwFourCC;
  94. AZ::u32 dwRGBBitCount;
  95. AZ::u32 dwRBitMask;
  96. AZ::u32 dwGBitMask;
  97. AZ::u32 dwBBitMask;
  98. AZ::u32 dwABitMask;
  99. const bool operator == (const DDS_PIXELFORMAT& fmt) const
  100. {
  101. return dwFourCC == fmt.dwFourCC &&
  102. dwFlags == fmt.dwFlags &&
  103. dwRGBBitCount == fmt.dwRGBBitCount &&
  104. dwRBitMask == fmt.dwRBitMask &&
  105. dwGBitMask == fmt.dwGBitMask &&
  106. dwBBitMask == fmt.dwBBitMask &&
  107. dwABitMask == fmt.dwABitMask &&
  108. dwSize == fmt.dwSize;
  109. }
  110. };
  111. struct DDS_HEADER_DXT10
  112. {
  113. // we're unable to use native enums, so we use AZ::u32 instead.
  114. AZ::u32 /*DXGI_FORMAT*/ dxgiFormat;
  115. AZ::u32 /*D3D10_RESOURCE_DIMENSION*/ resourceDimension;
  116. AZ::u32 miscFlag;
  117. AZ::u32 arraySize;
  118. AZ::u32 reserved;
  119. };
  120. // Dds header for O3DE dds format.
  121. // It has same size as standard dds header but uses several reserved slots for customized information
  122. struct DDS_HEADER_LEGACY
  123. {
  124. AZ::u32 dwSize;
  125. AZ::u32 dwHeaderFlags;
  126. AZ::u32 dwHeight;
  127. AZ::u32 dwWidth;
  128. AZ::u32 dwPitchOrLinearSize;
  129. AZ::u32 dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags
  130. AZ::u32 dwMipMapCount;
  131. AZ::u32 dwAlphaBitDepth;
  132. AZ::u32 dwReserved1; // Image flags
  133. float fAvgBrightness; // Average top mip brightness. Could be f16/half
  134. float cMinColor[4];
  135. float cMaxColor[4];
  136. DDS_PIXELFORMAT ddspf;
  137. AZ::u32 dwSurfaceFlags;
  138. AZ::u32 dwCubemapFlags;
  139. AZ::u8 bNumPersistentMips;
  140. AZ::u8 tileMode; //DDS_TileMode
  141. AZ::u8 bReserved2[6];
  142. AZ::u32 dwTextureStage;
  143. inline const bool IsValid() const { return sizeof(*this) == dwSize; }
  144. inline const bool IsDX10Ext() const { return ddspf.dwFourCC == FOURCC_DX10; }
  145. inline const uint32 GetMipCount() const { return AZStd::max(1u, (uint32)dwMipMapCount); }
  146. inline const size_t GetFullHeaderSize() const
  147. {
  148. if (IsDX10Ext())
  149. {
  150. return sizeof(DDS_HEADER_LEGACY) + sizeof(DDS_HEADER_DXT10);
  151. }
  152. return sizeof(DDS_HEADER_LEGACY);
  153. }
  154. };
  155. // description of file header
  156. struct DDS_FILE_DESC_LEGACY
  157. {
  158. AZ::u32 dwMagic;
  159. DDS_HEADER_LEGACY header;
  160. inline const bool IsValid() const { return dwMagic == FOURCC_DDS && header.IsValid(); }
  161. inline const size_t GetFullHeaderSize() const { return sizeof(dwMagic) + header.GetFullHeaderSize(); }
  162. };
  163. // Standard dds header
  164. struct DDS_HEADER
  165. {
  166. uint32_t dwSize;
  167. uint32_t dwFlags;
  168. uint32_t dwHeight;
  169. uint32_t dwWidth;
  170. uint32_t dwPitchOrLinearSize;
  171. uint32_t dwDepth;
  172. uint32_t dwMipMapCount;
  173. uint32_t dwReserved1[11];
  174. DDS_PIXELFORMAT ddspf;
  175. uint32_t dwCaps;
  176. uint32_t dwCaps_2;
  177. uint32_t dwCaps_3;
  178. uint32_t dwCaps_4;
  179. uint32_t dwReserved2;
  180. inline const bool IsValid() const { return sizeof(*this) == dwSize; }
  181. inline const bool IsDX10Ext() const { return ddspf.dwFourCC == FOURCC_DX10; }
  182. inline const uint32 GetMipCount() const { return AZStd::max(1u, (uint32_t)dwMipMapCount); }
  183. inline const size_t GetFullHeaderSize() const
  184. {
  185. if (IsDX10Ext())
  186. {
  187. return sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10);
  188. }
  189. return sizeof(DDS_HEADER);
  190. }
  191. };
  192. // Standard description of file header
  193. struct DDS_FILE_DESC
  194. {
  195. AZ::u32 dwMagic;
  196. DDS_HEADER header;
  197. inline const bool IsValid() const { return dwMagic == FOURCC_DDS && header.IsValid(); }
  198. inline const size_t GetFullHeaderSize() const { return sizeof(dwMagic) + header.GetFullHeaderSize(); }
  199. };
  200. // chunk identifier
  201. const static AZ::u32 FOURCC_CExt = IMAGE_BUIDER_MAKEFOURCC('C', 'E', 'x', 't'); // O3DE extension start
  202. const static AZ::u32 FOURCC_CEnd = IMAGE_BUIDER_MAKEFOURCC('C', 'E', 'n', 'd'); // O3DE extension end
  203. const static AZ::u32 FOURCC_AttC = IMAGE_BUIDER_MAKEFOURCC('A', 't', 't', 'C'); // Chunk Attached Channel
  204. //Fourcc for pixel formats which aren't supported by dx10, such as astc formats
  205. //They are used for dwFourCC of dds header's DDS_PIXELFORMAT to identify non-dx10 pixel formats
  206. const static AZ::u32 FOURCC_ASTC_4x4 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '4', '4');
  207. const static AZ::u32 FOURCC_ASTC_5x4 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '5', '4');
  208. const static AZ::u32 FOURCC_ASTC_5x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '5', '5');
  209. const static AZ::u32 FOURCC_ASTC_6x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '6', '5');
  210. const static AZ::u32 FOURCC_ASTC_6x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '6', '6');
  211. const static AZ::u32 FOURCC_ASTC_8x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '5');
  212. const static AZ::u32 FOURCC_ASTC_8x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '6');
  213. const static AZ::u32 FOURCC_ASTC_10x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '5');
  214. const static AZ::u32 FOURCC_ASTC_10x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '6');
  215. const static AZ::u32 FOURCC_ASTC_8x8 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '8');
  216. const static AZ::u32 FOURCC_ASTC_10x8 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '8');
  217. const static AZ::u32 FOURCC_ASTC_10x10 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', 'A');
  218. const static AZ::u32 FOURCC_ASTC_12x10 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'C', 'A');
  219. const static AZ::u32 FOURCC_ASTC_12x12 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'C', 'C');
  220. //legacy formats names. they are only used for load old dds formats.
  221. const static AZ::u32 FOURCC_DXT1 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '1');
  222. const static AZ::u32 FOURCC_DXT2 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '2');
  223. const static AZ::u32 FOURCC_DXT3 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '3');
  224. const static AZ::u32 FOURCC_DXT4 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '4');
  225. const static AZ::u32 FOURCC_DXT5 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '5');
  226. const static AZ::u32 FOURCC_3DCP = IMAGE_BUIDER_MAKEFOURCC('A', 'T', 'I', '1');
  227. const static AZ::u32 FOURCC_3DC = IMAGE_BUIDER_MAKEFOURCC('A', 'T', 'I', '2');
  228. }