REVIEWED: rl_gputex.h library to be usable standalone

This commit is contained in:
Ray
2025-07-26 11:44:36 +02:00
parent 94d8d7133b
commit d7893141f3
2 changed files with 125 additions and 102 deletions

View File

@@ -30,10 +30,10 @@
* #define RL_GPUTEX_SUPPORT_ASTC * #define RL_GPUTEX_SUPPORT_ASTC
* Define desired file formats to be supported * 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 * Define, if you wish to see warnings generated by the library
* This will include <stdio.h> unless you provide your own RL_GPUTEX_WARN * This will include <stdio.h> unless you provide your own RL_GPUTEX_LOG
* #define RL_GPUTEX_WARN * #define RL_GPUTEX_LOG
* Define, if you wish to provide your own warning function * Define, if you wish to provide your own warning function
* Make sure that this macro puts newline character '\n' at the end * 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 * There is no need to do so when statically linking
* *
* VERSIONS HISTORY: * 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 * 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 * in order to decouple the library from Raylib by introducing few new macros; library still
* requires Raylib in order to function properly * 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 * 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 * 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. * 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) #define RLGPUTEXAPI // Functions defined as 'extern' by default (implicit specifiers)
#endif #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 // 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_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() #include <stdio.h> // Required for: printf()
#endif #endif
#if !defined(RL_GPUTEX_MALLOC) || !defined(RL_GPUTEX_NULL) #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 #endif
#if !defined(RL_GPUTEX_MEMCPY) #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) #if !defined(RL_GPUTEX_MALLOC)
#define RL_GPUTEX_MALLOC(sz) malloc(sz) #define RL_GPUTEX_MALLOC(sz) malloc(sz)
#define RL_GPUTEX_CALLOC(num, sz) calloc(num, 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) #define RL_GPUTEX_FREE(ptr) free(ptr)
#endif #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) #define RL_GPUTEX_MEMCPY(dest, src, num) memcpy(dest, src, num)
#endif #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 // NOTE: Avoiding those calls, also avoids const strings memory usage
// WARN: This macro expects that newline character is added automatically // WARN: This macro expects that newline character is added automatically
// in order to match the functionality of Raylib's TRACELOG() // in order to match the functionality of Raylib's TRACELOG()
#if defined(RL_GPUTEX_SHOW_WARN_INFO) #if defined(RL_GPUTEX_SHOW_LOG_INFO)
#if !defined(RL_GPUTEX_WARN) #if !defined(RL_GPUTEX_LOG)
#define RL_GPUTEX_WARN(...) (void)(printf("RL_GPUTEX: WARNING: " __VA_ARGS__), printf("\n")) #define RL_GPUTEX_LOG(...) (void)(printf("RL_GPUTEX: WARNING: " __VA_ARGS__), printf("\n"))
#endif #endif
#else #else
#if defined(RL_GPUTEX_WARN) #if defined(RL_GPUTEX_LOG)
// undefine it first in order to supress warnings about macro redefinition // Undefine it first in order to supress warnings about macro redefinition
#undef RL_GPUTEX_WARN #undef RL_GPUTEX_LOG
#endif #endif
#define RL_GPUTEX_WARN(...) #define RL_GPUTEX_LOG(...)
#endif #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] != ' ')) 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 else
{ {
@@ -257,8 +288,8 @@ void *rl_load_dds_from_memory(const unsigned char *file_data, unsigned int file_
*width = header->width; *width = header->width;
*height = header->height; *height = header->height;
if (*width % 4 != 0) RL_GPUTEX_WARN("DDS file width 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_WARN("DDS file height 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; 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); 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 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; ((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 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; ((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); 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 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; ((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 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: case FOURCC_DXT1:
{ {
if (header->ddspf.flags == 0x04) *format = PIXELFORMAT_COMPRESSED_DXT1_RGB; if (header->ddspf.flags == 0x04) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB;
else *format = PIXELFORMAT_COMPRESSED_DXT1_RGBA; else *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGBA;
} break; } break;
case FOURCC_DXT3: *format = PIXELFORMAT_COMPRESSED_DXT3_RGBA; break; case FOURCC_DXT3: *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA; break;
case FOURCC_DXT5: *format = PIXELFORMAT_COMPRESSED_DXT5_RGBA; break; case FOURCC_DXT5: *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT5_RGBA; break;
default: 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] != ' ')) 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 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); RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size);
if (header->format == 0) *format = PIXELFORMAT_COMPRESSED_ETC1_RGB; if (header->format == 0) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB;
else if (header->format == 1) *format = PIXELFORMAT_COMPRESSED_ETC2_RGB; else if (header->format == 1) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB;
else if (header->format == 3) *format = PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; 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') || if ((header->id[1] != 'K') || (header->id[2] != 'T') || (header->id[3] != 'X') ||
(header->id[4] != ' ') || (header->id[5] != '1') || (header->id[6] != '1')) (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 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); RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size);
if (header->gl_internal_format == 0x8D64) *format = PIXELFORMAT_COMPRESSED_ETC1_RGB; if (header->gl_internal_format == 0x8D64) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB;
else if (header->gl_internal_format == 0x9274) *format = PIXELFORMAT_COMPRESSED_ETC2_RGB; else if (header->gl_internal_format == 0x9274) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB;
else if (header->gl_internal_format == 0x9278) *format = PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA; 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! // 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 // 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 else
{ {
RL_GPUTEX_MEMCPY(file_data_ptr, &header, sizeof(ktx_header)); 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); 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); if (count == 0) RL_GPUTEX_LOG("FILEIO: [%s] Failed to write file", file_name);
else if (count != data_size) RL_GPUTEX_WARN("FILEIO: [%s] File partially written", 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 else (void)0; // WARN: this branch is handled by Raylib, since rl_gputex only prints warnings
int result = fclose(file); 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; 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 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)) 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 else
{ {
@@ -746,24 +777,24 @@ void *rl_load_pvr_from_memory(const unsigned char *file_data, unsigned int file_
*mips = header->num_mipmaps; *mips = header->num_mipmaps;
// Check data format // Check data format
if (((header->channels[0] == 'l') && (header->channels[1] == 0)) && (header->channel_depth[0] == 8)) *format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE; 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 = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA; 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')) else if ((header->channels[0] == 'r') && (header->channels[1] == 'g') && (header->channels[2] == 'b'))
{ {
if (header->channels[3] == 'a') 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; 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 = PIXELFORMAT_UNCOMPRESSED_R4G4B4A4; 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 = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; 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) 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; 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 = PIXELFORMAT_UNCOMPRESSED_R8G8B8; 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] == 2) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB;
else if (header->channels[0] == 3) *format = PIXELFORMAT_COMPRESSED_PVRT_RGBA; else if (header->channels[0] == 3) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA;
file_data_ptr += header->metadata_size; // Skip meta data header 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; int bpp = 0;
switch (*format) switch (*format)
{ {
case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break;
case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
case PIXELFORMAT_UNCOMPRESSED_R5G6B5: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5:
case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break;
case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break;
case PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break;
case PIXELFORMAT_COMPRESSED_PVRT_RGB: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB:
case PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break;
default: 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); 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; 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)) 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 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); RL_GPUTEX_MEMCPY(image_data, file_data_ptr, data_size);
if (bpp == 8) *format = PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA; if (bpp == 8) *format = RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA;
else if (bpp == 2) *format = PIXELFORMAT_COMPRESSED_ASTC_8x8_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) switch (format)
{ {
case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break;
case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
case PIXELFORMAT_UNCOMPRESSED_R5G6B5: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G6B5:
case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break;
case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break;
case PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break;
case PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break;
case PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break;
case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; case RL_GPUTEX_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break;
case PIXELFORMAT_COMPRESSED_DXT1_RGB: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB:
case PIXELFORMAT_COMPRESSED_DXT1_RGBA: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
case PIXELFORMAT_COMPRESSED_ETC1_RGB: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC1_RGB:
case PIXELFORMAT_COMPRESSED_ETC2_RGB: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_RGB:
case PIXELFORMAT_COMPRESSED_PVRT_RGB: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGB:
case PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; case RL_GPUTEX_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break;
case PIXELFORMAT_COMPRESSED_DXT3_RGBA: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
case PIXELFORMAT_COMPRESSED_DXT5_RGBA: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break;
case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; case RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break;
default: 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 texture is smaller, minimum dataSize is 8 or 16
if ((width < 4) && (height < 4)) if ((width < 4) && (height < 4))
{ {
if ((format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < PIXELFORMAT_COMPRESSED_DXT3_RGBA)) data_size = 8; if ((format >= RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) data_size = 8;
else if ((format >= PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) data_size = 16; else if ((format >= RL_GPUTEX_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_GPUTEX_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) data_size = 16;
} }
return data_size; return data_size;

View File

@@ -169,22 +169,14 @@
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
#define RL_GPUTEX_MALLOC RL_MALLOC
#define RL_GPUTEX_MALLOC RL_MALLOC #define RL_GPUTEX_CALLOC RL_CALLOC
#define RL_GPUTEX_CALLOC RL_CALLOC #define RL_GPUTEX_FREE RL_FREE
#define RL_GPUTEX_REALLOC RL_REALLOC #define RL_GPUTEX_LOG(...) TRACELOG(LOG_WARNING, "IMAGE: " __VA_ARGS__)
#define RL_GPUTEX_FREE RL_FREE #define RL_GPUTEX_SHOW_LOG_INFO
#define RL_GPUTEX_WARN(...) TRACELOG(LOG_WARNING, "IMAGE: " __VA_ARGS__)
#define RL_GPUTEX_SHOW_WARN_INFO
// FIXME: probably, we should NOT export public functions from rl_gputex
// but this is how it always worked... so let's keep it this way
#define RLGPUTEXAPI RLAPI
#define RL_GPUTEX_IMPLEMENTATION #define RL_GPUTEX_IMPLEMENTATION
#include "external/rl_gputex.h" // Required for: rl_load_xxx_from_memory() #include "external/rl_gputex.h" // Required for: rl_load_xxx_from_memory()
// NOTE: Used to read compressed textures data (multiple formats support) // NOTE: Used to read compressed textures data (multiple formats support)
#if defined(__GNUC__) // GCC and Clang #if defined(__GNUC__) // GCC and Clang
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif