Skip to content

Commit 3508257

Browse files
committed
Add DDS loading of 32bit aligned data without alpha
1 parent 34f005d commit 3508257

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

modules/dds/dds_enums.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,10 @@ enum DDSFormat {
137137
DDS_RGB9E5,
138138
DDS_RGB8,
139139
DDS_RGBA8,
140+
DDS_RGBX8,
140141
DDS_BGR8,
141142
DDS_BGRA8,
143+
DDS_BGRX8,
142144
DDS_BGR5A1,
143145
DDS_BGR565,
144146
DDS_B2GR3,
@@ -188,8 +190,10 @@ static const DDSFormatInfo dds_format_info[DDS_MAX] = {
188190
{ "RGB9E5", false, 1, 4, Image::FORMAT_RGBE9995 },
189191
{ "RGB8", false, 1, 3, Image::FORMAT_RGB8 },
190192
{ "RGBA8", false, 1, 4, Image::FORMAT_RGBA8 },
193+
{ "RGBX8", false, 1, 4, Image::FORMAT_RGB8 },
191194
{ "BGR8", false, 1, 3, Image::FORMAT_RGB8 },
192195
{ "BGRA8", false, 1, 4, Image::FORMAT_RGBA8 },
196+
{ "BGRX8", false, 1, 4, Image::FORMAT_RGB8 },
193197
{ "BGR5A1", false, 1, 2, Image::FORMAT_RGBA8 },
194198
{ "BGR565", false, 1, 2, Image::FORMAT_RGB8 },
195199
{ "B2GR3", false, 1, 1, Image::FORMAT_RGB8 },

modules/dds/texture_loader_dds.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,39 @@ static Ref<Image> _dds_load_layer(Ref<FileAccess> p_file, DDSFormat p_dds_format
359359

360360
} break;
361361

362+
case DDS_RGBX8: {
363+
// To RGB8.
364+
int colcount = size / 4;
365+
366+
for (int i = 0; i < colcount; i++) {
367+
int src_ofs = i * 4;
368+
int dst_ofs = i * 3;
369+
370+
wb[dst_ofs + 0] = wb[src_ofs + 0];
371+
wb[dst_ofs + 1] = wb[src_ofs + 1];
372+
wb[dst_ofs + 2] = wb[src_ofs + 2];
373+
}
374+
375+
r_src_data.resize(size * 3 / 4);
376+
377+
} break;
378+
case DDS_BGRX8: {
379+
// To RGB8.
380+
int colcount = size / 4;
381+
382+
for (int i = 0; i < colcount; i++) {
383+
int src_ofs = i * 4;
384+
int dst_ofs = i * 3;
385+
386+
wb[dst_ofs + 0] = wb[src_ofs + 2];
387+
wb[dst_ofs + 1] = wb[src_ofs + 1];
388+
wb[dst_ofs + 2] = wb[src_ofs + 0];
389+
}
390+
391+
r_src_data.resize(size * 3 / 4);
392+
393+
} break;
394+
362395
// Grayscale.
363396
case DDS_LUMINANCE_ALPHA_4: {
364397
// To LA8.
@@ -622,6 +655,10 @@ static Vector<Ref<Image>> _dds_load_images_from_buffer(Ref<FileAccess> p_f, DDSF
622655
r_dds_format = DDS_BGR565;
623656
} else if (format_rgb_bits == 8 && format_red_mask == 0xe0 && format_green_mask == 0x1c && format_blue_mask == 0x3) {
624657
r_dds_format = DDS_B2GR3;
658+
} else if (format_rgb_bits == 32 && format_red_mask == 0xff0000 && format_green_mask == 0xff00 && format_blue_mask == 0xff) {
659+
r_dds_format = DDS_BGRX8;
660+
} else if (format_rgb_bits == 32 && format_red_mask == 0xff && format_green_mask == 0xff00 && format_blue_mask == 0xff0000) {
661+
r_dds_format = DDS_RGBX8;
625662
}
626663
}
627664

0 commit comments

Comments
 (0)