mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:47:34 +00:00
LibGfx/DDS: Save the format in the context
This allows us to simplify the signature of a few functions.
This commit is contained in:
parent
4cb7573582
commit
76efdaeecd
1 changed files with 12 additions and 11 deletions
|
@ -40,6 +40,7 @@ struct DDSLoadingContext {
|
||||||
|
|
||||||
DDSHeader header;
|
DDSHeader header;
|
||||||
DDSHeaderDXT10 header10;
|
DDSHeaderDXT10 header10;
|
||||||
|
DXGIFormat format;
|
||||||
RefPtr<Gfx::Bitmap> bitmap;
|
RefPtr<Gfx::Bitmap> bitmap;
|
||||||
|
|
||||||
void dump_debug();
|
void dump_debug();
|
||||||
|
@ -372,22 +373,22 @@ static ErrorOr<void> decode_color_block(Stream& stream, DDSLoadingContext& conte
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static ErrorOr<void> decode_dxt(Stream& stream, DDSLoadingContext& context, DXGIFormat format, u64 width, u64 y)
|
static ErrorOr<void> decode_dxt(Stream& stream, DDSLoadingContext& context, u64 width, u64 y)
|
||||||
{
|
{
|
||||||
if (format == DXGI_FORMAT_BC1_UNORM) {
|
if (context.format == DXGI_FORMAT_BC1_UNORM) {
|
||||||
for (size_t x = 0; x < width; x += 4) {
|
for (size_t x = 0; x < width; x += 4) {
|
||||||
TRY(decode_color_block(stream, context, true, x, y));
|
TRY(decode_color_block(stream, context, true, x, y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format == DXGI_FORMAT_BC2_UNORM) {
|
if (context.format == DXGI_FORMAT_BC2_UNORM) {
|
||||||
for (size_t x = 0; x < width; x += 4) {
|
for (size_t x = 0; x < width; x += 4) {
|
||||||
TRY(decode_dx3_alpha_block(stream, context, x, y));
|
TRY(decode_dx3_alpha_block(stream, context, x, y));
|
||||||
TRY(decode_color_block(stream, context, false, x, y));
|
TRY(decode_color_block(stream, context, false, x, y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format == DXGI_FORMAT_BC3_UNORM) {
|
if (context.format == DXGI_FORMAT_BC3_UNORM) {
|
||||||
for (size_t x = 0; x < width; x += 4) {
|
for (size_t x = 0; x < width; x += 4) {
|
||||||
TRY(decode_dx5_alpha_block(stream, context, x, y));
|
TRY(decode_dx5_alpha_block(stream, context, x, y));
|
||||||
TRY(decode_color_block(stream, context, false, x, y));
|
TRY(decode_color_block(stream, context, false, x, y));
|
||||||
|
@ -396,12 +397,12 @@ static ErrorOr<void> decode_dxt(Stream& stream, DDSLoadingContext& context, DXGI
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
static ErrorOr<void> decode_bitmap(Stream& stream, DDSLoadingContext& context, DXGIFormat format, u64 width, u64 height)
|
static ErrorOr<void> decode_bitmap(Stream& stream, DDSLoadingContext& context, u64 width, u64 height)
|
||||||
{
|
{
|
||||||
Vector<u32> dxt_formats = { DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC3_UNORM };
|
Vector<u32> dxt_formats = { DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC3_UNORM };
|
||||||
if (dxt_formats.contains_slow(format)) {
|
if (dxt_formats.contains_slow(context.format)) {
|
||||||
for (u64 y = 0; y < height; y += 4) {
|
for (u64 y = 0; y < height; y += 4) {
|
||||||
TRY(decode_dxt(stream, context, format, width, y));
|
TRY(decode_dxt(stream, context, width, y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,11 +456,11 @@ static ErrorOr<void> decode_dds(DDSLoadingContext& context)
|
||||||
context.dump_debug();
|
context.dump_debug();
|
||||||
}
|
}
|
||||||
|
|
||||||
DXGIFormat format = get_format(context.header.pixel_format);
|
context.format = get_format(context.header.pixel_format);
|
||||||
|
|
||||||
Vector<u32> supported_formats = { DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC3_UNORM };
|
Vector<u32> supported_formats = { DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC3_UNORM };
|
||||||
if (!supported_formats.contains_slow(format)) {
|
if (!supported_formats.contains_slow(context.format)) {
|
||||||
dbgln_if(DDS_DEBUG, "Format of type {} is not supported at the moment", static_cast<u32>(format));
|
dbgln_if(DDS_DEBUG, "Format of type {} is not supported at the moment", to_underlying(context.format));
|
||||||
context.state = DDSLoadingContext::State::Error;
|
context.state = DDSLoadingContext::State::Error;
|
||||||
return Error::from_string_literal("Format type is not supported at the moment");
|
return Error::from_string_literal("Format type is not supported at the moment");
|
||||||
}
|
}
|
||||||
|
@ -471,7 +472,7 @@ static ErrorOr<void> decode_dds(DDSLoadingContext& context)
|
||||||
|
|
||||||
context.bitmap = TRY(Bitmap::create(BitmapFormat::BGRA8888, { width, height }));
|
context.bitmap = TRY(Bitmap::create(BitmapFormat::BGRA8888, { width, height }));
|
||||||
|
|
||||||
TRY(decode_bitmap(context.stream, context, format, width, height));
|
TRY(decode_bitmap(context.stream, context, width, height));
|
||||||
}
|
}
|
||||||
|
|
||||||
context.state = DDSLoadingContext::State::BitmapDecoded;
|
context.state = DDSLoadingContext::State::BitmapDecoded;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue