archeus/packages/graphics/sdl/spritesheet.c

85 lines
2.8 KiB
C
Raw Normal View History

#include "arc/graphics/spritesheet.h"
#include "spritesheet.h"
#include "renderer.h"
#include "arc/math/point.h"
#include "arc/std/errno.h"
#include <SDL.h>
#include <SDL_image.h>
#include <stdlib.h>
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;
}