mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-04 05:19:58 +03:00
LibGfx: Add support for DDS images
This commit is contained in:
parent
9f42ccd639
commit
24c5b0e81c
Notes:
sideshowbarker
2024-07-18 17:52:48 +09:00
Author: https://github.com/stelar7 Commit: https://github.com/SerenityOS/serenity/commit/24c5b0e81c6 Pull-request: https://github.com/SerenityOS/serenity/pull/7162 Reviewed-by: https://github.com/IdanHo Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/drunderscore Reviewed-by: https://github.com/linusg
@ -66,6 +66,10 @@
|
||||
#cmakedefine01 CURSOR_TOOL_DEBUG
|
||||
#endif
|
||||
|
||||
#ifndef DDS_DEBUG
|
||||
#cmakedefine01 DDS_DEBUG
|
||||
#endif
|
||||
|
||||
#ifndef DEFERRED_INVOKE_DEBUG
|
||||
#cmakedefine01 DEFERRED_INVOKE_DEBUG
|
||||
#endif
|
||||
|
@ -1,4 +1,5 @@
|
||||
[FileType]
|
||||
dds=/bin/ImageViewer
|
||||
pbm=/bin/ImageViewer
|
||||
pgm=/bin/ImageViewer
|
||||
png=/bin/ImageViewer
|
||||
|
@ -4,4 +4,4 @@ Executable=/bin/ImageViewer
|
||||
Category=Graphics
|
||||
|
||||
[Launcher]
|
||||
FileTypes=pbm,pgm,png,ppm,gif,jpg,jpeg
|
||||
FileTypes=pbm,pgm,png,ppm,gif,jpg,jpeg,dds
|
||||
|
35
Base/res/html/misc/ddssuite.html
Normal file
35
Base/res/html/misc/ddssuite.html
Normal file
@ -0,0 +1,35 @@
|
||||
<html>
|
||||
<head><title>DDS test suite</title></head>
|
||||
<body>
|
||||
<table border="1" width="100%">
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>Image</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT1</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT1.dds"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT3</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT3.dds"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT5</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT5.dds"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT3 - alpha</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT3-alpha.dds"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT5 - alpha</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT5-alpha.dds"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">DXT1 - mipmap</td>
|
||||
<td align="center"><img src="ddssuite_files/DXT1-mipmap.dds"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
BIN
Base/res/html/misc/ddssuite_files/DXT1-mipmap.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT1-mipmap.dds
Normal file
Binary file not shown.
BIN
Base/res/html/misc/ddssuite_files/DXT1.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT1.dds
Normal file
Binary file not shown.
BIN
Base/res/html/misc/ddssuite_files/DXT3-alpha.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT3-alpha.dds
Normal file
Binary file not shown.
BIN
Base/res/html/misc/ddssuite_files/DXT3.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT3.dds
Normal file
Binary file not shown.
BIN
Base/res/html/misc/ddssuite_files/DXT5-alpha.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT5-alpha.dds
Normal file
Binary file not shown.
BIN
Base/res/html/misc/ddssuite_files/DXT5.dds
Normal file
BIN
Base/res/html/misc/ddssuite_files/DXT5.dds
Normal file
Binary file not shown.
@ -38,6 +38,7 @@ span#loadtime {
|
||||
<p>This page loaded in <b><span id="loadtime"></span></b> ms</p>
|
||||
<p>Some small test pages:</p>
|
||||
<ul>
|
||||
<li><a href="ddssuite.html">DDS test suite</a></li>
|
||||
<li><a href="websocket.html">WebSocket API Test</a></li>
|
||||
<li><a href="cookie.html">document.cookie</a></li>
|
||||
<li><a href="last-of-type.html">CSS :last-of-type selector</a></li>
|
||||
|
@ -182,6 +182,7 @@ set(WASM_BINPARSER_DEBUG ON)
|
||||
set(WASM_TRACE_DEBUG ON)
|
||||
set(PDF_DEBUG ON)
|
||||
set(SOLITAIRE_DEBUG ON)
|
||||
set(DDS_DEBUG ON)
|
||||
|
||||
# False positive: DEBUG is a flag but it works differently.
|
||||
# set(DEBUG ON)
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <AK/String.h>
|
||||
#include <LibGfx/BMPLoader.h>
|
||||
#include <LibGfx/Bitmap.h>
|
||||
#include <LibGfx/DDSLoader.h>
|
||||
#include <LibGfx/GIFLoader.h>
|
||||
#include <LibGfx/ICOLoader.h>
|
||||
#include <LibGfx/JPGLoader.h>
|
||||
|
@ -13,16 +13,17 @@
|
||||
#include <LibGfx/Forward.h>
|
||||
#include <LibGfx/Rect.h>
|
||||
|
||||
#define ENUMERATE_IMAGE_FORMATS \
|
||||
__ENUMERATE_IMAGE_FORMAT(pbm, ".pbm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(pgm, ".pgm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(png, ".png") \
|
||||
__ENUMERATE_IMAGE_FORMAT(ppm, ".ppm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(gif, ".gif") \
|
||||
__ENUMERATE_IMAGE_FORMAT(bmp, ".bmp") \
|
||||
__ENUMERATE_IMAGE_FORMAT(ico, ".ico") \
|
||||
__ENUMERATE_IMAGE_FORMAT(jpg, ".jpg") \
|
||||
__ENUMERATE_IMAGE_FORMAT(jpg, ".jpeg")
|
||||
#define ENUMERATE_IMAGE_FORMATS \
|
||||
__ENUMERATE_IMAGE_FORMAT(pbm, ".pbm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(pgm, ".pgm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(png, ".png") \
|
||||
__ENUMERATE_IMAGE_FORMAT(ppm, ".ppm") \
|
||||
__ENUMERATE_IMAGE_FORMAT(gif, ".gif") \
|
||||
__ENUMERATE_IMAGE_FORMAT(bmp, ".bmp") \
|
||||
__ENUMERATE_IMAGE_FORMAT(ico, ".ico") \
|
||||
__ENUMERATE_IMAGE_FORMAT(jpg, ".jpg") \
|
||||
__ENUMERATE_IMAGE_FORMAT(jpg, ".jpeg") \
|
||||
__ENUMERATE_IMAGE_FORMAT(dds, ".dds")
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
|
@ -8,6 +8,7 @@ set(SOURCES
|
||||
ClassicStylePainter.cpp
|
||||
ClassicWindowTheme.cpp
|
||||
Color.cpp
|
||||
DDSLoader.cpp
|
||||
DisjointRectSet.cpp
|
||||
Emoji.cpp
|
||||
FontDatabase.cpp
|
||||
|
1054
Userland/Libraries/LibGfx/DDSLoader.cpp
Normal file
1054
Userland/Libraries/LibGfx/DDSLoader.cpp
Normal file
File diff suppressed because it is too large
Load Diff
260
Userland/Libraries/LibGfx/DDSLoader.h
Normal file
260
Userland/Libraries/LibGfx/DDSLoader.h
Normal file
@ -0,0 +1,260 @@
|
||||
/*
|
||||
* 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() 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();
|
||||
};
|
||||
|
||||
}
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <LibGfx/BMPLoader.h>
|
||||
#include <LibGfx/DDSLoader.h>
|
||||
#include <LibGfx/GIFLoader.h>
|
||||
#include <LibGfx/ICOLoader.h>
|
||||
#include <LibGfx/ImageDecoder.h>
|
||||
@ -50,6 +51,10 @@ ImageDecoder::ImageDecoder(const u8* data, size_t size)
|
||||
if (m_plugin->sniff())
|
||||
return;
|
||||
|
||||
m_plugin = make<DDSImageDecoderPlugin>(data, size);
|
||||
if (m_plugin->sniff())
|
||||
return;
|
||||
|
||||
m_plugin = nullptr;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user