mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-08 20:32:56 +03:00
143443e0b6
Making a bitmap non-volatile after being volatile may fail to allocate physical pages after the kernel stole the old pages in a purge. This is different from the pages being purged, but reallocated. In that case, they are simply replaced with zero-fill-on-demand pages as if they were freshly allocated.
261 lines
6.7 KiB
C++
261 lines
6.7 KiB
C++
/*
|
|
* Copyright (c) 2021, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibGfx/Bitmap.h>
|
|
#include <LibGfx/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 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 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 DDSHeaderDXT10 {
|
|
DXGIFormat format {};
|
|
u32 resource_dimension {};
|
|
u32 misc_flag {};
|
|
u32 array_size {};
|
|
u32 misc_flag2 {};
|
|
};
|
|
|
|
RefPtr<Gfx::Bitmap> load_dds(String const& path);
|
|
RefPtr<Gfx::Bitmap> load_dds_from_memory(const u8*, size_t);
|
|
|
|
struct DDSLoadingContext;
|
|
|
|
class DDSImageDecoderPlugin final : public ImageDecoderPlugin {
|
|
public:
|
|
virtual ~DDSImageDecoderPlugin() override;
|
|
DDSImageDecoderPlugin(const u8*, size_t);
|
|
|
|
virtual IntSize size() override;
|
|
virtual RefPtr<Gfx::Bitmap> bitmap() override;
|
|
virtual void set_volatile() override;
|
|
[[nodiscard]] virtual bool set_nonvolatile(bool& was_purged) override;
|
|
virtual bool sniff() override;
|
|
virtual bool is_animated() override;
|
|
virtual size_t loop_count() override;
|
|
virtual size_t frame_count() override;
|
|
virtual ImageFrameDescriptor frame(size_t i) override;
|
|
|
|
private:
|
|
OwnPtr<DDSLoadingContext> m_context;
|
|
void dump_debug();
|
|
};
|
|
|
|
}
|