#include "arc/graphics/spritesheet.h" #include "spritesheet.h" #include "renderer.h" #include "arc/math/point.h" #include "arc/std/errno.h" #include #include #include void ARC_Spritesheet_CreateFromFile(ARC_Spritesheet **spritesheet, ARC_Renderer *renderer, ARC_String *path){ //TODO: allow other types of images //init image as a png IMG_Init(IMG_INIT_PNG); //get and check the SDL surface SDL_Surface *surface = IMG_Load(path->data); if(!surface){ arc_errno = ARC_ERRNO_DATA; ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Spritesheet_CreateFromFile(spritesheet, renderer, path), could not read path \"%s\", SDL2_Image Error: %s", path->data, IMG_GetError()); //cleanup IMG_Quit(); //set the spritesheet to null and throw an error *spritesheet = NULL; return; } //create the place to store the spritesheet *spritesheet = (ARC_Spritesheet *)malloc(sizeof(ARC_Spritesheet)); //set the texture SDL_BlendMode tempMode; SDL_GetSurfaceBlendMode(surface, &tempMode); (*spritesheet)->texture = SDL_CreateTextureFromSurface((SDL_Renderer *)renderer, surface); SDL_SetTextureBlendMode((*spritesheet)->texture, tempMode); //set the tile size to empty (*spritesheet)->size = 0; //cleanup SDL_FreeSurface(surface); IMG_Quit(); } void ARC_Spritesheet_Destroy(ARC_Spritesheet *spritesheet){ SDL_DestroyTexture(spritesheet->texture); free(spritesheet); } void ARC_Spritesheet_RenderArea(ARC_Spritesheet *spritesheet, ARC_Rect sheetBounds, ARC_Renderer *renderer, ARC_Rect renderBounds){ SDL_RenderCopy((SDL_Renderer *)renderer, spritesheet->texture, (SDL_Rect *)&sheetBounds, (SDL_Rect *)&renderBounds); } void ARC_Spritesheet_RenderTile(ARC_Spritesheet *spritesheet, ARC_Point tilePosition, ARC_Renderer *renderer, ARC_Rect renderBounds){ //error when size is 0 if(spritesheet->size == 0){ arc_errno = ARC_ERRNO_NULL; ARC_DEBUG_LOG_ERROR("ARC_Spritesheet_RenderTile(spritesheet, tilePosition, renderer, renderBounds), could not render a tile of size 0"); return; } //get bounds based on the sheet size ARC_Rect sheetBounds = { spritesheet->size * tilePosition.x, spritesheet->size * tilePosition.y, spritesheet->size, spritesheet->size }; //render the bounds SDL_RenderCopy((SDL_Renderer *)renderer, spritesheet->texture, (SDL_Rect *)&sheetBounds, (SDL_Rect *)&renderBounds); } ARC_Point ARC_Spritesheet_GetSize(ARC_Spritesheet *spritesheet){ ARC_Point size; SDL_QueryTexture(spritesheet->texture, NULL, NULL, &size.x, &size.y); return size; } uint32_t ARC_Spritesheet_GetTileSize(ARC_Spritesheet *spritesheet){ return spritesheet->size; }