@@ -185,6 +185,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
185
185
if (header -> ddspf .flags == 0x40 ) // No alpha channel
186
186
{
187
187
int data_size = image_pixel_size * sizeof (unsigned short );
188
+ if (header -> mipmap_count > 1 ) data_size = data_size + data_size / 3 ;
188
189
image_data = RL_MALLOC (data_size );
189
190
190
191
memcpy (image_data , file_data_ptr , data_size );
@@ -196,6 +197,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
196
197
if (header -> ddspf .a_bit_mask == 0x8000 ) // 1bit alpha
197
198
{
198
199
int data_size = image_pixel_size * sizeof (unsigned short );
200
+ if (header -> mipmap_count > 1 ) data_size = data_size + data_size / 3 ;
199
201
image_data = RL_MALLOC (data_size );
200
202
201
203
memcpy (image_data , file_data_ptr , data_size );
@@ -215,6 +217,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
215
217
else if (header -> ddspf .a_bit_mask == 0xf000 ) // 4bit alpha
216
218
{
217
219
int data_size = image_pixel_size * sizeof (unsigned short );
220
+ if (header -> mipmap_count > 1 ) data_size = data_size + data_size / 3 ;
218
221
image_data = RL_MALLOC (data_size );
219
222
220
223
memcpy (image_data , file_data_ptr , data_size );
@@ -236,6 +239,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
236
239
else if ((header -> ddspf .flags == 0x40 ) && (header -> ddspf .rgb_bit_count == 24 )) // DDS_RGB, no compressed
237
240
{
238
241
int data_size = image_pixel_size * 3 * sizeof (unsigned char );
242
+ if (header -> mipmap_count > 1 ) data_size = data_size + data_size / 3 ;
239
243
image_data = RL_MALLOC (data_size );
240
244
241
245
memcpy (image_data , file_data_ptr , data_size );
@@ -245,6 +249,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
245
249
else if ((header -> ddspf .flags == 0x41 ) && (header -> ddspf .rgb_bit_count == 32 )) // DDS_RGBA, no compressed
246
250
{
247
251
int data_size = image_pixel_size * 4 * sizeof (unsigned char );
252
+ if (header -> mipmap_count > 1 ) data_size = data_size + data_size / 3 ;
248
253
image_data = RL_MALLOC (data_size );
249
254
250
255
memcpy (image_data , file_data_ptr , data_size );
@@ -265,9 +270,11 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
265
270
}
266
271
else if (((header -> ddspf .flags == 0x04 ) || (header -> ddspf .flags == 0x05 )) && (header -> ddspf .fourcc > 0 )) // Compressed
267
272
{
268
- // NOTE: This forces only 1 mipmap to be loaded which is not really correct but it works
269
- int data_size = (header -> pitch_or_linear_size < file_size - 0x80 ) ? header -> pitch_or_linear_size : file_size - 0x80 ;
270
- * mips = 1 ;
273
+ int data_size = 0 ;
274
+
275
+ // Calculate data size, including all mipmaps
276
+ if (header -> mipmap_count > 1 ) data_size = header -> pitch_or_linear_size + header -> pitch_or_linear_size / 3 ;
277
+ else data_size = header -> pitch_or_linear_size ;
271
278
272
279
image_data = RL_MALLOC (data_size * sizeof (unsigned char ));
273
280
0 commit comments