/* * All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, *or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #pragma once #include #include #include //! The following defines and constants are extracted from ImageExtensionHelper.h //! Please make sure they are always synced with ImageExtensionHelper.h #define IMAGE_BUIDER_MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((AZ::u32)(AZ::u8)(ch0) | ((AZ::u32)(AZ::u8)(ch1) << 8) | \ ((AZ::u32)(AZ::u8)(ch2) << 16) | ((AZ::u32)(AZ::u8)(ch3) << 24)) // This header defines constants and structures that are useful when parsing // DDS files. DDS files were originally designed to use several structures // and constants that are native to DirectDraw and are defined in ddraw.h, // such as DDSURFACEDESC2 and DDSCAPS2. This file defines similar // (compatible) constants and structures so that one can use DDS files // without needing to include ddraw.h. //Needed to write out DDS files on Mac #if AZ_TRAIT_IMAGEPROCESSING_DEFINE_DIRECT3D_CONSTANTS #define DDPF_ALPHAPIXELS 0x00000001 // Texture contains alpha data #define DDPF_ALPHA 0x00000002 // For alpha channel only uncompressed data #define DDPF_FOURCC 0x00000004 // Texture contains compressed RGB data #define DDPF_RGB 0x00000040 // Texture contains uncompressed RGB data #define DDPF_YUV 0x00000200 // For YUV uncompressed data #define DDPF_LUMINANCE 0x00020000 // For single channel color uncompressed data #define DDSCAPS_COMPLEX 0x00000008 // Must be used on any file that contains more than one surface #define DDSCAPS_MIPMAP 0x00400000 // Should be used for a mipmap #define DDSCAPS_TEXTURE 0x00001000 // Required #endif #define DDS_FOURCC 0x00000004 // DDPF_FOURCC #define DDS_RGB 0x00000040 // DDPF_RGB #define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE #define DDS_SIGNED 0x00080000 // DDPF_SIGNED #define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS #define DDS_LUMINANCEA 0x00020001 // DDS_LUMINANCE | DDPF_ALPHAPIXELS #define DDS_A 0x00000001 // DDPF_ALPHAPIXELS #define DDS_A_ONLY 0x00000002 // DDPF_ALPHA #define DDS_FOURCC_A16B16G16R16 0x00000024 // FOURCC A16B16G16R16 #define DDS_FOURCC_V16U16 0x00000040 // FOURCC V16U16 #define DDS_FOURCC_Q16W16V16U16 0x0000006E // FOURCC Q16W16V16U16 #define DDS_FOURCC_R16F 0x0000006F // FOURCC R16F #define DDS_FOURCC_G16R16F 0x00000070 // FOURCC G16R16F #define DDS_FOURCC_A16B16G16R16F 0x00000071 // FOURCC A16B16G16R16F #define DDS_FOURCC_R32F 0x00000072 // FOURCC R32F #define DDS_FOURCC_G32R32F 0x00000073 // FOURCC G32R32F #define DDS_FOURCC_A32B32G32R32F 0x00000074 // FOURCC A32B32G32R32F #define DDSD_CAPS 0x00000001l // default #define DDSD_PIXELFORMAT 0x00001000l #define DDSD_WIDTH 0x00000004l #define DDSD_HEIGHT 0x00000002l #define DDSD_LINEARSIZE 0x00080000l #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_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX #define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX #define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY #define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY #define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ #define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ #define DDS_CUBEMAP_ALLFACES (DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX | \ DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY | \ DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ) #define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME #define DDS_RESF1_NORMALMAP 0x01000000 #define DDS_RESF1_DSDT 0x02000000 namespace ImageProcessing { const static AZ::u32 FOURCC_DX10 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', '1', '0'); const static AZ::u32 FOURCC_DDS = IMAGE_BUIDER_MAKEFOURCC('D', 'D', 'S', ' '); const static AZ::u32 FOURCC_FYRC = IMAGE_BUIDER_MAKEFOURCC('F', 'Y', 'R', 'C'); //The values of each elements in this enum should be same as ITexture ETEX_TileMode enum. enum DDS_TileMode : AZ::u8 { eTM_None = 0, eTM_LinearPadded, eTM_Optimal, }; struct DDS_PIXELFORMAT { AZ::u32 dwSize; AZ::u32 dwFlags; AZ::u32 dwFourCC; AZ::u32 dwRGBBitCount; AZ::u32 dwRBitMask; AZ::u32 dwGBitMask; AZ::u32 dwBBitMask; AZ::u32 dwABitMask; const bool operator == (const DDS_PIXELFORMAT& fmt) const { return dwFourCC == fmt.dwFourCC && dwFlags == fmt.dwFlags && dwRGBBitCount == fmt.dwRGBBitCount && dwRBitMask == fmt.dwRBitMask && dwGBitMask == fmt.dwGBitMask && dwBBitMask == fmt.dwBBitMask && dwABitMask == fmt.dwABitMask && dwSize == fmt.dwSize; } }; struct DDS_HEADER_DXT10 { // we're unable to use native enums, so we use AZ::u32 instead. AZ::u32 /*DXGI_FORMAT*/ dxgiFormat; AZ::u32 /*D3D10_RESOURCE_DIMENSION*/ resourceDimension; AZ::u32 miscFlag; AZ::u32 arraySize; AZ::u32 reserved; }; struct DDS_HEADER { AZ::u32 dwSize; AZ::u32 dwHeaderFlags; AZ::u32 dwHeight; AZ::u32 dwWidth; AZ::u32 dwPitchOrLinearSize; AZ::u32 dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags AZ::u32 dwMipMapCount; AZ::u32 dwAlphaBitDepth; AZ::u32 dwReserved1; // Crytek image flags float fAvgBrightness; // Average top mip brightness. Could be f16/half float cMinColor[4]; float cMaxColor[4]; DDS_PIXELFORMAT ddspf; AZ::u32 dwSurfaceFlags; AZ::u32 dwCubemapFlags; AZ::u8 bNumPersistentMips; AZ::u8 tileMode; //DDS_TileMode AZ::u8 bReserved2[6]; AZ::u32 dwTextureStage; inline const bool IsValid() const { return sizeof(*this) == dwSize; } inline const bool IsDX10Ext() const { return ddspf.dwFourCC == FOURCC_DX10; } inline const AZ::u32 GetMipCount() const { return AZStd::GetMax(1u, (AZ::u32)dwMipMapCount); } inline const size_t GetFullHeaderSize() const { if (IsDX10Ext()) { return sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); } return sizeof(DDS_HEADER); } }; // standard description of file header struct DDS_FILE_DESC { AZ::u32 dwMagic; DDS_HEADER header; inline const bool IsValid() const { return dwMagic == FOURCC_DDS && header.IsValid(); } inline const size_t GetFullHeaderSize() const { return sizeof(dwMagic) + header.GetFullHeaderSize(); } }; // chunk identifier const static AZ::u32 FOURCC_CExt = IMAGE_BUIDER_MAKEFOURCC('C', 'E', 'x', 't'); // Crytek extension start const static AZ::u32 FOURCC_CEnd = IMAGE_BUIDER_MAKEFOURCC('C', 'E', 'n', 'd'); // Crytek extension end const static AZ::u32 FOURCC_AttC = IMAGE_BUIDER_MAKEFOURCC('A', 't', 't', 'C'); // Chunk Attached Channel //Fourcc for pixel formats which aren't supported by dx10, such as astc formats, etc formats, pvrtc formats //They are used for dwFourCC of dds header's DDS_PIXELFORMAT to identify non-dx10 pixel formats const static AZ::u32 FOURCC_EAC_R11 = IMAGE_BUIDER_MAKEFOURCC('E', 'A', 'R', ' '); const static AZ::u32 FOURCC_EAC_RG11 = IMAGE_BUIDER_MAKEFOURCC('E', 'A', 'R', 'G'); const static AZ::u32 FOURCC_ETC2 = IMAGE_BUIDER_MAKEFOURCC('E', 'T', '2', ' '); const static AZ::u32 FOURCC_ETC2A = IMAGE_BUIDER_MAKEFOURCC('E', 'T', '2', 'A'); const static AZ::u32 FOURCC_PVRTC2 = IMAGE_BUIDER_MAKEFOURCC('P', 'V', 'R', '2'); const static AZ::u32 FOURCC_PVRTC4 = IMAGE_BUIDER_MAKEFOURCC('P', 'V', 'R', '4'); const static AZ::u32 FOURCC_ASTC_4x4 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '4', '4'); const static AZ::u32 FOURCC_ASTC_5x4 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '5', '4'); const static AZ::u32 FOURCC_ASTC_5x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '5', '5'); const static AZ::u32 FOURCC_ASTC_6x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '6', '5'); const static AZ::u32 FOURCC_ASTC_6x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '6', '6'); const static AZ::u32 FOURCC_ASTC_8x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '5'); const static AZ::u32 FOURCC_ASTC_8x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '6'); const static AZ::u32 FOURCC_ASTC_10x5 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '5'); const static AZ::u32 FOURCC_ASTC_10x6 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '6'); const static AZ::u32 FOURCC_ASTC_8x8 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', '8', '8'); const static AZ::u32 FOURCC_ASTC_10x8 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', '8'); const static AZ::u32 FOURCC_ASTC_10x10 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'A', 'A'); const static AZ::u32 FOURCC_ASTC_12x10 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'C', 'A'); const static AZ::u32 FOURCC_ASTC_12x12 = IMAGE_BUIDER_MAKEFOURCC('A', 'S', 'C', 'C'); //legacy formats names. they are only used for load rc.exe's dds formats const static AZ::u32 FOURCC_DXT1 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '1'); const static AZ::u32 FOURCC_DXT3 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '3'); const static AZ::u32 FOURCC_DXT5 = IMAGE_BUIDER_MAKEFOURCC('D', 'X', 'T', '5'); const static AZ::u32 FOURCC_3DCP = IMAGE_BUIDER_MAKEFOURCC('A', 'T', 'I', '1'); const static AZ::u32 FOURCC_3DC = IMAGE_BUIDER_MAKEFOURCC('A', 'T', 'I', '2'); }