packages feed

h-raylib-5.1.1.0: lib/rl_internal.c

/**
 * See rl_internal.h
 */

#include "rl_internal.h"

RLBIND void UnloadAudioBuffer_(rAudioBuffer *buffer)
{
    Sound sound = { 0 };
    AudioStream stream = { 0 };
    sound.stream = stream;
    stream.buffer = buffer;
    UnloadSound(sound);
}

RLBIND void UnloadAudioBufferAlias(rAudioBuffer *alias)
{
    unsigned char **dataPtr = (unsigned char **)((char *)alias + 368); // Hack to get a pointer to alias.data (the struct definition is not in scope)
    *dataPtr = 0;                                                      // Set alias.data to NULL so the data is not cleared
    UnloadAudioBuffer_(alias);
}

RLBIND void UnloadMusicStreamData(int ctxType, void *ctxData)
{
    Music music = {0};
    music.ctxData = ctxData;
    music.ctxType = ctxType;

    UnloadMusicStream(music);
}

RLBIND int rlGetPixelDataSize(int width, int height, int format)
{
    int dataSize = 0; // Size in bytes
    int bpp = 0;      // Bits per pixel

    switch (format)
    {
    case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE:
        bpp = 8;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
    case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5:
    case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
    case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4:
        bpp = 16;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8:
        bpp = 32;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8:
        bpp = 24;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R32:
        bpp = 32;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32:
        bpp = 32 * 3;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
        bpp = 32 * 4;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R16:
        bpp = 16;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
        bpp = 16 * 3;
        break;
    case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
        bpp = 16 * 4;
        break;
    case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB:
    case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
    case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
    case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
    case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
    case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA:
        bpp = 4;
        break;
    case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
    case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
    case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
    case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA:
        bpp = 8;
        break;
    case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA:
        bpp = 2;
        break;
    default:
        break;
    }

    dataSize = width * height * bpp / 8; // Total data size in bytes

    // Most compressed formats works on 4x4 blocks,
    // if texture is smaller, minimum dataSize is 8 or 16
    if ((width < 4) && (height < 4))
    {
        if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA))
            dataSize = 8;
        else if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))
            dataSize = 16;
    }

    return dataSize;
}