123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*
- * 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; }
- };
|