#include "main.h" #include "state.h" #include "textures.h" #include "text.h" #include "lua_core.h" static void checkImageRealloc( int i ) { if ( i == state->imageCount ) { state->imageCount++; } if ( state->imageCount == state->imageAlloc ) { state->imageAlloc += ALLOC_PAGE_SIZE; state->images = realloc( state->images, state->imageAlloc * sizeof( Image* ) ); for ( i = state->imageCount; i < state->imageAlloc; i++ ) { state->images[i] = NULL; } } } static void checkTextureRealloc( int i ) { if ( i == state->textureCount ) { state->textureCount++; } if ( state->textureCount == state->textureAlloc ) { state->textureAlloc += ALLOC_PAGE_SIZE; state->textures = realloc( state->textures, state->textureAlloc * sizeof( Texture2D* ) ); for ( i = state->textureCount; i < state->textureAlloc; i++ ) { state->textures[i] = NULL; } } } static void checkRenderTextureRealloc( int i ) { if ( i == state->renderTextureCount ) { state->renderTextureCount++; } if ( state->renderTextureCount == state->renderTextureAlloc ) { state->renderTextureAlloc += ALLOC_PAGE_SIZE; state->renderTextures = realloc( state->renderTextures, state->renderTextureAlloc * sizeof( RenderTexture2D* ) ); for ( i = state->renderTextureCount; i < state->renderTextureAlloc; i++ ) { state->renderTextures[i] = NULL; } } } bool validImage( size_t id ) { if ( id < 0 || state->imageCount < id || state->images[ id ] == NULL ) { TraceLog( LOG_WARNING, "%s %d", "Invalid image", id ); return false; } else { return true; } } bool validTexture( size_t id ) { if ( id < 0 || state->textureCount < id || state->textures[ id ] == NULL ) { TraceLog( LOG_WARNING, "%s %d", "Invalid texture", id ); return false; } else { return true; } } bool validRenderTexture( size_t id ) { if ( id < 0 || state->renderTextureCount < id || state->renderTextures[ id ] == NULL ) { TraceLog( LOG_WARNING, "%s %d", "Invalid renderTexture", id ); return false; } else { return true; } } bool validSourceTexture( size_t id ) { switch ( state->textureSource ) { case TEXTURE_SOURCE_TEXTURE: return validTexture( id ); case TEXTURE_SOURCE_RENDER_TEXTURE: return validRenderTexture( id ); default: return validTexture( id ); break; } } static int newImage() { int i = 0; for ( i = 0; i < state->imageCount; i++ ) { if ( state->images[i] == NULL ) { break; } } state->images[i] = malloc( sizeof( Image ) ); checkImageRealloc( i ); return i; } static int newTexture() { int i = 0; for ( i = 0; i < state->textureCount; i++ ) { if ( state->textures[i] == NULL ) { break; } } state->textures[i] = malloc( sizeof( Texture2D ) ); checkTextureRealloc( i ); return i; } Texture2D* texturesGetSourceTexture( size_t index ) { switch ( state->textureSource ) { case TEXTURE_SOURCE_TEXTURE: return state->textures[ index ]; case TEXTURE_SOURCE_RENDER_TEXTURE: return &state->renderTextures[ index ]->texture; default: return state->textures[ index ]; break; } } /* ## Textures - Image Loading */ /* > image = RL_LoadImage( string fileName ) Load image from file into CPU memory ( RAM ) - Failure return -1 - Success return int */ int ltexturesLoadImage( lua_State *L ) { if ( !lua_isstring( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadImage( string fileName )" ); lua_pushinteger( L, -1 ); return 1; } if ( FileExists( lua_tostring( L, -1 ) ) ) { int i = newImage(); *state->images[i] = LoadImage( lua_tostring( L, -1 ) ); lua_pushinteger( L, i ); return 1; } else { lua_pushinteger( L, -1 ); return 1; } } /* > image = RL_LoadImageFromTexture( Texture2D texture ) Load image from GPU texture data - Failure return -1 - Success return int */ int ltexturesLoadImageFromTexture( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadImageFromTexture( Texture2D texture )" ); lua_pushinteger( L, -1 ); return 1; } size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushinteger( L, -1 ); return 1; } int i = newImage(); *state->images[i] = LoadImageFromTexture( *texturesGetSourceTexture( texId ) ); lua_pushinteger( L, i ); return 1; } /* > image = RL_LoadImageFromScreen() Load image from screen buffer and ( screenshot ) - Success return int */ int ltexturesLoadImageFromScreen( lua_State *L ) { int i = newImage(); *state->images[i] = LoadImageFromScreen(); lua_pushinteger( L, i ); return 1; } /* > success = RL_UnloadImage( Image image ) Unload image from CPU memory ( RAM ) - Failure return false - Success return true */ int ltexturesUnloadImage( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_UnloadImage( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t id = lua_tointeger( L, -1 ); if ( !validImage( id ) ) { lua_pushboolean( L, false ); return 1; } UnloadImage( *state->images[ id ] ); state->images[ id ] = NULL; lua_pushboolean( L, true ); return 1; } /* > success = RL_ExportImage( Image image, string fileName ) Export image data to file, returns true on success - Failure return nil - Success return bool */ int ltexturesExportImage( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isstring( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ExportImage( Image image, string fileName )" ); lua_pushnil( L ); return 1; } size_t id = lua_tointeger( L, -2 ); if ( !validImage( id ) ) { lua_pushnil( L ); return 1; } lua_pushboolean( L, ExportImage( *state->images[ id ], lua_tostring( L, -1 ) ) ); return 1; } /* > success = RL_ExportImageAsCode( Image image, string fileName ) Export image as code file defining an array of bytes, returns true on success - Failure return nil - Success return bool */ int ltexturesExportImageAsCode( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isstring( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ExportImageAsCode( Image image, string fileName )" ); lua_pushnil( L ); return 1; } size_t id = lua_tointeger( L, -2 ); if ( !validImage( id ) ) { lua_pushnil( L ); return 1; } lua_pushboolean( L, ExportImageAsCode( *state->images[ id ], lua_tostring( L, -1 ) ) ); return 1; } /* ## Textures - Image Generation */ /* > image = RL_GenImageColor( int width, int height, Color color ) Generate image: plain color - Failure return -1 - Success return int */ int ltexturesGenImageColor( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageColor( int width, int height, Color color )" ); lua_pushinteger( L, -1 ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); int height = lua_tointeger( L, -1 ); lua_pop( L, 1 ); int width = lua_tointeger( L, -1 ); int i = newImage(); *state->images[i] = GenImageColor( width, height, color ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageGradientV( Vector2 size, Color top, Color bottom ) Generate image: vertical gradient - Failure return -1 - Success return int */ int ltexturesGenImageGradientV( lua_State *L ) { if ( !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageGradientV( Vector2 size, Color top, Color bottom )" ); lua_pushinteger( L, -1 ); return 1; } Color bottom = uluaGetColor( L ); lua_pop( L, 1 ); Color top = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageGradientV( (int)size.x, (int)size.y, top, bottom ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageGradientH( Vector2 size, Color left, Color right ) Generate image: horizontal gradient - Failure return -1 - Success return int */ int ltexturesGenImageGradientH( lua_State *L ) { if ( !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageGradientH( Vector2 size, Color left, Color right )" ); lua_pushinteger( L, -1 ); return 1; } Color right = uluaGetColor( L ); lua_pop( L, 1 ); Color left = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageGradientH( (int)size.x, (int)size.y, left, right ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer ) Generate image: radial gradient - Failure return -1 - Success return int */ int ltexturesGenImageGradientRadial( lua_State *L ) { if ( !lua_istable( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageGradientRadial( Vector2 size, float density, Color inner, Color outer )" ); lua_pushinteger( L, -1 ); return 1; } Color outer = uluaGetColor( L ); lua_pop( L, 1 ); Color inner = uluaGetColor( L ); lua_pop( L, 1 ); float density = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageGradientRadial( (int)size.x, (int)size.y, density, inner, outer ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 ) Generate image: checked - Failure return -1 - Success return int */ int ltexturesGenImageChecked( lua_State *L ) { if ( !lua_istable( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageChecked( Vector2 size, Vector2 checks, Color col1, Color col2 )" ); lua_pushinteger( L, -1 ); return 1; } Color col2 = uluaGetColor( L ); lua_pop( L, 1 ); Color col1 = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 checks = uluaGetVector2( L ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageChecked( (int)size.x, (int)size.y, (int)checks.x, (int)checks.y, col1, col2 ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageWhiteNoise( Vector2 size, float factor ) Generate image: white noise - Failure return -1 - Success return int */ int ltexturesGenImageWhiteNoise( lua_State *L ) { if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageWhiteNoise( Vector2 size, float factor )" ); lua_pushinteger( L, -1 ); return 1; } float factor = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageWhiteNoise( (int)size.x, (int)size.y, factor ); lua_pushinteger( L, i ); return 1; } /* > image = RL_GenImageCellular( Vector2 size, int tileSize ) Generate image: cellular algorithm. Bigger tileSize means bigger cells - Failure return -1 - Success return int */ int ltexturesGenImageCellular( lua_State *L ) { if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenImageCellular( Vector2 size, int tileSize )" ); lua_pushinteger( L, -1 ); return 1; } int tileSize = lua_tointeger( L, -1 ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); int i = newImage(); *state->images[i] = GenImageCellular( (int)size.x, (int)size.y, tileSize ); lua_pushinteger( L, i ); return 1; } /* ## Textures - Image Manipulation Functions */ /* > image = RL_ImageCopy( Image image ) Create an image duplicate ( useful for transformations ) - Failure return -1 - Success return int */ int ltexturesImageCopy( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageCopy( Image image )" ); lua_pushinteger( L, -1 ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushinteger( L, -1 ); return 1; } int i = newImage(); *state->images[i] = ImageCopy( *state->images[ imageId ] ); lua_pushinteger( L, i ); return 1; } /* > image = RL_ImageFromImage( Image image, Rectangle rec ) Create an image from another image piece - Failure return -1 - Success return int */ int ltexturesImageFromImage( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageFromImage( Image image, Rectangle rec )" ); lua_pushinteger( L, -1 ); return 1; } Rectangle rec = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushinteger( L, -1 ); return 1; } int i = newImage(); *state->images[i] = ImageFromImage( *state->images[ imageId ], rec ); lua_pushinteger( L, i ); return 1; } /* > image = RL_ImageText( Font font, string text, float fontSize, float spacing, Color tint ) Create an image from text ( custom sprite font ) - Failure return -1 - Success return int */ int ltexturesImageText( lua_State *L ) { if ( !lua_isnumber( L, -5 ) || !lua_isstring( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageText( Font font, string text, float fontSize, float spacing, Color tint )" ); lua_pushinteger( L, -1 ); return 1; } Color tint = uluaGetColor( L ); lua_pop( L, 1 ); float spacing = lua_tonumber( L, -1 ); lua_pop( L, 1 ); float fontSize = lua_tonumber( L, -1 ); lua_pop( L, 1 ); size_t fontId = lua_tointeger( L, -2 ); if ( !validFont( fontId ) ) { lua_pushinteger( L, -1 ); return 1; } int i = newImage(); *state->images[i] = ImageTextEx( *state->fonts[ fontId ], lua_tostring( L, -1 ), fontSize, spacing, tint ); lua_pushinteger( L, i ); return 1; } /* > success = RL_ImageFormat( Image image, int newFormat ) Convert image data to desired format - Failure return false - Success return true */ int ltexturesImageFormat( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageFormat( Image image, int newFormat )" ); lua_pushboolean( L, false ); return 1; } int newFormat = lua_tointeger( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageFormat( state->images[ imageId ], newFormat ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageToPOT( Image image, Color fill ) Convert image to POT ( power-of-two ) - Failure return false - Success return true */ int ltexturesImageToPOT( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageToPOT( Image image, Color fill )" ); lua_pushboolean( L, false ); return 1; } Color fill = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageToPOT( state->images[ imageId ], fill ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageCrop( Image image, Rectangle crop ) Crop an image to a defined rectangle - Failure return false - Success return true */ int ltexturesImageCrop( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageCrop( Image image, Rectangle crop )" ); lua_pushboolean( L, false ); return 1; } Rectangle crop = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageCrop( state->images[ imageId ], crop ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageAlphaCrop( Image image, float threshold ) Crop image depending on alpha value - Failure return false - Success return true */ int ltexturesImageAlphaCrop( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageAlphaCrop( Image image, float threshold )" ); lua_pushboolean( L, false ); return 1; } float threshold = lua_tonumber( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageAlphaCrop( state->images[ imageId ], threshold ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageAlphaClear( Image image, Color color, float threshold ) Clear alpha channel to desired color - Failure return false - Success return true */ int ltexturesImageAlphaClear( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageAlphaClear( Image image, Color color, float threshold )" ); lua_pushboolean( L, false ); return 1; } float threshold = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Color color = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageAlphaClear( state->images[ imageId ], color, threshold ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageAlphaMask( Image image, Image alphaMask ) Apply alpha mask to image - Failure return false - Success return true */ int ltexturesImageAlphaMask( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageAlphaMask( Image image, Image alphaMask )" ); lua_pushboolean( L, false ); return 1; } size_t alphaMaskId = lua_tonumber( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) || !validImage( alphaMaskId ) ) { lua_pushboolean( L, false ); return 1; } ImageAlphaMask( state->images[ imageId ], *state->images[ alphaMaskId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageAlphaPremultiply( Image image ) Premultiply alpha channel - Failure return false - Success return true */ int ltexturesImageAlphaPremultiply( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageAlphaPremultiply( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageAlphaPremultiply( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageResize( Image image, Vector2 size ) Resize image ( Bicubic scaling algorithm ) - Failure return false - Success return true */ int ltexturesImageResize( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageResize( Image image, Vector2 size )" ); lua_pushboolean( L, false ); return 1; } Vector2 size = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageResize( state->images[ imageId ], size.x, size.y ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageResizeNN( Image image, Vector2 size ) Resize image ( Nearest-Neighbor scaling algorithm ) - Failure return false - Success return true */ int ltexturesImageResizeNN( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageResizeNN( Image image, Vector2 size )" ); lua_pushboolean( L, false ); return 1; } Vector2 size = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageResizeNN( state->images[ imageId ], size.x, size.y ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageResizeCanvas( Image image, Vector2 size, Vector2 offset, Color fill ) Resize canvas and fill with color - Failure return false - Success return true */ int ltexturesImageResizeCanvas( lua_State *L ) { if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageResizeCanvas( Image image, Vector2 size, Vector2 offset, Color fill )" ); lua_pushboolean( L, false ); return 1; } Color fill = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 offset = uluaGetVector2( L ); lua_pop( L, 1 ); Vector2 size = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageResizeCanvas( state->images[ imageId ], size.x, size.y, offset.x, offset.y, fill ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageMipmaps( Image image ) Generate all mipmap levels for a provided image - Failure return false - Success return true */ int ltexturesImageMipmaps( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageMipmaps( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageMipmaps( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDither( Image image, Color bpp ) Dither image data to 16bpp or lower ( Floyd-Steinberg dithering ) - Failure return false - Success return true */ int ltexturesImageDither( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDither( Image image, Color bpp )" ); lua_pushboolean( L, false ); return 1; } Color bpp = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDither( state->images[ imageId ], bpp.r, bpp.g, bpp.b, bpp.a ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageFlipVertical( Image image ) Flip image vertically - Failure return false - Success return true */ int ltexturesImageFlipVertical( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageFlipVertical( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageFlipVertical( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageFlipHorizontal( Image image ) Flip image horizontally - Failure return false - Success return true */ int ltexturesImageFlipHorizontal( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageFlipHorizontal( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageFlipHorizontal( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageRotateCW( Image image ) Rotate image clockwise 90deg - Failure return false - Success return true */ int ltexturesImageRotateCW( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageRotateCW( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageRotateCW( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageRotateCCW( Image image ) Rotate image counter-clockwise 90deg - Failure return false - Success return true */ int ltexturesImageRotateCCW( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageRotateCCW( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageRotateCCW( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorTint( Image image, Color color ) Modify image color: tint - Failure return false - Success return true */ int ltexturesImageColorTint( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorTint( Image image, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorTint( state->images[ imageId ], color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorInvert( Image image ) Modify image color: invert - Failure return false - Success return true */ int ltexturesImageColorInvert( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorInvert( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorInvert( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorGrayscale( Image image ) Modify image color: grayscale - Failure return false - Success return true */ int ltexturesImageColorGrayscale( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorGrayscale( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorGrayscale( state->images[ imageId ] ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorContrast( Image image, float contrast ) Modify image color: contrast ( -100 to 100 ) - Failure return false - Success return true */ int ltexturesImageColorContrast( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorContrast( Image image, float contrast )" ); lua_pushboolean( L, false ); return 1; } float contrast = lua_tonumber( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorContrast( state->images[ imageId ], contrast ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorBrightness( Image image, int brightness ) Modify image color: brightness ( -255 to 255 ) - Failure return false - Success return true */ int ltexturesImageColorBrightness( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorBrightness( Image image, int brightness )" ); lua_pushboolean( L, false ); return 1; } int brightness = lua_tointeger( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorBrightness( state->images[ imageId ], brightness ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageColorReplace( Image image, Color color, Color replace ) Modify image color: replace color - Failure return false - Success return true */ int ltexturesImageColorReplace( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageColorReplace( Image image, Color color, Color replace )" ); lua_pushboolean( L, false ); return 1; } Color replace = uluaGetColor( L ); lua_pop( L, 1 ); Color color = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageColorReplace( state->images[ imageId ], color, replace ); lua_pushboolean( L, true ); return 1; } /* > colors = RL_LoadImageColors( Image image ) Load color data from image as a Color array ( RGBA - 32bit ) - Failure return false - Success return Color{} */ int ltexturesLoadImageColors( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadImageColors( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } int colorCount = state->images[ imageId ]->width * state->images[ imageId ]->height; Color *colors = LoadImageColors( *state->images[ imageId ] ); lua_createtable( L, colorCount, 0 ); for ( int i = 0; i < colorCount; ++i ) { uluaPushColor( L, colors[i] ); lua_rawseti( L, -2, i + 1 ); } UnloadImageColors( colors ); return 1; } /* > colors = RL_LoadImagePalette( Image image, int maxPaletteSize ) Load colors palette from image as a Color array ( RGBA - 32bit ) - Failure return false - Success return Color{} */ int ltexturesLoadImagePalette( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadImagePalette( Image image, int maxPaletteSize )" ); lua_pushboolean( L, false ); return 1; } int maxPaletteSize = lua_tointeger( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } int colorCount = 0; Color *colors = LoadImagePalette( *state->images[ imageId ], maxPaletteSize, &colorCount ); lua_createtable( L, colorCount, 0 ); for ( int i = 0; i < colorCount; ++i ) { uluaPushColor( L, colors[i] ); lua_rawseti( L, -2, i + 1 ); } UnloadImagePalette( colors ); return 1; } /* > rectangle = RL_GetImageAlphaBorder( Image image, float threshold ) Get image alpha border rectangle - Failure return false - Success return Rectangle */ int ltexturesGetImageAlphaBorder( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetImageAlphaBorder( Image image, float threshold )" ); lua_pushboolean( L, false ); return 1; } float threshold = lua_tonumber( L, -1 ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } uluaPushRectangle( L, GetImageAlphaBorder( *state->images[ imageId ], threshold ) ); return 1; } /* > color = RL_GetImageColor( Image image, Vector2 pixelPos ) Get image pixel color at ( x, y ) position - Failure return false - Success return Color */ int ltexturesGetImageColor( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetImageColor( Image image, Vector2 pixelPos )" ); lua_pushboolean( L, false ); return 1; } Vector2 pixelPos = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } uluaPushColor( L, GetImageColor( *state->images[ imageId ], pixelPos.x, pixelPos.y ) ); return 1; } /* ## Textures - Image Drawing */ /* > success = RL_ImageClearBackground( Image dst, Color color ) Clear image background with given color - Failure return false - Success return true */ int ltexturesImageClearBackground( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageClearBackground( Image dst, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageClearBackground( state->images[ imageId ], color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDrawPixel( Image dst, Vector2 position, Color color ) Draw pixel within an image - Failure return false - Success return true */ int ltexturesImageDrawPixel( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDrawPixel( Image dst, Vector2 position, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 position = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawPixelV( state->images[ imageId ], position, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDrawLine( Image dst, Vector2 start, Vector2 end, Color color ) Draw line within an image - Failure return false - Success return true */ int ltexturesImageDrawLine( lua_State *L ) { if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDrawLine( Image dst, Vector2 start, Vector2 end, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 end = uluaGetVector2( L ); lua_pop( L, 1 ); Vector2 start = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawLineV( state->images[ imageId ], start, end, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDrawCircle( Image dst, Vector2 center, int radius, Color color ) Draw circle within an image - Failure return false - Success return true */ int ltexturesImageDrawCircle( lua_State *L ) { if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDrawCircle( Image dst, Vector2 center, int radius, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); int radius = lua_tointeger( L, -1 ); lua_pop( L, 1 ); Vector2 center = uluaGetVector2( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawCircleV( state->images[ imageId ], center, radius, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDrawRectangle( Image dst, Rectangle rec, Color color ) Draw rectangle within an image - Failure return false - Success return true */ int ltexturesImageDrawRectangle( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDrawRectangle( Image dst, Rectangle rec, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); Rectangle rec = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawRectangleRec( state->images[ imageId ], rec, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawRectangleLines( Image dst, Rectangle rec, int thick, Color color ) Draw rectangle lines within an image - Failure return false - Success return true */ int ltexturesImageDrawRectangleLines( lua_State *L ) { if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawRectangleLines( Image dst, Rectangle rec, int thick, Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); int thick = lua_tointeger( L, -1 ); lua_pop( L, 1 ); Rectangle rec = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawRectangleLines( state->images[ imageId ], rec, thick, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDraw( Image dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint ) Draw a source image within a destination image ( Tint applied to source ) - Failure return false - Success return true */ int ltexturesImageDraw( lua_State *L ) { if ( !lua_isnumber( L, -5 ) || !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDraw( Image dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color tint = uluaGetColor( L ); lua_pop( L, 1 ); Rectangle dstRec = uluaGetRectangle( L ); lua_pop( L, 1 ); Rectangle srcRec = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t imageSrcId = lua_tointeger( L, -1 ); lua_pop( L, 1 ); size_t imageDstId = lua_tointeger( L, -1 ); if ( !validImage( imageDstId ) || !validImage( imageSrcId ) ) { lua_pushboolean( L, false ); return 1; } ImageDraw( state->images[ imageDstId ], *state->images[ imageSrcId ], srcRec, dstRec, tint ); lua_pushboolean( L, true ); return 1; } /* > success = RL_ImageDrawTextEx( Image dst, Font font, string text, Vector2 position, float fontSize, float spacing, Color tint ) Draw text ( Custom sprite font ) within an image ( Destination ) - Failure return false - Success return true */ int ltexturesImageDrawTextEx( lua_State *L ) { if ( !lua_isnumber( L, -7 ) || !lua_isnumber( L, -6 ) || !lua_isstring( L, -5 ) || !lua_istable( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ImageDrawTextEx( Image dst, Font font, string text, Vector2 position, float fontSize, float spacing, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color tint = uluaGetColor( L ); lua_pop( L, 1 ); float spacing = lua_tonumber( L, -1 ); lua_pop( L, 1 ); float fontSize = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 position = uluaGetVector2( L ); lua_pop( L, 1 ); size_t fontId = lua_tointeger( L, -2 ); size_t imageId = lua_tointeger( L, -3 ); if ( !validImage( imageId ) || !validFont( fontId ) ) { lua_pushboolean( L, false ); return 1; } ImageDrawTextEx( state->images[ imageId ], *state->fonts[ fontId ], lua_tostring( L, -1 ), position, fontSize, spacing, tint ); lua_pushboolean( L, true ); return 1; } /* ## Textures - Image Configuration */ /* > size = RL_GetImageSize( Image image ) Get image size - Failure return nil - Success return Vector2 */ int ltexturesGetImageSize( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetImageSize( Image image )" ); lua_pushnil( L ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushnil( L ); return 1; } Image *image = state->images[ imageId ]; uluaPushVector2( L, (Vector2){ image->width, image->height } ); return 1; } /* > mipmaps = RL_GetImageMipmaps( Image image ) Get image mipmaps. Mipmap levels, 1 by default - Failure return false - Success return int */ int ltexturesGetImageMipmaps( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetImageMipmaps( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } lua_pushinteger( L, state->images[ imageId ]->mipmaps ); return 1; } /* > format = RL_GetImageFormat( Image image ) Get image data format ( PixelFormat type ) - Failure return false - Success return int */ int ltexturesGetImageFormat( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetImageFormat( Image image )" ); lua_pushboolean( L, false ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } lua_pushinteger( L, state->images[ imageId ]->format ); return 1; } /* ## Textures - Texture Loading */ /* > texture = RL_LoadTexture( string fileName ) Load texture from file into GPU memory ( VRAM ) - Failure return -1 - Success return int */ int ltexturesLoadTexture( lua_State *L ) { if ( !lua_isstring( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadTexture( string fileName )" ); lua_pushinteger( L, -1 ); return 1; } if ( FileExists( lua_tostring( L, -1 ) ) ) { int i = newTexture(); *state->textures[i] = LoadTexture( lua_tostring( L, -1 ) ); lua_pushinteger( L, i ); return 1; } else { lua_pushinteger( L, -1 ); return 1; } } /* > texture = RL_LoadTextureFromImage( Image image ) Load texture from image data - Failure return -1 - Success return int */ int ltexturesLoadTextureFromImage( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadTextureFromImage( Image image )" ); lua_pushinteger( L, -1 ); return 1; } size_t imageId = lua_tointeger( L, -1 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } int i = newTexture(); *state->textures[i] = LoadTextureFromImage( *state->images[ imageId ] ); lua_pushinteger( L, i ); return 1; } /* > texture = RL_LoadTextureCubemap( Image image, int layout ) Load cubemap from image, multiple image cubemap layouts supported - Failure return -1 - Success return int */ int ltexturesLoadTextureCubemap( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadTextureCubemap( Image image, int layout )" ); lua_pushinteger( L, -1 ); return 1; } int layout = lua_tointeger( L, -1 ); size_t imageId = lua_tointeger( L, -2 ); if ( !validImage( imageId ) ) { lua_pushboolean( L, false ); return 1; } int i = newTexture(); *state->textures[i] = LoadTextureCubemap( *state->images[ imageId ], layout ); lua_pushinteger( L, i ); return 1; } /* > renderTexture = RL_LoadRenderTexture( Vector2 size ) Load texture for rendering ( framebuffer ) - Failure return -1 - Success return int */ int ltexturesLoadRenderTexture( lua_State *L ) { if ( !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_LoadRenderTexture( Vector2 size )" ); lua_pushinteger( L, -1 ); return 1; } Vector2 size = uluaGetVector2( L ); int i = 0; for ( i = 0; i < state->renderTextureCount; i++ ) { if ( state->renderTextures[i] == NULL ) { break; } } state->renderTextures[i] = malloc( sizeof( RenderTexture2D ) ); *state->renderTextures[i] = LoadRenderTexture( (int)size.x, (int)size.y ); lua_pushinteger( L, i ); checkRenderTextureRealloc( i ); return 1; } /* > success = RL_UnloadTexture( Texture2D texture ) Unload texture from GPU memory ( VRAM ) - Failure return false - Success return true */ int ltexturesUnloadTexture( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_UnloadTexture( Texture2D texture )" ); lua_pushboolean( L, false ); return 1; } size_t id = lua_tointeger( L, -1 ); if ( !validTexture( id ) ) { lua_pushboolean( L, false ); return 1; } UnloadTexture( *state->textures[ id ] ); state->textures[ id ] = NULL; lua_pushboolean( L, true ); return 1; } /* > success = RL_UnloadRenderTexture( RenderTexture2D target ) Unload render texture from GPU memory ( VRAM ) - Failure return false - Success return true */ int ltexturesUnloadRenderTexture( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_UnloadRenderTexture( RenderTexture2D target )" ); lua_pushboolean( L, false ); return 1; } size_t id = lua_tointeger( L, -1 ); if ( !validRenderTexture( id ) ) { lua_pushboolean( L, false ); return 1; } UnloadRenderTexture( *state->renderTextures[ id ] ); state->renderTextures[ id ] = NULL; lua_pushboolean( L, true ); return 1; } /* > success = RL_UpdateTexture( Texture2D texture, int pixels{ {} } ) Update GPU texture with new data NOTE! Should be TEXTURE_SOURCE_TEXTURE. Pixel should be in format { { 255, 255, 255, 255 }... } depending on the pixel format - Failure return false - Success return true */ int ltexturesUpdateTexture( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_UpdateTexture( Texture2D texture, int pixels{ {} } )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -2 ); if ( !validTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } size_t len = uluaGetTableLen( L ); unsigned char *pixels = malloc( len * 4 * sizeof( unsigned char ) ); int t = lua_gettop( L ); int i = 0; lua_pushnil( L ); while ( lua_next( L, t ) != 0 ) { size_t colLen = uluaGetTableLen( L ); int t2 = lua_gettop( L ); int j = 0; lua_pushnil( L ); while ( lua_next( L, t2 ) != 0 ) { *( pixels + ( i * colLen ) + j ) = lua_tointeger( L, -1 ); j++; lua_pop( L, 1 ); } i++; lua_pop( L, 1 ); } UpdateTexture( *state->textures[ texId ], pixels ); lua_pushboolean( L, true ); free( pixels ); return 1; } /* > success = RL_UpdateTextureRec( Texture2D texture, Rectangle rec, int pixels{ {} } ) Update GPU texture rectangle with new data NOTE! Should be TEXTURE_SOURCE_TEXTURE. Pixel should be in format { { 255, 255, 255, 255 }... } depending on the pixel format - Failure return false - Success return true */ int ltexturesUpdateTextureRec( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_UpdateTextureRec( Texture2D texture, Rectangle rec, int pixels{ {} } )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -3 ); if ( !validTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } size_t len = uluaGetTableLen( L ); unsigned char *pixels = malloc( len * 4 * sizeof( unsigned char ) ); int t = lua_gettop( L ); int i = 0; lua_pushnil( L ); while ( lua_next( L, t ) != 0 ) { size_t colLen = uluaGetTableLen( L ); int t2 = lua_gettop( L ); int j = 0; lua_pushnil( L ); while ( lua_next( L, t2 ) != 0 ) { *( pixels + ( i * colLen ) + j ) = lua_tointeger( L, -1 ); j++; lua_pop( L, 1 ); } i++; lua_pop( L, 1 ); } lua_pop( L, 1 ); /* Pixels arg. */ Rectangle rec = uluaGetRectangle( L ); UpdateTextureRec( *state->textures[ texId ], rec, pixels ); lua_pushboolean( L, true ); free( pixels ); return 1; } /* ## Textures - Texture Drawing */ /* > success = RL_DrawTexture( Texture2D texture, Vector2 position, Color tint ) Draw a Texture2D - Failure return false - Success return true */ int ltexturesDrawTexture( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTexture( Texture2D texture, Vector2 position, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 pos = uluaGetVector2( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTexture( *texturesGetSourceTexture( texId ), pos.x, pos.y, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawTextureRec( Texture2D texture, Rectangle source, Vector2 position, Color tint ) Draw a part of a texture defined by a rectangle - Failure return false - Success return true */ int ltexturesDrawTextureRec( lua_State *L ) { if ( !lua_isnumber( L, -4 ) || !lua_istable( L, -3 ) || !lua_istable( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTextureRec( Texture2D texture, Rectangle source, Vector2 position, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); Vector2 pos = uluaGetVector2( L ); lua_pop( L, 1 ); Rectangle srcRect = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTextureRec( *texturesGetSourceTexture( texId ), srcRect, pos, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawTextureTiled( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint ) Draw part of a texture ( defined by a rectangle ) with rotation and scale tiled into dest - Failure return false - Success return true */ int ltexturesDrawTextureTiled( lua_State *L ) { if ( !lua_isnumber( L, -7 ) || !lua_istable( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTextureTiled( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); float scale = lua_tonumber( L, -1 ); lua_pop( L, 1 ); float rot = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 origin = uluaGetVector2( L ); lua_pop( L, 1 ); Rectangle dstRect = uluaGetRectangle( L ); lua_pop( L, 1 ); Rectangle srcRect = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTextureTiled( *texturesGetSourceTexture( texId ), srcRect, dstRect, origin, rot, scale, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawTexturePro( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint ) Draw a part of a texture defined by a rectangle with "pro" parameters - Failure return false - Success return true */ int ltexturesDrawTexturePro( lua_State *L ) { if ( !lua_isnumber( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 ) || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTexturePro( Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); float rot = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 origin = uluaGetVector2( L ); lua_pop( L, 1 ); Rectangle dstRect = uluaGetRectangle( L ); lua_pop( L, 1 ); Rectangle srcRect = uluaGetRectangle( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTexturePro( *texturesGetSourceTexture( texId ), srcRect, dstRect, origin, rot, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawTextureNPatch( Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint ) Draws a texture ( or part of it ) that stretches or shrinks nicely - Failure return false - Success return true */ int ltexturesDrawTextureNPatch( lua_State *L ) { if ( !lua_isnumber( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 ) || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTextureNPatch( Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color tint = uluaGetColor( L ); lua_pop( L, 1 ); float rotation = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Vector2 origin = uluaGetVector2( L ); lua_pop( L, 1 ); Rectangle dest = uluaGetRectangle( L ); lua_pop( L, 1 ); NPatchInfo nPatchInfo = uluaGetNPatchInfo( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTextureNPatch( *texturesGetSourceTexture( texId ), nPatchInfo, dest, origin, rotation, tint ); lua_pushboolean( L, true ); return 1; } /* > success = RL_DrawTexturePoly( Texture2D texture, Vector2 center, Vector2{} points, Vector2{} texcoords, int pointsCount, Color tint ) Draw a textured polygon ( Convex ) - Failure return false - Success return true */ int ltexturesDrawTexturePoly( lua_State *L ) { if ( !lua_isnumber( L, -6 ) || !lua_istable( L, -5 ) || !lua_istable( L, -4 ) || !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawTexturePoly( Texture2D texture, Vector2 center, Vector2 points{}, Vector2 texcoords{}, int pointsCount, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pop( L, 1 ); int pointsCount = lua_tointeger( L, -1 ); lua_pop( L, 1 ); Vector2 texCoords[ pointsCount ]; int t = lua_gettop( L ), i = 0; lua_pushnil( L ); while ( lua_next( L, t ) != 0 ) { texCoords[i] = uluaGetVector2( L ); i++; lua_pop( L, 1 ); } lua_pop( L, 1 ); Vector2 points[ pointsCount ]; t = lua_gettop( L ); i = 0; lua_pushnil( L ); while ( lua_next( L, t ) != 0 ) { points[i] = uluaGetVector2( L ); i++; lua_pop( L, 1 ); } lua_pop( L, 1 ); Vector2 center = uluaGetVector2( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } DrawTexturePoly( *texturesGetSourceTexture( texId ), center, points, texCoords, pointsCount, color ); lua_pushboolean( L, true ); return 1; } /* > success = RL_BeginTextureMode( RenderTexture2D target ) Begin drawing to render texture - Failure return false - Success return true */ int ltexturesBeginTextureMode( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_BeginTextureMode( RenderTexture2D target )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -1 ); if ( !validRenderTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } BeginTextureMode( *state->renderTextures[ texId ] ); lua_pushboolean( L, true ); return 1; } /* > RL_EndTextureMode() Ends drawing to render texture */ int ltexturesEndTextureMode( lua_State *L ) { EndTextureMode(); return 1; } /* > success = RL_SetTextureSource( int textureSource ) Set what texture source to use ( TEXTURE_SOURCE_TEXTURE or TEXTURE_SOURCE_RENDER_TEXTURE ) - Failure return false - Success return true */ int ltexturesSetTextureSource( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_SetTextureSource( int textureSource )" ); lua_pushboolean( L, false ); return 1; } int texSource = lua_tointeger( L, -1 ); if ( texSource != TEXTURE_SOURCE_TEXTURE && texSource != TEXTURE_SOURCE_RENDER_TEXTURE ) { TraceLog( LOG_WARNING, "%s %d", "Invalid source texture", texSource ); lua_pushboolean( L, false ); return 1; } state->textureSource = texSource; lua_pushboolean( L, true ); return 1; } /* > textureSource = RL_GetTextureSource() Get current texture source type ( TEXTURE_SOURCE_TEXTURE or TEXTURE_SOURCE_RENDER_TEXTURE ) - Success return int */ int ltexturesGetTextureSource( lua_State *L ) { lua_pushinteger( L, state->textureSource ); return 1; } /* ## Textures - Texture Configuration */ /* > success = RL_GenTextureMipmaps( Texture2D texture ) Generate GPU mipmaps for a texture - Failure return false - Success return true */ int ltexturesGenTextureMipmaps( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GenTextureMipmaps( Texture2D texture )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -1 ); // if ( !validTexture( texId ) ) { if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } GenTextureMipmaps( texturesGetSourceTexture( texId ) ); lua_pushboolean( L, true ); return 1; } /* > success = RL_SetTextureFilter( Texture2D texture, int filter ) Set texture scaling filter mode ( TEXTURE_FILTER_POINT, TEXTURE_FILTER_BILINEAR... ) - Failure return false - Success return true */ int ltexturesSetTextureFilter( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_SetTextureFilter( Texture2D texture, int filter )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -2 ); // if ( !validTexture( texId ) ) { if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } SetTextureFilter( *texturesGetSourceTexture( texId ), lua_tointeger( L, -1 ) ); lua_pushboolean( L, true ); return 1; } /* > success = RL_SetTextureWrap( Texture2D texture, int wrap ) Set texture wrapping mode ( TEXTURE_WRAP_REPEAT, TEXTURE_WRAP_CLAMP... ) - Failure return false - Success return true */ int ltexturesSetTextureWrap( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_SetTextureWrap( Texture2D texture, int wrap )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -2 ); // if ( !validTexture( texId ) ) { if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } SetTextureWrap( *texturesGetSourceTexture( texId ), lua_tointeger( L, -1 ) ); // SetTextureWrap( *state->textures[ texId ], lua_tointeger( L, -1 ) ); lua_pushboolean( L, true ); return 1; } /* > size = RL_GetTextureSize( Texture2D texture ) Get texture size - Failure return nil - Success return Vector2 */ int ltexturesGetTextureSize( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetTextureSize( Texture2D texture )" ); lua_pushnil( L ); return 1; } size_t texId = lua_tointeger( L, -1 ); if ( !validSourceTexture( texId ) ) { lua_pushnil( L ); return 1; } Texture2D texture = *texturesGetSourceTexture( texId ); uluaPushVector2( L, (Vector2){ texture.width, texture.height } ); return 1; } /* > mipmaps = RL_GetTextureMipmaps( Texture2D texture ) Get texture mipmaps. Mipmap levels, 1 by default - Failure return false - Success return int */ int ltexturesGetTextureMipmaps( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetTextureMipmaps( Texture2D texture )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -1 ); if ( !validImage( texId ) ) { lua_pushboolean( L, false ); return 1; } Texture2D texture = *texturesGetSourceTexture( texId ); lua_pushinteger( L, texture.mipmaps ); return 1; } /* > format = RL_GetTextureFormat( Texture2D texture ) Get texture mipmaps. Mipmap levels, 1 by default - Failure return false - Success return int */ int ltexturesGetTextureFormat( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetTextureFormat( Texture2D texture )" ); lua_pushboolean( L, false ); return 1; } size_t texId = lua_tointeger( L, -1 ); if ( !validImage( texId ) ) { lua_pushboolean( L, false ); return 1; } Texture2D texture = *texturesGetSourceTexture( texId ); lua_pushinteger( L, texture.format ); return 1; } /* ## Textures - Color/pixel */ /* > color = RL_Fade( Color color, float alpha ) Returns color with alpha applied, alpha goes from 0.0f to 1.0f - Failure return false - Success return Color */ int ltexturesFade( lua_State *L ) { if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_Fade( Color color, float alpha )" ); lua_pushboolean( L, false ); return 1; } float alpha = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Color color = uluaGetColor( L ); uluaPushColor( L, Fade( color, alpha ) ); return 1; } /* > value = RL_ColorToInt( Color color ) Returns hexadecimal value for a Color - Failure return false - Success return int */ int ltexturesColorToInt( lua_State *L ) { if ( !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorToInt( Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); lua_pushinteger( L, ColorToInt( color ) ); return 1; } /* > color = RL_ColorNormalize( Color color ) Returns Color normalized as float [0..1] - Failure return false - Success return Vector4 */ int ltexturesColorNormalize( lua_State *L ) { if ( !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorNormalize( Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); uluaPushVector4( L, ColorNormalize( color ) ); return 1; } /* > color = RL_ColorFromNormalized( Vector4 normalized ) Color from normalized values [0..1] - Failure return false - Success return Color */ int ltexturesColorFromNormalized( lua_State *L ) { if ( !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorFromNormalized( Vector4 normalized )" ); lua_pushboolean( L, false ); return 1; } Vector4 normalized = uluaGetVector4( L ); uluaPushColor( L, ColorFromNormalized( normalized ) ); return 1; } /* > HSV = RL_ColorToHSV( Color color ) Returns HSV values for a Color, hue [0..360], saturation/value [0..1] - Failure return false - Success return Vector3 */ int ltexturesColorToHSV( lua_State *L ) { if ( !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorToHSV( Color color )" ); lua_pushboolean( L, false ); return 1; } Color color = uluaGetColor( L ); uluaPushVector3( L, ColorToHSV( color ) ); return 1; } /* > color = RL_ColorFromHSV( float hue, float saturation, float value ) Returns a Color from HSV values, hue [0..360], saturation/value [0..1] - Failure return false - Success return Color */ int ltexturesColorFromHSV( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorFromHSV( float hue, float saturation, float value )" ); lua_pushboolean( L, false ); return 1; } uluaPushColor( L, ColorFromHSV( lua_tonumber( L, -3 ), lua_tonumber( L, -2 ), lua_tonumber( L, -1 ) ) ); return 1; } /* > color = RL_ColorAlpha( Color color, float alpha ) Returns color with alpha applied, alpha goes from 0.0f to 1.0f - Failure return false - Success return Color */ int ltexturesColorAlpha( lua_State *L ) { if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorAlpha( Color color, float alpha )" ); lua_pushboolean( L, false ); return 1; } float alpha = lua_tonumber( L, -1 ); lua_pop( L, 1 ); Color color = uluaGetColor( L ); uluaPushColor( L, ColorAlpha( color, alpha ) ); return 1; } /* > color = RL_ColorAlphaBlend( Color dst, Color src, Color tint ) Returns src alpha-blended into dst color with tint - Failure return false - Success return Color */ int ltexturesColorAlphaBlend( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_ColorAlphaBlend( Color dst, Color src, Color tint )" ); lua_pushboolean( L, false ); return 1; } Color tint = uluaGetColor( L ); lua_pop( L, 1 ); Color src = uluaGetColor( L ); lua_pop( L, 1 ); Color dst = uluaGetColor( L ); uluaPushColor( L, ColorAlphaBlend( dst, src, tint ) ); return 1; } /* > Color = RL_GetColor( unsigned int hexValue ) Get Color structure from hexadecimal value - Failure return false - Success return Color */ int ltexturesGetColor( lua_State *L ) { if ( !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetColor( unsigned int hexValue )" ); lua_pushboolean( L, false ); return 1; } uluaPushColor( L, GetColor( (unsigned int)lua_tointeger( L, -1 ) ) ); return 1; } /* > Color = RL_GetPixelColor( Texture2D texture, Vector2 position ) Get pixel color from source texture - Failure return false - Success return Color */ int ltexturesGetPixelColor( lua_State *L ) { if ( !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetPixelColor( Texture2D texture, Vector2 position )" ); lua_pushboolean( L, false ); return 1; } Vector2 pos = uluaGetVector2( L ); lua_pop( L, 1 ); size_t texId = lua_tointeger( L, -2 ); if ( !validSourceTexture( texId ) ) { lua_pushboolean( L, false ); return 1; } Texture2D *texture = texturesGetSourceTexture( texId ); Image srcImage = LoadImageFromTexture( *texture ); uluaPushColor( L, GetImageColor( srcImage, pos.x, pos.y ) ); UnloadImage( srcImage ); return 1; } /* > size = RL_GetPixelDataSize( int width, int height, int format ) Get pixel data size in bytes for certain format - Failure return false - Success return int */ int ltexturesGetPixelDataSize( lua_State *L ) { if ( !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetPixelDataSize( int width, int height, int format )" ); lua_pushboolean( L, false ); return 1; } lua_pushinteger( L, GetPixelDataSize( lua_tointeger( L, -3 ), lua_tointeger( L, -2 ), lua_tointeger( L, -1 ) ) ); return 1; }