|
|
@ -30,10 +30,10 @@ |
|
|
|
* #define RL_GPUTEX_SUPPORT_ASTC |
|
|
|
* Define desired file formats to be supported |
|
|
|
* |
|
|
|
* #define RL_GPUTEX_SHOW_WARN_INFO |
|
|
|
* #define RL_GPUTEX_SHOW_LOG_INFO |
|
|
|
* Define, if you wish to see warnings generated by the library |
|
|
|
* This will include <stdio.h> unless you provide your own RL_GPUTEX_WARN |
|
|
|
* #define RL_GPUTEX_WARN |
|
|
|
* This will include <stdio.h> unless you provide your own RL_GPUTEX_LOG |
|
|
|
* #define RL_GPUTEX_LOG |
|
|
|
* Define, if you wish to provide your own warning function |
|
|
|
* Make sure that this macro puts newline character '\n' at the end |
|
|
|
* |
|
|
@ -59,15 +59,16 @@ |
|
|
|
* There is no need to do so when statically linking |
|
|
|
* |
|
|
|
* VERSIONS HISTORY: |
|
|
|
* 1.0 (17-Sep-2022) First version has been created by migrating part of compressed-texture-loading |
|
|
|
* functionality from Raylib src/rtextures.c into self-contained library |
|
|
|
* 1.1 (15-Jul-2025) Several minor fixes related to specific image formats; some work has been done |
|
|
|
* in order to decouple the library from Raylib by introducing few new macros; library still |
|
|
|
* requires Raylib in order to function properly |
|
|
|
* |
|
|
|
* 1.0 (17-Sep-2022) First version has been created by migrating part of compressed-texture-loading |
|
|
|
* functionality from Raylib src/rtextures.c into self-contained library |
|
|
|
* |
|
|
|
* LICENSE: zlib/libpng |
|
|
|
* |
|
|
|
* Copyright (c) 2013-2022 Ramon Santamaria (@raysan5) |
|
|
|
* Copyright (c) 2013-2025 Ramon Santamaria (@raysan5) |
|
|
|
* |
|
|
|
* This software is provided "as-is", without any express or implied warranty. In no event |
|
|
|
* will the authors be held liable for any damages arising from the use of this software. |
|
|
@ -93,6 +94,37 @@ |
|
|
|
#define RLGPUTEXAPI // Functions defined as 'extern' by default (implicit specifiers) |
|
|
|
#endif |
|
|
|
|
|
|
|
// Texture pixel formats |
|
|
|
// NOTE: Support depends on OpenGL version |
|
|
|
// WARNING: Enum values aligned with raylib/rlgl equivalent PixelFormat/rlPixelFormat enum, |
|
|
|
// to avoid value mapping between the 3 libraries format values |
|
|
|
typedef enum { |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp |
|
|
|
RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp |
|
|
|
} rlGpuTexPixelFormat; |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Module Functions Declaration |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
@ -124,12 +156,12 @@ RLGPUTEXAPI int rl_save_ktx_to_memory(const char *fileName, void *data, int widt |
|
|
|
|
|
|
|
#if defined(RL_GPUTEX_IMPLEMENTATION) |
|
|
|
|
|
|
|
#if defined(RL_GPUTEX_SHOW_WARN_INFO) && !defined(RL_GPUTEX_WARN) |
|
|
|
#if defined(RL_GPUTEX_SHOW_LOG_INFO) && !defined(RL_GPUTEX_LOG) |
|
|
|
#include <stdio.h> // Required for: printf() |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !defined(RL_GPUTEX_MALLOC) || !defined(RL_GPUTEX_NULL) |
|
|
|
#include <stdlib.h> // Required for: NULL, malloc(), calloc(), free(), realloc() |
|
|
|
#include <stdlib.h> // Required for: NULL, malloc(), calloc(), free() |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !defined(RL_GPUTEX_MEMCPY) |
|
|
@ -149,7 +181,6 @@ RLGPUTEXAPI int rl_save_ktx_to_memory(const char *fileName, void *data, int widt |
|
|
|
#if !defined(RL_GPUTEX_MALLOC) |
|
|
|
#define RL_GPUTEX_MALLOC(sz) malloc(sz) |
|
|
|
#define RL_GPUTEX_CALLOC(num, sz) calloc(num, sz) |
|
|
|
#define RL_GPUTEX_REALLOC(ptr, sz) realloc(ptr, sz) |
|
|
|
#define RL_GPUTEX_FREE(ptr) free(ptr) |
|
|
|
#endif |
|
|
|
|
|
|
@ -161,20 +192,20 @@ RLGPUTEXAPI int rl_save_ktx_to_memory(const char *fileName, void *data, int widt |
|
|
|
#define RL_GPUTEX_MEMCPY(dest, src, num) memcpy(dest, src, num) |
|
|
|
#endif |
|
|
|
|
|
|
|
// Simple warning system to avoid RPNG_LOG() calls if required |
|
|
|
// Simple warning logging system to avoid LOG() calls if required |
|
|
|
// NOTE: Avoiding those calls, also avoids const strings memory usage |
|
|
|
// WARN: This macro expects that newline character is added automatically |
|
|
|
// in order to match the functionality of Raylib's TRACELOG() |
|
|
|
#if defined(RL_GPUTEX_SHOW_WARN_INFO) |
|
|
|
#if !defined(RL_GPUTEX_WARN) |
|
|
|
#define RL_GPUTEX_WARN(...) (void)(printf("RL_GPUTEX: WARNING: " __VA_ARGS__), printf("\n")) |
|
|
|
#if defined(RL_GPUTEX_SHOW_LOG_INFO) |
|
|
|
#if !defined(RL_GPUTEX_LOG) |
|
|
|
#define RL_GPUTEX_LOG(...) (void)(printf("RL_GPUTEX: WARNING: " __VA_ARGS__), printf("\n")) |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#if defined(RL_GPUTEX_WARN) |
|
|
|
// undefine it first in order to supress warnings about macro redefinition |
|
|
|
#undef RL_GPUTEX_WARN |
|
|
|
#if defined(RL_GPUTEX_LOG) |
|
|
|
// Undefine it first in order to supress warnings about macro redefinition |
|
|
|
#undef RL_GPUTEX_LOG |
|
|
|
#endif |
|
|
|
#define RL_GPUTEX_WARN(...) |
|
|
|
#define RL_GPUTEX_LOG(...) |
|
|
|
#endif |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
@ -246,7 +277,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
if ((dds_header_id[0] != 'D') || (dds_header_id[1] != 'D') || (dds_header_id[2] != 'S') || (dds_header_id[3] != ' ')) |
|
|
|
{ |
|
|
|
RL_GPUTEX_WARN("DDS file data not valid"); |
|
|
|
RL_GPUTEX_LOG("DDS file data not valid"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -257,8 +288,8 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
*width = header->width; |
|
|
|
*height = header->height; |
|
|
|
|
|
|
|
if (*width % 4 != 0) RL_GPUTEX_WARN("DDS file width must be multiple of 4. Image will not display correctly"); |
|
|
|
if (*height % 4 != 0) RL_GPUTEX_WARN("DDS file height must be multiple of 4. Image will not display correctly"); |
|
|
|
if (*width % 4 != 0) RL_GPUTEX_LOG("DDS file width must be multiple of 4. Image will not display correctly"); |
|
|
|
if (*height % 4 != 0) RL_GPUTEX_LOG("DDS file height must be multiple of 4. Image will not display correctly"); |
|
|
|
|
|
|
|
image_pixel_size = header->width*header->height; |
|
|
|
|
|
|
@ -275,7 +306,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
|
|
|
|
*format = PIXELFORMAT_UNCOMPRESSED_R5G6B5; |
|
|
|
*format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5; |
|
|
|
} |
|
|
|
else if (header->ddspf.flags == 0x41) // With alpha channel |
|
|
|
{ |
|
|
@ -297,7 +328,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
((unsigned short *)image_data)[i] += alpha; |
|
|
|
} |
|
|
|
|
|
|
|
*format = PIXELFORMAT_UNCOMPRESSED_R5G5B5A1; |
|
|
|
*format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1; |
|
|
|
} |
|
|
|
else if (header->ddspf.a_bit_mask == 0xf000) // 4bit alpha |
|
|
|
{ |
|
|
@ -317,7 +348,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
((unsigned short *)image_data)[i] += alpha; |
|
|
|
} |
|
|
|
|
|
|
|
*format = PIXELFORMAT_UNCOMPRESSED_R4G4B4A4; |
|
|
|
*format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -329,7 +360,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
|
|
|
|
*format = PIXELFORMAT_UNCOMPRESSED_R8G8B8; |
|
|
|
*format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8; |
|
|
|
} |
|
|
|
else if ((header->ddspf.flags == 0x41) && (header->ddspf.rgb_bit_count == 32)) // DDS_RGBA, no compressed |
|
|
|
{ |
|
|
@ -351,7 +382,7 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
((unsigned char *)image_data)[i + 2] = blue; |
|
|
|
} |
|
|
|
|
|
|
|
*format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; |
|
|
|
*format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; |
|
|
|
} |
|
|
|
else if (((header->ddspf.flags == 0x04) || (header->ddspf.flags == 0x05)) && (header->ddspf.fourcc > 0)) // Compressed |
|
|
|
{ |
|
|
@ -369,11 +400,11 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
{ |
|
|
|
case FOURCC_DXT1: |
|
|
|
{ |
|
|
|
if (header->ddspf.flags == 0x04) *format = PIXELFORMAT_COMPRESSED_DXT1_RGB; |
|
|
|
else *format = PIXELFORMAT_COMPRESSED_DXT1_RGBA; |
|
|
|
if (header->ddspf.flags == 0x04) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB; |
|
|
|
else *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGBA; |
|
|
|
} break; |
|
|
|
case FOURCC_DXT3: *format = PIXELFORMAT_COMPRESSED_DXT3_RGBA; break; |
|
|
|
case FOURCC_DXT5: *format = PIXELFORMAT_COMPRESSED_DXT5_RGBA; break; |
|
|
|
case FOURCC_DXT3: *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA; break; |
|
|
|
case FOURCC_DXT5: *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT5_RGBA; break; |
|
|
|
default: break; |
|
|
|
} |
|
|
|
} |
|
|
@ -427,7 +458,7 @@ void *rl_load_pkm_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
if ((header->id[0] != 'P') || (header->id[1] != 'K') || (header->id[2] != 'M') || (header->id[3] != ' ')) |
|
|
|
{ |
|
|
|
RL_GPUTEX_WARN("PKM file data not valid"); |
|
|
|
RL_GPUTEX_LOG("PKM file data not valid"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -451,9 +482,9 @@ void *rl_load_pkm_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
|
|
|
|
if (header->format == 0) *format = PIXELFORMAT_COMPRESSED_ETC1_RGB; |
|
|
|
else if (header->format == 1) *format = PIXELFORMAT_COMPRESSED_ETC2_RGB; |
|
|
|
else if (header->format == 3) *format = PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; |
|
|
|
if (header->format == 0) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB; |
|
|
|
else if (header->format == 1) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB; |
|
|
|
else if (header->format == 3) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -511,7 +542,7 @@ void *rl_load_ktx_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
if ((header->id[1] != 'K') || (header->id[2] != 'T') || (header->id[3] != 'X') || |
|
|
|
(header->id[4] != ' ') || (header->id[5] != '1') || (header->id[6] != '1')) |
|
|
|
{ |
|
|
|
RL_GPUTEX_WARN("KTX file data not valid"); |
|
|
|
RL_GPUTEX_LOG("KTX file data not valid"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -530,9 +561,9 @@ void *rl_load_ktx_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
|
|
|
|
if (header->gl_internal_format == 0x8D64) *format = PIXELFORMAT_COMPRESSED_ETC1_RGB; |
|
|
|
else if (header->gl_internal_format == 0x9274) *format = PIXELFORMAT_COMPRESSED_ETC2_RGB; |
|
|
|
else if (header->gl_internal_format == 0x9278) *format = PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; |
|
|
|
if (header->gl_internal_format == 0x8D64) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB; |
|
|
|
else if (header->gl_internal_format == 0x9274) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB; |
|
|
|
else if (header->gl_internal_format == 0x9278) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; |
|
|
|
|
|
|
|
// TODO: Support uncompressed data formats? Right now it returns format = 0! |
|
|
|
} |
|
|
@ -609,7 +640,7 @@ int rl_save_ktx(const char *file_name, void *data, int width, int height, int fo |
|
|
|
|
|
|
|
// NOTE: We can save into a .ktx all PixelFormats supported by raylib, including compressed formats like DXT, ETC or ASTC |
|
|
|
|
|
|
|
if (header.gl_format == -1) RL_GPUTEX_WARN("GL format not supported for KTX export (%i)", header.gl_format); |
|
|
|
if (header.gl_format == -1) RL_GPUTEX_LOG("GL format not supported for KTX export (%i)", header.gl_format); |
|
|
|
else |
|
|
|
{ |
|
|
|
RL_GPUTEX_MEMCPY(file_data_ptr, &header, sizeof(ktx_header)); |
|
|
@ -642,16 +673,16 @@ int rl_save_ktx(const char *file_name, void *data, int width, int height, int fo |
|
|
|
{ |
|
|
|
unsigned int count = (unsigned int)fwrite(file_data, sizeof(unsigned char), data_size, file); |
|
|
|
|
|
|
|
if (count == 0) RL_GPUTEX_WARN("FILEIO: [%s] Failed to write file", file_name); |
|
|
|
else if (count != data_size) RL_GPUTEX_WARN("FILEIO: [%s] File partially written", file_name); |
|
|
|
if (count == 0) RL_GPUTEX_LOG("FILEIO: [%s] Failed to write file", file_name); |
|
|
|
else if (count != data_size) RL_GPUTEX_LOG("FILEIO: [%s] File partially written", file_name); |
|
|
|
else (void)0; // WARN: this branch is handled by Raylib, since rl_gputex only prints warnings |
|
|
|
|
|
|
|
int result = fclose(file); |
|
|
|
if (result != 0) RL_GPUTEX_WARN("FILEIO: [%s] Failed to close file", file_name); |
|
|
|
if (result != 0) RL_GPUTEX_LOG("FILEIO: [%s] Failed to close file", file_name); |
|
|
|
|
|
|
|
if (result == 0 && count == data_size) success = true; |
|
|
|
} |
|
|
|
else RL_GPUTEX_WARN("FILEIO: [%s] Failed to open file", file_name); |
|
|
|
else RL_GPUTEX_LOG("FILEIO: [%s] Failed to open file", file_name); |
|
|
|
|
|
|
|
RL_GPUTEX_FREE(file_data); // Free file data buffer |
|
|
|
|
|
|
@ -735,7 +766,7 @@ void *rl_load_pvr_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
|
|
|
|
if ((header->id[0] != 'P') || (header->id[1] != 'V') || (header->id[2] != 'R') || (header->id[3] != 3)) |
|
|
|
{ |
|
|
|
RL_GPUTEX_WARN("PVR file data not valid"); |
|
|
|
RL_GPUTEX_LOG("PVR file data not valid"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -746,24 +777,24 @@ void *rl_load_pvr_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
*mips = header->num_mipmaps; |
|
|
|
|
|
|
|
// Check data format |
|
|
|
if (((header->channels[0] == 'l') && (header->channels[1] == 0)) && (header->channel_depth[0] == 8)) *format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE; |
|
|
|
else if (((header->channels[0] == 'l') && (header->channels[1] == 'a')) && ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8))) *format = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA; |
|
|
|
if (((header->channels[0] == 'l') && (header->channels[1] == 0)) && (header->channel_depth[0] == 8)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE; |
|
|
|
else if (((header->channels[0] == 'l') && (header->channels[1] == 'a')) && ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8))) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA; |
|
|
|
else if ((header->channels[0] == 'r') && (header->channels[1] == 'g') && (header->channels[2] == 'b')) |
|
|
|
{ |
|
|
|
if (header->channels[3] == 'a') |
|
|
|
{ |
|
|
|
if ((header->channel_depth[0] == 5) && (header->channel_depth[1] == 5) && (header->channel_depth[2] == 5) && (header->channel_depth[3] == 1)) *format = PIXELFORMAT_UNCOMPRESSED_R5G5B5A1; |
|
|
|
else if ((header->channel_depth[0] == 4) && (header->channel_depth[1] == 4) && (header->channel_depth[2] == 4) && (header->channel_depth[3] == 4)) *format = PIXELFORMAT_UNCOMPRESSED_R4G4B4A4; |
|
|
|
else if ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8) && (header->channel_depth[2] == 8) && (header->channel_depth[3] == 8)) *format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; |
|
|
|
if ((header->channel_depth[0] == 5) && (header->channel_depth[1] == 5) && (header->channel_depth[2] == 5) && (header->channel_depth[3] == 1)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1; |
|
|
|
else if ((header->channel_depth[0] == 4) && (header->channel_depth[1] == 4) && (header->channel_depth[2] == 4) && (header->channel_depth[3] == 4)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4; |
|
|
|
else if ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8) && (header->channel_depth[2] == 8) && (header->channel_depth[3] == 8)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; |
|
|
|
} |
|
|
|
else if (header->channels[3] == 0) |
|
|
|
{ |
|
|
|
if ((header->channel_depth[0] == 5) && (header->channel_depth[1] == 6) && (header->channel_depth[2] == 5)) *format = PIXELFORMAT_UNCOMPRESSED_R5G6B5; |
|
|
|
else if ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8) && (header->channel_depth[2] == 8)) *format = PIXELFORMAT_UNCOMPRESSED_R8G8B8; |
|
|
|
if ((header->channel_depth[0] == 5) && (header->channel_depth[1] == 6) && (header->channel_depth[2] == 5)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5; |
|
|
|
else if ((header->channel_depth[0] == 8) && (header->channel_depth[1] == 8) && (header->channel_depth[2] == 8)) *format = RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (header->channels[0] == 2) *format = PIXELFORMAT_COMPRESSED_PVRT_RGB; |
|
|
|
else if (header->channels[0] == 3) *format = PIXELFORMAT_COMPRESSED_PVRT_RGBA; |
|
|
|
else if (header->channels[0] == 2) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB; |
|
|
|
else if (header->channels[0] == 3) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA; |
|
|
|
|
|
|
|
file_data_ptr += header->metadata_size; // Skip meta data header |
|
|
|
|
|
|
@ -771,15 +802,15 @@ void *rl_load_pvr_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
int bpp = 0; |
|
|
|
switch (*format) |
|
|
|
{ |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R5G6B5: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; |
|
|
|
case PIXELFORMAT_COMPRESSED_PVRT_RGB: |
|
|
|
case PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; |
|
|
|
default: break; |
|
|
|
} |
|
|
|
|
|
|
@ -789,7 +820,7 @@ void *rl_load_pvr_from_memory(const unsigned char *file_data, unsigned int file_ |
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (pvr_version == 52) RL_GPUTEX_WARN("PVRv2 format not supported, update your files to PVRv3"); |
|
|
|
else if (pvr_version == 52) RL_GPUTEX_LOG("PVRv2 format not supported, update your files to PVRv3"); |
|
|
|
} |
|
|
|
|
|
|
|
return image_data; |
|
|
@ -829,7 +860,7 @@ void *rl_load_astc_from_memory(const unsigned char *file_data, unsigned int file |
|
|
|
|
|
|
|
if ((header->id[3] != 0x5c) || (header->id[2] != 0xa1) || (header->id[1] != 0xab) || (header->id[0] != 0x13)) |
|
|
|
{ |
|
|
|
RL_GPUTEX_WARN("ASTC file data not valid"); |
|
|
|
RL_GPUTEX_LOG("ASTC file data not valid"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -852,10 +883,10 @@ void *rl_load_astc_from_memory(const unsigned char *file_data, unsigned int file |
|
|
|
|
|
|
|
RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size); |
|
|
|
|
|
|
|
if (bpp == 8) *format = PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA; |
|
|
|
else if (bpp == 2) *format = PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA; |
|
|
|
if (bpp == 8) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA; |
|
|
|
else if (bpp == 2) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA; |
|
|
|
} |
|
|
|
else RL_GPUTEX_WARN("ASTC block size configuration not supported"); |
|
|
|
else RL_GPUTEX_LOG("ASTC block size configuration not supported"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -874,27 +905,27 @@ static int get_pixel_data_size(int width, int height, int format) |
|
|
|
|
|
|
|
switch (format) |
|
|
|
{ |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R5G6B5: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; |
|
|
|
case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; |
|
|
|
case PIXELFORMAT_COMPRESSED_DXT1_RGB: |
|
|
|
case PIXELFORMAT_COMPRESSED_DXT1_RGBA: |
|
|
|
case PIXELFORMAT_COMPRESSED_ETC1_RGB: |
|
|
|
case PIXELFORMAT_COMPRESSED_ETC2_RGB: |
|
|
|
case PIXELFORMAT_COMPRESSED_PVRT_RGB: |
|
|
|
case PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; |
|
|
|
case PIXELFORMAT_COMPRESSED_DXT3_RGBA: |
|
|
|
case PIXELFORMAT_COMPRESSED_DXT5_RGBA: |
|
|
|
case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: |
|
|
|
case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; |
|
|
|
case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGBA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT5_RGBA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; |
|
|
|
case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; |
|
|
|
default: break; |
|
|
|
} |
|
|
|
|
|
|
@ -904,8 +935,8 @@ static int get_pixel_data_size(int width, int height, int format) |
|
|
|
// if texture is smaller, minimum dataSize is 8 or 16 |
|
|
|
if ((width < 4) && (height < 4)) |
|
|
|
{ |
|
|
|
if ((format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < PIXELFORMAT_COMPRESSED_DXT3_RGBA)) data_size = 8; |
|
|
|
else if ((format >= PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) data_size = 16; |
|
|
|
if ((format >= RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) data_size = 8; |
|
|
|
else if ((format >= RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) data_size = 16; |
|
|
|
} |
|
|
|
|
|
|
|
return data_size; |
|
|
|