| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, the SerenityOS developers. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-21 14:58:06 -04:00
										 |  |  | #include <LibGfx/ImageFormats/ImageDecoder.h>
 | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-30 13:22:50 +01:00
										 |  |  | struct [[gnu::packed]] DDSPixelFormat { | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     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 {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-30 13:22:50 +01:00
										 |  |  | struct [[gnu::packed]] DDSHeader { | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     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 {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-30 13:22:50 +01:00
										 |  |  | struct [[gnu::packed]] DDSHeaderDXT10 { | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     DXGIFormat format {}; | 
					
						
							|  |  |  |     u32 resource_dimension {}; | 
					
						
							|  |  |  |     u32 misc_flag {}; | 
					
						
							|  |  |  |     u32 array_size {}; | 
					
						
							|  |  |  |     u32 misc_flag2 {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct DDSLoadingContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DDSImageDecoderPlugin final : public ImageDecoderPlugin { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2023-02-26 18:02:50 +00:00
										 |  |  |     static bool sniff(ReadonlyBytes); | 
					
						
							| 
									
										
										
										
											2023-01-20 10:13:14 +02:00
										 |  |  |     static ErrorOr<NonnullOwnPtr<ImageDecoderPlugin>> create(ReadonlyBytes); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     virtual ~DDSImageDecoderPlugin() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual IntSize size() override; | 
					
						
							|  |  |  |     virtual void set_volatile() override; | 
					
						
							| 
									
										
										
										
											2021-07-24 22:49:48 +02:00
										 |  |  |     [[nodiscard]] virtual bool set_nonvolatile(bool& was_purged) override; | 
					
						
							| 
									
										
										
										
											2023-05-07 19:27:07 +02:00
										 |  |  |     virtual ErrorOr<void> initialize() override; | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     virtual bool is_animated() override; | 
					
						
							|  |  |  |     virtual size_t loop_count() override; | 
					
						
							|  |  |  |     virtual size_t frame_count() override; | 
					
						
							| 
									
										
										
										
											2023-04-07 20:41:22 -06:00
										 |  |  |     virtual size_t first_animated_frame_index() override; | 
					
						
							| 
									
										
										
										
											2023-07-02 22:20:06 +01:00
										 |  |  |     virtual ErrorOr<ImageFrameDescriptor> frame(size_t index, Optional<IntSize> ideal_size = {}) override; | 
					
						
							| 
									
										
										
										
											2023-01-26 07:23:59 -05:00
										 |  |  |     virtual ErrorOr<Optional<ReadonlyBytes>> icc_data() override; | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2023-01-20 10:13:14 +02:00
										 |  |  |     DDSImageDecoderPlugin(u8 const*, size_t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-15 17:02:40 +02:00
										 |  |  |     OwnPtr<DDSLoadingContext> m_context; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-01-30 13:22:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							|  |  |  | struct AK::Traits<Gfx::DDSHeader> : public AK::GenericTraits<Gfx::DDSHeader> { | 
					
						
							|  |  |  |     static constexpr bool is_trivially_serializable() { return true; } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							|  |  |  | struct AK::Traits<Gfx::DDSHeaderDXT10> : public AK::GenericTraits<Gfx::DDSHeaderDXT10> { | 
					
						
							|  |  |  |     static constexpr bool is_trivially_serializable() { return true; } | 
					
						
							|  |  |  | }; |