timesynk/engine/sdl/spritesheets.c

83 lines
2.6 KiB
C

/****** spritesheets
Contained are all functions related to creating, loading, and freeing Spritesheet structs.
******/
#include "interface.h"
#include "spritesheets.h"
/****
malloc()s a new Spritesheet, sets default options, then returns the pointer to the new Spritesheet.
****/
struct Spritesheet *newSpritesheet() {
struct Spritesheet *sheet = malloc(sizeof(struct Spritesheet));
sheet->width = 0;
sheet->height = 0;
sheet->s_width = 0;
sheet->s_height = 0;
sheet->columns = 0;
sheet->scale_x = 1.0f;
sheet->scale_y = 1.0f;
sheet->surface = NULL;
sheet->s_surface = NULL;
sheet->texture = 0;
return sheet;
}
/****
Takes a Spritesheet struct and attempts to load the given file_name. Sets spritesheet's width, height, and columns properties to the passed values. Also sets up scale to the default of 1.0f and copies spritesheet->surface to spritesheet->s_surface, populating s_width and s_height.
****/
int loadSpritesheetFromFile(struct Spritesheet *spritesheet, char *file_name, int width, int height, int columns) {
spritesheet->width = width;
spritesheet->height = height;
spritesheet->columns = columns;
// huehue
char temp[strlen(file_name)+5];
sprintf(temp, "%s.png", file_name);
spritesheet->surface = IMG_Load(temp);
if (spritesheet->surface == NULL) {
printf("couldn't load\n");
// TODO: Add error output
return -1;
}
setSpritesheetScale(spritesheet, 1.0f, 1.0f);
return 0;
}
int loadSpritesheetFromMemory(struct Spritesheet *spritesheet, unsigned char *memory, unsigned int length, int width, int height, int columns) {
if (length <= 0)
return -1;
spritesheet->width = width;
spritesheet->height = height;
spritesheet->columns = columns;
spritesheet->surface = IMG_Load_RW(SDL_RWFromMem(memory, length), 1);
if (spritesheet->surface == NULL) {
// TODO: Add error output
return -2;
}
setSpritesheetScale(spritesheet, 1.0f, 1.0f);
return 0;
}
void setSpritesheetScale(struct Spritesheet *spritesheet, float scale_x, float scale_y) {
spritesheet->scale_x = scale_x;
spritesheet->scale_y = scale_y;
spritesheet->s_width = spritesheet->width * scale_x;
spritesheet->s_height = spritesheet->height * scale_y;
if (spritesheet->s_surface != NULL)
SDL_FreeSurface(spritesheet->s_surface);
spritesheet->s_surface = SDL_ScaleSurface(spritesheet->surface, scale_x, scale_y);
}
/****
Frees the spritesheet and its surfaces if they are not NULL.
****/
void freeSpritesheet(struct Spritesheet *sheet) {
if (sheet->surface != NULL)
SDL_FreeSurface(sheet->surface);
if (sheet->s_surface != NULL)
SDL_FreeSurface(sheet->s_surface);
free(sheet);
}