mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 18:12:43 +00:00 
			
		
		
		
	 a2f60911fe
			
		
	
	
		a2f60911fe
		
	
	
	
	
		
			
			This feels like a more fitting name for something that provides the default values for Traits.
		
			
				
	
	
		
			264 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/MemoryStream.h>
 | |
| #include <LibGfx/ImageFormats/ImageDecoder.h>
 | |
| 
 | |
| namespace Gfx {
 | |
| 
 | |
| enum MiscFlags : u32 {
 | |
|     DDS_RESOURCE_MISC_TEXTURECUBE = 0x4,
 | |
| };
 | |
| 
 | |
| enum Misc2Flags : u32 {
 | |
|     DDS_ALPHA_MODE_UNKNOWN = 0x0,
 | |
|     DDS_ALPHA_MODE_STRAIGHT = 0x1,
 | |
|     DDS_ALPHA_MODE_PREMULTIPLIED = 0x2,
 | |
|     DDS_ALPHA_MODE_OPAQUE = 0x3,
 | |
|     DDS_ALPHA_MODE_CUSTOM = 0x4,
 | |
| };
 | |
| 
 | |
| enum Caps1Flags : u32 {
 | |
|     DDSCAPS_COMPLEX = 0x8,
 | |
|     DDSCAPS_TEXTURE = 0x1000,
 | |
|     DDSCAPS_MIPMAP = 0x400000,
 | |
| };
 | |
| 
 | |
| enum Caps2Flags : u32 {
 | |
|     DDSCAPS2_CUBEMAP = 0x200,
 | |
|     DDSCAPS2_CUBEMAP_POSITIVEX = 0x400,
 | |
|     DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,
 | |
|     DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,
 | |
|     DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,
 | |
|     DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,
 | |
|     DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,
 | |
|     DDSCAPS2_VOLUME = 0x200000,
 | |
| };
 | |
| 
 | |
| enum ResourceDimensions : u32 {
 | |
|     DDS_DIMENSION_UNKNOWN,
 | |
|     DDS_DIMENSION_BUFFER,
 | |
|     DDS_DIMENSION_TEXTURE1D = 2,
 | |
|     DDS_DIMENSION_TEXTURE2D = 3,
 | |
|     DDS_DIMENSION_TEXTURE3D = 4,
 | |
| };
 | |
| 
 | |
| enum DXGIFormat : u32 {
 | |
|     DXGI_FORMAT_UNKNOWN = 0,
 | |
|     DXGI_FORMAT_R32G32B32A32_TYPELESS,
 | |
|     DXGI_FORMAT_R32G32B32A32_FLOAT,
 | |
|     DXGI_FORMAT_R32G32B32A32_UINT,
 | |
|     DXGI_FORMAT_R32G32B32A32_SINT,
 | |
|     DXGI_FORMAT_R32G32B32_TYPELESS,
 | |
|     DXGI_FORMAT_R32G32B32_FLOAT,
 | |
|     DXGI_FORMAT_R32G32B32_UINT,
 | |
|     DXGI_FORMAT_R32G32B32_SINT,
 | |
|     DXGI_FORMAT_R16G16B16A16_TYPELESS,
 | |
|     DXGI_FORMAT_R16G16B16A16_FLOAT,
 | |
|     DXGI_FORMAT_R16G16B16A16_UNORM,
 | |
|     DXGI_FORMAT_R16G16B16A16_UINT,
 | |
|     DXGI_FORMAT_R16G16B16A16_SNORM,
 | |
|     DXGI_FORMAT_R16G16B16A16_SINT,
 | |
|     DXGI_FORMAT_R32G32_TYPELESS,
 | |
|     DXGI_FORMAT_R32G32_FLOAT,
 | |
|     DXGI_FORMAT_R32G32_UINT,
 | |
|     DXGI_FORMAT_R32G32_SINT,
 | |
|     DXGI_FORMAT_R32G8X24_TYPELESS,
 | |
|     DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
 | |
|     DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
 | |
|     DXGI_FORMAT_X32_TYPELESS_G8X24_UINT,
 | |
|     DXGI_FORMAT_R10G10B10A2_TYPELESS,
 | |
|     DXGI_FORMAT_R10G10B10A2_UNORM,
 | |
|     DXGI_FORMAT_R10G10B10A2_UINT,
 | |
|     DXGI_FORMAT_R11G11B10_FLOAT,
 | |
|     DXGI_FORMAT_R8G8B8A8_TYPELESS,
 | |
|     DXGI_FORMAT_R8G8B8A8_UNORM,
 | |
|     DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
 | |
|     DXGI_FORMAT_R8G8B8A8_UINT,
 | |
|     DXGI_FORMAT_R8G8B8A8_SNORM,
 | |
|     DXGI_FORMAT_R8G8B8A8_SINT,
 | |
|     DXGI_FORMAT_R16G16_TYPELESS,
 | |
|     DXGI_FORMAT_R16G16_FLOAT,
 | |
|     DXGI_FORMAT_R16G16_UNORM,
 | |
|     DXGI_FORMAT_R16G16_UINT,
 | |
|     DXGI_FORMAT_R16G16_SNORM,
 | |
|     DXGI_FORMAT_R16G16_SINT,
 | |
|     DXGI_FORMAT_R32_TYPELESS,
 | |
|     DXGI_FORMAT_D32_FLOAT,
 | |
|     DXGI_FORMAT_R32_FLOAT,
 | |
|     DXGI_FORMAT_R32_UINT,
 | |
|     DXGI_FORMAT_R32_SINT,
 | |
|     DXGI_FORMAT_R24G8_TYPELESS,
 | |
|     DXGI_FORMAT_D24_UNORM_S8_UINT,
 | |
|     DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
 | |
|     DXGI_FORMAT_X24_TYPELESS_G8_UINT,
 | |
|     DXGI_FORMAT_R8G8_TYPELESS,
 | |
|     DXGI_FORMAT_R8G8_UNORM,
 | |
|     DXGI_FORMAT_R8G8_UINT,
 | |
|     DXGI_FORMAT_R8G8_SNORM,
 | |
|     DXGI_FORMAT_R8G8_SINT,
 | |
|     DXGI_FORMAT_R16_TYPELESS,
 | |
|     DXGI_FORMAT_R16_FLOAT,
 | |
|     DXGI_FORMAT_D16_UNORM,
 | |
|     DXGI_FORMAT_R16_UNORM,
 | |
|     DXGI_FORMAT_R16_UINT,
 | |
|     DXGI_FORMAT_R16_SNORM,
 | |
|     DXGI_FORMAT_R16_SINT,
 | |
|     DXGI_FORMAT_R8_TYPELESS,
 | |
|     DXGI_FORMAT_R8_UNORM,
 | |
|     DXGI_FORMAT_R8_UINT,
 | |
|     DXGI_FORMAT_R8_SNORM,
 | |
|     DXGI_FORMAT_R8_SINT,
 | |
|     DXGI_FORMAT_A8_UNORM,
 | |
|     DXGI_FORMAT_R1_UNORM,
 | |
|     DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
 | |
|     DXGI_FORMAT_R8G8_B8G8_UNORM,
 | |
|     DXGI_FORMAT_G8R8_G8B8_UNORM,
 | |
|     DXGI_FORMAT_BC1_TYPELESS,
 | |
|     DXGI_FORMAT_BC1_UNORM,
 | |
|     DXGI_FORMAT_BC1_UNORM_SRGB,
 | |
|     DXGI_FORMAT_BC2_TYPELESS,
 | |
|     DXGI_FORMAT_BC2_UNORM,
 | |
|     DXGI_FORMAT_BC2_UNORM_SRGB,
 | |
|     DXGI_FORMAT_BC3_TYPELESS,
 | |
|     DXGI_FORMAT_BC3_UNORM,
 | |
|     DXGI_FORMAT_BC3_UNORM_SRGB,
 | |
|     DXGI_FORMAT_BC4_TYPELESS,
 | |
|     DXGI_FORMAT_BC4_UNORM,
 | |
|     DXGI_FORMAT_BC4_SNORM,
 | |
|     DXGI_FORMAT_BC5_TYPELESS,
 | |
|     DXGI_FORMAT_BC5_UNORM,
 | |
|     DXGI_FORMAT_BC5_SNORM,
 | |
|     DXGI_FORMAT_B5G6R5_UNORM,
 | |
|     DXGI_FORMAT_B5G5R5A1_UNORM,
 | |
|     DXGI_FORMAT_B8G8R8A8_UNORM,
 | |
|     DXGI_FORMAT_B8G8R8X8_UNORM,
 | |
|     DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM,
 | |
|     DXGI_FORMAT_B8G8R8A8_TYPELESS,
 | |
|     DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
 | |
|     DXGI_FORMAT_B8G8R8X8_TYPELESS,
 | |
|     DXGI_FORMAT_B8G8R8X8_UNORM_SRGB,
 | |
|     DXGI_FORMAT_BC6H_TYPELESS,
 | |
|     DXGI_FORMAT_BC6H_UF16,
 | |
|     DXGI_FORMAT_BC6H_SF16,
 | |
|     DXGI_FORMAT_BC7_TYPELESS,
 | |
|     DXGI_FORMAT_BC7_UNORM,
 | |
|     DXGI_FORMAT_BC7_UNORM_SRGB,
 | |
|     DXGI_FORMAT_AYUV,
 | |
|     DXGI_FORMAT_Y410,
 | |
|     DXGI_FORMAT_Y416,
 | |
|     DXGI_FORMAT_NV12,
 | |
|     DXGI_FORMAT_P010,
 | |
|     DXGI_FORMAT_P016,
 | |
|     DXGI_FORMAT_420_OPAQUE,
 | |
|     DXGI_FORMAT_YUY2,
 | |
|     DXGI_FORMAT_Y210,
 | |
|     DXGI_FORMAT_Y216,
 | |
|     DXGI_FORMAT_NV11,
 | |
|     DXGI_FORMAT_AI44,
 | |
|     DXGI_FORMAT_IA44,
 | |
|     DXGI_FORMAT_P8,
 | |
|     DXGI_FORMAT_A8P8,
 | |
|     DXGI_FORMAT_B4G4R4A4_UNORM,
 | |
|     DXGI_FORMAT_P208,
 | |
|     DXGI_FORMAT_V208,
 | |
|     DXGI_FORMAT_V408,
 | |
|     DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE,
 | |
|     DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE,
 | |
|     DXGI_FORMAT_FORCE_UINT
 | |
| };
 | |
| 
 | |
| enum DDSFlags : u32 {
 | |
|     DDSD_CAPS = 0x1,
 | |
|     DDSD_HEIGHT = 0x2,
 | |
|     DDSD_WIDTH = 0x4,
 | |
|     DDSD_PITCH = 0x8,
 | |
|     DDSD_PIXELFORMAT = 0x1000,
 | |
|     DDSD_MIPMAPCOUNT = 0x20000,
 | |
|     DDSD_LINEARSIZE = 0x80000,
 | |
|     DDSD_DEPTH = 0x800000,
 | |
| };
 | |
| 
 | |
| enum PixelFormatFlags : u32 {
 | |
|     DDPF_ALPHAPIXELS = 0x1,
 | |
|     DDPF_ALPHA = 0x2,
 | |
|     DDPF_FOURCC = 0x4,
 | |
|     DDPF_PALETTEINDEXED8 = 0x20,
 | |
|     DDPF_RGB = 0x40,
 | |
|     DDPF_YUV = 0x200,
 | |
|     DDPF_LUMINANCE = 0x20000,
 | |
|     DDPF_BUMPDUDV = 0x80000,
 | |
|     DDPF_NORMAL = 0x80000000,
 | |
| };
 | |
| 
 | |
| struct [[gnu::packed]] DDSPixelFormat {
 | |
|     u32 size {};
 | |
|     u32 flags {};
 | |
|     u32 four_cc {};
 | |
|     u32 rgb_bit_count {};
 | |
|     u32 r_bit_mask {};
 | |
|     u32 g_bit_mask {};
 | |
|     u32 b_bit_mask {};
 | |
|     u32 a_bit_mask {};
 | |
| };
 | |
| 
 | |
| struct [[gnu::packed]] DDSHeader {
 | |
|     u32 size {};
 | |
|     u32 flags {};
 | |
|     u32 height {};
 | |
|     u32 width {};
 | |
|     u32 pitch {};
 | |
|     u32 depth {};
 | |
|     u32 mip_map_count {};
 | |
|     u32 reserved[11];
 | |
|     DDSPixelFormat pixel_format;
 | |
|     u32 caps1 {};
 | |
|     u32 caps2 {};
 | |
|     u32 caps3 {};
 | |
|     u32 caps4 {};
 | |
|     u32 reserved2 {};
 | |
| };
 | |
| 
 | |
| struct [[gnu::packed]] DDSHeaderDXT10 {
 | |
|     DXGIFormat format {};
 | |
|     u32 resource_dimension {};
 | |
|     u32 misc_flag {};
 | |
|     u32 array_size {};
 | |
|     u32 misc_flag2 {};
 | |
| };
 | |
| 
 | |
| struct DDSLoadingContext;
 | |
| 
 | |
| class DDSImageDecoderPlugin final : public ImageDecoderPlugin {
 | |
| public:
 | |
|     static bool sniff(ReadonlyBytes);
 | |
|     static ErrorOr<NonnullOwnPtr<ImageDecoderPlugin>> create(ReadonlyBytes);
 | |
| 
 | |
|     virtual ~DDSImageDecoderPlugin() override;
 | |
| 
 | |
|     virtual IntSize size() override;
 | |
| 
 | |
|     virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) override;
 | |
| 
 | |
| private:
 | |
|     DDSImageDecoderPlugin(FixedMemoryStream);
 | |
| 
 | |
|     OwnPtr<DDSLoadingContext> m_context;
 | |
| };
 | |
| 
 | |
| }
 | |
| 
 | |
| template<>
 | |
| struct AK::Traits<Gfx::DDSHeader> : public AK::DefaultTraits<Gfx::DDSHeader> {
 | |
|     static constexpr bool is_trivially_serializable() { return true; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| struct AK::Traits<Gfx::DDSHeaderDXT10> : public AK::DefaultTraits<Gfx::DDSHeaderDXT10> {
 | |
|     static constexpr bool is_trivially_serializable() { return true; }
 | |
| };
 |