Browse Source

REVIEWED: `rl_gputex.h` library to be usable standalone

pull/4886/merge
Ray 1 day ago
parent
commit
d7893141f3
2 changed files with 125 additions and 102 deletions
  1. +120
    -89
      src/external/rl_gputex.h
  2. +5
    -13
      src/rtextures.c

+ 120
- 89
src/external/rl_gputex.h View File

@ -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;

+ 5
- 13
src/rtextures.c View File

@ -169,22 +169,14 @@
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
#define RL_GPUTEX_MALLOC RL_MALLOC
#define RL_GPUTEX_CALLOC RL_CALLOC
#define RL_GPUTEX_REALLOC RL_REALLOC
#define RL_GPUTEX_FREE RL_FREE
#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_MALLOC RL_MALLOC
#define RL_GPUTEX_CALLOC RL_CALLOC
#define RL_GPUTEX_FREE RL_FREE
#define RL_GPUTEX_LOG(...) TRACELOG(LOG_WARNING, "IMAGE: " __VA_ARGS__)
#define RL_GPUTEX_SHOW_LOG_INFO
#define RL_GPUTEX_IMPLEMENTATION
#include "external/rl_gputex.h" // Required for: rl_load_xxx_from_memory()
// NOTE: Used to read compressed textures data (multiple formats support)
#if defined(__GNUC__) // GCC and Clang
#pragma GCC diagnostic pop
#endif

Loading…
Cancel
Save