LoadBufferFormatted, SetBufferData and CopyBufferData. Compressed resource file example.

This commit is contained in:
jussi
2024-08-27 21:41:31 +03:00
parent af2bf6f7a2
commit 35e73465ac
9 changed files with 304 additions and 43 deletions

View File

@@ -4,7 +4,7 @@
#include "textures.h"
#include "lua_core.h"
static int getBufferElementSize( Buffer* buffer ) {
static size_t getBufferElementSize( Buffer* buffer ) {
switch ( buffer->type ) {
case BUFFER_UNSIGNED_CHAR: return sizeof( unsigned char );
case BUFFER_UNSIGNED_SHORT: return sizeof( unsigned short );
@@ -2141,7 +2141,7 @@ int lcoreGetAutomationEvent( lua_State* L ) {
lua_pushlightuserdata( L, &list->events[ index ] );
}
else {
TraceLog( LOG_WARNING, "GetAutomationEvent index %d out of bounds", index );
TraceLog( state->logLevelInvalid, "GetAutomationEvent index %d out of bounds", index );
lua_pushnil( L );
}
@@ -3388,10 +3388,10 @@ int lcoreLoadBuffer( lua_State* L ) {
int t = 1;
int i = 0;
unsigned char* ucp = buffer.data;
unsigned short *usp = buffer.data;
unsigned short* usp = buffer.data;
unsigned int* uip = buffer.data;
char* cp = buffer.data;
short *sp = buffer.data;
short* sp = buffer.data;
int* ip = buffer.data;
float* fp = buffer.data;
double* dp = buffer.data;
@@ -3444,7 +3444,32 @@ int lcoreLoadBuffer( lua_State* L ) {
}
/*
> buffer = RL.LoadBufferFromFile( string path, type int )
> buffer = RL.LoadBufferFormatted( int length, int type, int value )
Load formatted buffer with all values set to 'value'
- Success return Buffer
*/
int lcoreLoadBufferFormatted( lua_State* L ) {
int len = luaL_checkinteger( L, 1 );
int type = luaL_checkinteger( L, 2 );
int value = luaL_checkinteger( L, 3 );
Buffer buffer = {
.type = type
};
buffer.size = len * getBufferElementSize( &buffer );
buffer.data = malloc( buffer.size );
memset( buffer.data, value, buffer.size );
uluaPushBuffer( L, buffer );
return 1;
}
/*
> buffer = RL.LoadBufferFromFile( string path, int type )
Read buffer data from binary file
@@ -3461,16 +3486,15 @@ int lcoreLoadBufferFromFile( lua_State* L ) {
.size = fileLen,
.data = malloc( fileLen )
};
size_t elementSize = getBufferElementSize( &buffer );
FILE* file;
file = fopen( path, "rb" );
if ( file == NULL ) {
TraceLog( LOG_WARNING, "Invalid file %s\n", path );
TraceLog( state->logLevelInvalid, "Invalid file %s\n", path );
lua_pushnil( L );
return 1;
}
fread( buffer.data, elementSize, buffer.size / elementSize, file );
fread( buffer.data, buffer.size, 1, file );
fclose( file );
uluaPushBuffer( L, buffer );
@@ -3516,6 +3540,92 @@ int lcoreUnloadBuffer( lua_State* L ) {
return 0;
}
/*
> RL.CopyBufferData( Buffer dst, Buffer src, int posDst, int posSrc, int length )
Copy buffer data to another buffer. src element size is used for length
*/
int lcoreCopyBufferData( lua_State* L ) {
Buffer* dst = uluaGetBuffer( L, 1 );
Buffer* src = uluaGetBuffer( L, 2 );
int posDst = luaL_checkinteger( L, 3 );
int posSrc = luaL_checkinteger( L, 4 );
int length = luaL_checkinteger( L, 5 );
void* dstP = dst->data + posDst * getBufferElementSize( dst );
void* srcP = src->data + posSrc * getBufferElementSize( src );
size_t size = length * getBufferElementSize( src );
/* Note that we use src element size for dst length. */
if ( posDst < 0 || dst->size < posDst * getBufferElementSize( dst ) + size ) {
TraceLog( state->logLevelInvalid, "CopyBufferData. posDst %d with length %d out of bounds", posDst, length );
return 0;
}
if ( posSrc < 0 || src->size < posSrc * getBufferElementSize( src ) + size ) {
TraceLog( state->logLevelInvalid, "CopyBufferData. posSrc %d with length %d out of bounds", posSrc, length );
return 0;
}
memcpy( dstP, srcP, size );
return 0;
}
/*
> RL.SetBufferData( Buffer buffer, int position, any value )
Set buffer data value
*/
int lcoreSetBufferData( lua_State* L ) {
Buffer* buffer = uluaGetBuffer( L, 1 );
size_t position = luaL_checkinteger( L, 2 );
if ( position < 0 || buffer->size / getBufferElementSize( buffer ) <= position ) {
TraceLog( state->logLevelInvalid, "SetBufferData. position %d out of bounds", position );
return 0;
}
size_t offset = position * getBufferElementSize( buffer );
unsigned char* ucp = buffer->data + offset;
unsigned short* usp = buffer->data + offset;
unsigned int* uip = buffer->data + offset;
char* cp = buffer->data + offset;
short* sp = buffer->data + offset;
int* ip = buffer->data + offset;
float* fp = buffer->data + offset;
double* dp = buffer->data + offset;
switch ( buffer->type ) {
case BUFFER_UNSIGNED_CHAR:
*ucp = (unsigned char)lua_tointeger( L, -1 );
break;
case BUFFER_UNSIGNED_SHORT:
*usp = (unsigned short)lua_tointeger( L, -1 );
break;
case BUFFER_UNSIGNED_INT:
*uip = (unsigned int)lua_tointeger( L, -1 );
break;
case BUFFER_CHAR:
*cp = (char)lua_tointeger( L, -1 );
break;
case BUFFER_SHORT:
*sp = (short)lua_tointeger( L, -1 );
break;
case BUFFER_INT:
*ip = (int)lua_tointeger( L, -1 );
break;
case BUFFER_FLOAT:
*fp = (float)lua_tonumber( L, -1 );
break;
case BUFFER_DOUBLE:
*dp = (double)lua_tonumber( L, -1 );
break;
default:
break;
}
return 0;
}
/*
> data = RL.GetBufferData( Buffer buffer, int position, int length )
@@ -3696,11 +3806,10 @@ int lcoreExportBuffer( lua_State* L ) {
Buffer* buffer = uluaGetBuffer( L, 1 );
const char* path = luaL_checkstring( L, 2 );
size_t elementSize = getBufferElementSize( buffer );
FILE* file;
file = fopen( path, "wb" );
fwrite( buffer->data, elementSize, buffer->size / elementSize, file );
fwrite( buffer->data, buffer->size, 1, file );
fclose( file );
return 0;

View File

@@ -1512,9 +1512,12 @@ void luaRegister() {
assingGlobalFunction( "UpdateCamera3DPro", lcoreUpdateCamera3DPro );
/* Buffer management functions. */
assingGlobalFunction( "LoadBuffer", lcoreLoadBuffer );
assingGlobalFunction( "LoadBufferFormatted", lcoreLoadBufferFormatted );
assingGlobalFunction( "LoadBufferFromFile", lcoreLoadBufferFromFile );
assingGlobalFunction( "LoadBufferFromString", lcoreLoadBufferFromString );
assingGlobalFunction( "UnloadBuffer", lcoreUnloadBuffer );
assingGlobalFunction( "CopyBufferData", lcoreCopyBufferData );
assingGlobalFunction( "SetBufferData", lcoreSetBufferData );
assingGlobalFunction( "GetBufferData", lcoreGetBufferData );
assingGlobalFunction( "GetBufferType", lcoreGetBufferType );
assingGlobalFunction( "GetBufferSize", lcoreGetBufferSize );

View File

@@ -1071,13 +1071,13 @@ int ltexturesImageDrawRectangleLines( lua_State* L ) {
Draw a source image within a destination image (Tint applied to source)
*/
int ltexturesImageDraw( lua_State* L ) {
Image* imageDstId = uluaGetImage( L, 1 );
Image* imageSrcId = uluaGetImage( L, 2 );
Image* imageDst = uluaGetImage( L, 1 );
Image* imageSrc = uluaGetImage( L, 2 );
Rectangle srcRec = uluaGetRectangle( L, 3 );
Rectangle dstRec = uluaGetRectangle( L, 4 );
Color tint = uluaGetColor( L, 5 );
ImageDraw( imageDstId, *imageSrcId, srcRec, dstRec, tint );
ImageDraw( imageDst, *imageSrc, srcRec, dstRec, tint );
return 0;
}
@@ -2061,18 +2061,17 @@ int ltexturesGetColor( lua_State* L ) {
}
/*
> size = RL.GetPixelDataSize( int width, int height, int format )
> size = RL.GetPixelDataSize( Vector2 size, int format )
Get pixel data size in bytes for certain format
- Success return int
*/
int ltexturesGetPixelDataSize( lua_State* L ) {
int width = luaL_checkinteger( L, 1 );
int height = luaL_checkinteger( L, 2 );
int format = luaL_checkinteger( L, 3 );
Vector2 size = uluaGetVector2( L, 1 );
int format = luaL_checkinteger( L, 2 );
lua_pushinteger( L, GetPixelDataSize( width, height, format ) );
lua_pushinteger( L, GetPixelDataSize( size.x, size.y, format ) );
return 1;
}