diff --git a/include/arc/graphics/config.h b/include/arc/graphics/config.h index b173267..4e8a57e 100644 --- a/include/arc/graphics/config.h +++ b/include/arc/graphics/config.h @@ -8,10 +8,33 @@ extern "C" { #include "arc/std/config.h" #include "arc/graphics/renderer.h" +/** + * @brief +*/ void ARC_GraphicsConfig_Init(ARC_Config *config, ARC_Renderer *renderer); +/** + * @brief +*/ +void ARC_ConfigType_SpritesheetCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata); + +/** + * @brief +*/ +void ARC_ConfigType_SpritesheetDestroyFn(void *type); + +/** + * @brief +*/ +void ARC_ConfigType_SpriteCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata); + +/** + * @brief +*/ +void ARC_ConfigType_SpriteDestroyFn(void *type); + #ifdef __cplusplus } #endif -#endif // !ARC_GRAPHICS_CONFIG_H_ \ No newline at end of file +#endif // !ARC_GRAPHICS_CONFIG_H_ diff --git a/include/arc/std/config.h b/include/arc/std/config.h index f862004..969b6d8 100644 --- a/include/arc/std/config.h +++ b/include/arc/std/config.h @@ -17,7 +17,7 @@ typedef struct ARC_Config ARC_Config; /** * @brief a function callback to create a type stored within a config */ -typedef void (* ARC_ConfigType_CopyFn)(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config); +typedef void (* ARC_ConfigType_CopyFn)(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata); /** * @brief a function callback to destroy a type @@ -30,6 +30,7 @@ typedef void (* ARC_ConfigType_DestroyFn)(void *type); typedef struct ARC_ConfigType { ARC_ConfigType_CopyFn copyFn; ARC_ConfigType_DestroyFn destroyFn; + void *userdata; } ARC_ConfigType; /** diff --git a/packages/graphics/sdl/config.c b/packages/graphics/sdl/config.c index b00a28b..2a321bc 100644 --- a/packages/graphics/sdl/config.c +++ b/packages/graphics/sdl/config.c @@ -1,68 +1,45 @@ #include "arc/graphics/config.h" -//#include -//#include -//#include "renderer.h" -//#include "sprite.h" -//#include "spritesheet.h" -//#include "arc/std/array.h" -//#include "arc/std/string.h" -//#include "arc/std/errno.h" -//#include "arc/graphics/sprite.h" -//#include "arc/graphics/spritesheet.h" -//#include "arc/math/config.h" -//#include "arc/math/point.h" -//#include "arc/math/rectangle.h" +#include +#include +#include "renderer.h" +#include "sprite.h" +#include "spritesheet.h" +#include "arc/std/array.h" +#include "arc/std/string.h" +#include "arc/std/errno.h" +#include "arc/graphics/sprite.h" +#include "arc/graphics/spritesheet.h" +#include "arc/math/config.h" +#include "arc/math/point.h" +#include "arc/math/rectangle.h" -// #define ARC_DEFAULT_CONFIG -//#include "arc/std/defaults/config.h" -//SDL_Renderer *global_renderer; -// -//uint8_t ARC_SDL_Texture_Read(ARC_Config *config, ARC_String *string, void **value); -//uint8_t ARC_Spritesheet_Read(ARC_Config *config, ARC_String *string, void **value); -//uint8_t ARC_Sprite_Read (ARC_Config *config, ARC_String *string, void **value); -// -//void ARC_SDL_Texture_Delete(ARC_Config *config, ARC_String *string, void *value); -//void ARC_Spritesheet_Delete(ARC_Config *config, ARC_String *string, void *value); -//void ARC_Sprite_Delete (ARC_Config *config, ARC_String *string, void *value); -// -//void ARC_GraphicsConfig_Init(ARC_Config *config, ARC_Renderer *renderer){ -// global_renderer = (SDL_Renderer *)renderer; -// ARC_Config_AddKeyCString(config, (char *)"SDL_Texture" , 11, ARC_SDL_Texture_Read, ARC_SDL_Texture_Delete); -// ARC_Config_AddKeyCString(config, (char *)"ARC_Spritesheet", 15, ARC_Spritesheet_Read, ARC_Spritesheet_Delete); -// ARC_Config_AddKeyCString(config, (char *)"ARC_Sprite" , 10, ARC_Sprite_Read , ARC_Sprite_Delete ); -//} -// -//uint64_t ARC_GraphicsConfig_GetIndexAndErrorCheck(ARC_String *string, char *search, uint64_t searchLength){ -// uint64_t separator = ARC_String_FindCString(string, ",", 1); -// -// if(separator == ~(uint64_t)0){ -// arc_errno = ARC_ERRNO_DATA; -// } -// -// return separator; -//} -// -//int32_t ARC_SDL_Texture_Load(const char *path, SDL_Texture **texture){ -// IMG_Init(IMG_INIT_PNG); -// SDL_Surface *surface = IMG_Load(path); -// if(!surface){ -// printf("Error: reading png '%s'\nSDL_Image Error: %s", path, IMG_GetError()); -// return 1; // GE_SDL_ERRNO_ -// } -// -// SDL_BlendMode tempMode; -// SDL_GetSurfaceBlendMode(surface, &tempMode); -// *texture = SDL_CreateTextureFromSurface(global_renderer, surface); -// SDL_GetTextureBlendMode(*texture, &tempMode); -// -// SDL_FreeSurface(surface); -// IMG_Quit(); -// -// return 0; -//} -// +void ARC_Config_InitGraphics(ARC_Config *config, ARC_Renderer *renderer){ + //ARC_Config_AddKeyCString(config, (char *)"SDL_Texture" , 11, ARC_SDL_Texture_Read, ARC_SDL_Texture_Delete); + ARC_Config_RegisterTypeWithCStr(config, "ARC_Spritesheet", (ARC_ConfigType){ ARC_ConfigType_SpritesheetCopyFn, ARC_ConfigType_SpritesheetDestroyFn, renderer}); + ARC_Config_RegisterTypeWithCStr(config, "ARC_Sprite" , (ARC_ConfigType){ ARC_ConfigType_SpriteCopyFn , ARC_ConfigType_SpriteDestroyFn , renderer}); +} + +int32_t ARC_SDL_Texture_Load(SDL_Texture **texture, ARC_Renderer *renderer, const char *path){ + IMG_Init(IMG_INIT_PNG); + SDL_Surface *surface = IMG_Load(path); + if(!surface){ + printf("Error: reading png '%s'\nSDL_Image Error: %s", path, IMG_GetError()); + return 1; // GE_SDL_ERRNO_ + } + + SDL_BlendMode tempMode; + SDL_GetSurfaceBlendMode(surface, &tempMode); + *texture = SDL_CreateTextureFromSurface((SDL_Renderer *)renderer, surface); + SDL_GetTextureBlendMode(*texture, &tempMode); + + SDL_FreeSurface(surface); + IMG_Quit(); + + return 0; +} + //uint8_t ARC_SDL_Texture_Read(ARC_Config* config, ARC_String *string, void **value){ // ARC_Config_Get(config, string, value); // if(*value){ @@ -80,7 +57,7 @@ // ARC_String_Destroy(textureStr); // return 0; //} -// + //void ARC_Spritesheet_ReadTexture(ARC_Config *config, ARC_String *string, uint32_t *size, void **value){ // SDL_Texture *texture; // diff --git a/src/std/config.c b/src/std/config.c index f27b340..fa246cf 100644 --- a/src/std/config.c +++ b/src/std/config.c @@ -364,7 +364,7 @@ void ARC_ConfigData_RunVariableLineTag(ARC_ParserTagToken *tagToken, ARC_Config } //passed the parsed value into the copy type function and set the destroy function - type->copyFn(&(typeData->data), childTagToken, config); + type->copyFn(&(typeData->data), childTagToken, config, type->userdata); typeData->destroyFn = type->destroyFn; //add to the current group hashtable diff --git a/tests/std/config.c b/tests/std/config.c index aa711e1..d565b48 100644 --- a/tests/std/config.c +++ b/tests/std/config.c @@ -7,7 +7,7 @@ static const char *testType = "int32"; -void TEST_configType_CopyInt32Fn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config){ +void TEST_configType_CopyInt32Fn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){ //go into the tag ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0); if(childTagToken->id != ARC_CONFIG_NUMBER_SIGN){ @@ -83,7 +83,8 @@ ARC_TEST(config_BasicTest){ ARC_ConfigType int32Type = { TEST_configType_CopyInt32Fn, - TEST_configType_DestroyInt32Fn + TEST_configType_DestroyInt32Fn, + NULL }; ARC_Config_RegisterTypeWithCStr(config, testType, int32Type);