summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjussi2024-12-15 18:38:07 +0200
committerjussi2024-12-15 18:38:07 +0200
commit5ff5a3713700aa5ad201be820597c93b61b61860 (patch)
tree679301661c3a1e308d957dc1328254d9d07f2f87
parentb4b81f68c4274a6b4d0b5039b83459a1345ca6da (diff)
downloadreilua-enhanced-5ff5a3713700aa5ad201be820597c93b61b61860.tar.gz
reilua-enhanced-5ff5a3713700aa5ad201be820597c93b61b61860.tar.bz2
reilua-enhanced-5ff5a3713700aa5ad201be820597c93b61b61860.zip
SwapBufferEndianness.
-rw-r--r--API.md6
-rw-r--r--ReiLua_API.lua5
-rw-r--r--changelog1
-rw-r--r--devnotes2
-rw-r--r--include/core.h1
-rw-r--r--src/core.c114
-rw-r--r--src/lua_core.c1
7 files changed, 112 insertions, 18 deletions
diff --git a/API.md b/API.md
index 6acb1b2..b4d51e0 100644
--- a/API.md
+++ b/API.md
@@ -6495,6 +6495,12 @@ Set buffer data value
---
+> RL.SwapBufferEndianness( Buffer buffer )
+
+Swap buffer endianness from big endian to little endian and vice versa
+
+---
+
> data = RL.GetBufferData( Buffer buffer, int position, int length )
Get buffer data as table in the format it was stored
diff --git a/ReiLua_API.lua b/ReiLua_API.lua
index 2a54389..d08eae6 100644
--- a/ReiLua_API.lua
+++ b/ReiLua_API.lua
@@ -2984,6 +2984,11 @@ function RL.CopyBufferData( dst, src, posDst, posSrc, size ) end
---@return any RL.SetBufferData
function RL.SetBufferData( buffer, position, value ) end
+---Swap buffer endianness from big endian to little endian and vice versa
+---@param buffer any
+---@return any RL.SwapBufferEndianness
+function RL.SwapBufferEndianness( buffer ) end
+
---Get buffer data as table in the format it was stored
---- Success return data{}
---@param buffer any
diff --git a/changelog b/changelog
index 2037a08..372703f 100644
--- a/changelog
+++ b/changelog
@@ -30,6 +30,7 @@ DETAILED CHANGES:
- ADDED: EXPOSE_API_SYMBOLS.
- ADDED: SetShaderValueWithBuffer and SetShaderValueVWithBuffer.
- ADDED: Gui Icons enumeration.
+ - ADDED: SwapBufferEndianness.
------------------------------------------------------------------------
Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0
diff --git a/devnotes b/devnotes
index 773e399..b824569 100644
--- a/devnotes
+++ b/devnotes
@@ -17,8 +17,6 @@ Backlog {
* Models
* Material mapType range checks.
* Mesh bone weight management?
- * CBuffer
- * Swap endianess.
* Textures
* Try making atlas packer with stbrp_pack_rects.
diff --git a/include/core.h b/include/core.h
index 0813268..ab115ae 100644
--- a/include/core.h
+++ b/include/core.h
@@ -267,6 +267,7 @@ int lcoreLoadBufferFromString( lua_State* L );
int lcoreUnloadBuffer( lua_State* L );
int lcoreCopyBufferData( lua_State* L );
int lcoreSetBufferData( lua_State* L );
+int lcoreSwapBufferEndianness( lua_State* L );
int lcoreGetBufferData( lua_State* L );
int lcoreGetBufferAsString( lua_State* L );
int lcoreGetBufferType( lua_State* L );
diff --git a/src/core.c b/src/core.c
index 093c07b..a84f7b2 100644
--- a/src/core.c
+++ b/src/core.c
@@ -24,6 +24,38 @@ void unloadBuffer( Buffer* buffer ) {
TraceLog( LOG_INFO, "BUFFER: Unloaded buffer with %u bytes of data", buffer->size );
}
+/* Byte swaps. */
+
+static uint16_t swapU16( uint16_t val ) {
+ return (val << 8) | (val >> 8 );
+}
+
+static int16_t swapS16( int16_t val ) {
+ return (val << 8) | ( (val >> 8) & 0xFF);
+}
+
+static uint32_t swapU32( uint32_t val ) {
+ val = ( (val << 8) & 0xFF00FF00 ) | ( (val >> 8) & 0xFF00FF );
+ return (val << 16) | (val >> 16);
+}
+
+static int32_t swapS32( int32_t val ) {
+ val = ( (val << 8) & 0xFF00FF00) | ( (val >> 8) & 0xFF00FF );
+ return (val << 16) | ( (val >> 16) & 0xFFFF);
+}
+
+static uint64_t swapU64( uint64_t val ) {
+ val = ( (val << 8) & 0xFF00FF00FF00FF00ULL ) | ( (val >> 8) & 0x00FF00FF00FF00FFULL );
+ val = ( (val << 16) & 0xFFFF0000FFFF0000ULL ) | ( (val >> 16) & 0x0000FFFF0000FFFFULL );
+ return (val << 32) | (val >> 32);
+}
+
+static int64_t swapS64( int64_t val ) {
+ val = ( (val << 8) & 0xFF00FF00FF00FF00ULL ) | ( (val >> 8) & 0x00FF00FF00FF00FFULL );
+ val = ( (val << 16) & 0xFFFF0000FFFF0000ULL ) | ( (val >> 16) & 0x0000FFFF0000FFFFULL );
+ return (val << 32) | ( (val >> 32) & 0xFFFFFFFFULL);
+}
+
/*
## Core - Window-related functions
*/
@@ -3835,6 +3867,69 @@ int lcoreSetBufferData( lua_State* L ) {
}
/*
+> RL.SwapBufferEndianness( Buffer buffer )
+
+Swap buffer endianness from big endian to little endian and vice versa
+*/
+int lcoreSwapBufferEndianness( lua_State* L ) {
+ Buffer* buffer = uluaGetBuffer( L, 1 );
+
+ size_t elementSize = getBufferElementSize( buffer );
+ size_t bufLen = buffer->size / elementSize;
+
+ if ( buffer->type == BUFFER_UNSIGNED_SHORT ) {
+ unsigned short *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapU16( *p );
+ p++;
+ }
+ }
+ else if ( buffer->type == BUFFER_UNSIGNED_INT ) {
+ unsigned int *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapU32( *p );
+ p++;
+ }
+ }
+ else if ( buffer->type == BUFFER_SHORT ) {
+ short *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapS16( *p );
+ p++;
+ }
+ }
+ else if ( buffer->type == BUFFER_INT ) {
+ int *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapS32( *p );
+ p++;
+ }
+ }
+ else if ( buffer->type == BUFFER_FLOAT ) {
+ float *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapU32( *p );
+ p++;
+ }
+ }
+ else if ( buffer->type == BUFFER_DOUBLE ) {
+ double *p = buffer->data;
+
+ for ( int i = 0; i < bufLen; i++ ) {
+ *p = swapU64( *p );
+ p++;
+ }
+ }
+
+ return 0;
+}
+
+/*
> data = RL.GetBufferData( Buffer buffer, int position, int length )
Get buffer data as table in the format it was stored
@@ -3846,10 +3941,11 @@ int lcoreGetBufferData( lua_State* L ) {
size_t position = luaL_checkinteger( L, 2 );
size_t length = luaL_checkinteger( L, 3 );
+ size_t bufLen = buffer->size / getBufferElementSize( buffer );
+ size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
+
if ( buffer->type == BUFFER_UNSIGNED_CHAR ) {
unsigned char* p = buffer->data + position * sizeof( unsigned char );
- size_t bufLen = buffer->size / sizeof( unsigned char );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3860,8 +3956,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_UNSIGNED_SHORT ) {
unsigned short *p = buffer->data + position * sizeof( unsigned short );
- size_t bufLen = buffer->size / sizeof( unsigned short );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3872,8 +3966,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_UNSIGNED_INT ) {
unsigned int* p = buffer->data + position * sizeof( unsigned int );
- size_t bufLen = buffer->size / sizeof( unsigned int );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3884,8 +3976,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_CHAR ) {
char* p = buffer->data + position * sizeof( char );
- size_t bufLen = buffer->size / sizeof( char );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3896,8 +3986,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_SHORT ) {
short *p = buffer->data + position * sizeof( short );
- size_t bufLen = buffer->size / sizeof( short );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3908,8 +3996,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_INT ) {
int* p = buffer->data + position * sizeof( int );
- size_t bufLen = buffer->size / sizeof( int );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3920,8 +4006,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_FLOAT ) {
float* p = buffer->data + position * sizeof( float );
- size_t bufLen = buffer->size / sizeof( float );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
@@ -3932,8 +4016,6 @@ int lcoreGetBufferData( lua_State* L ) {
}
else if ( buffer->type == BUFFER_DOUBLE ) {
double* p = buffer->data + position * sizeof( double );
- size_t bufLen = buffer->size / sizeof( double );
- size_t count = bufLen < ( position + length ) ? ( position + length ) - bufLen : length;
lua_createtable( L, count, 0 );
for ( int i = 0; i < count; i++ ) {
diff --git a/src/lua_core.c b/src/lua_core.c
index f6e7af3..95f9ff0 100644
--- a/src/lua_core.c
+++ b/src/lua_core.c
@@ -1775,6 +1775,7 @@ void luaRegister() {
assingGlobalFunction( "UnloadBuffer", lcoreUnloadBuffer );
assingGlobalFunction( "CopyBufferData", lcoreCopyBufferData );
assingGlobalFunction( "SetBufferData", lcoreSetBufferData );
+ assingGlobalFunction( "SwapBufferEndianness", lcoreSwapBufferEndianness );
assingGlobalFunction( "GetBufferData", lcoreGetBufferData );
assingGlobalFunction( "GetBufferAsString", lcoreGetBufferAsString );
assingGlobalFunction( "GetBufferType", lcoreGetBufferType );