#include #define STB_NO_STDIO #define STB_IMAGE_IMPLEMENTATION #define STB_ASSERT(x) #define STB_ONLY_PNG #include "stb_image.h" #include "util.h" #include "sprites.h" #include "assets.h" void sprites_init( SDL_Renderer * const renderer, SDL_Texture **sprites ) { // get asset const asset_t * const asset = asset_get(ASSET_SPRITES_PNG); // load image int im_w, im_h; unsigned char *im_data = stbi_load_from_memory(asset->buf, asset->len, &im_w, &im_h, NULL, 4); if (!im_data) { die("stbi_load(): %s", stbi_failure_reason()); } // create surface SDL_Surface * const src = SDL_CreateRGBSurfaceWithFormatFrom(im_data, im_w, im_h, 32, 4 * im_w, SDL_PIXELFORMAT_RGBA32); if (!src) { die("SDLCreateRGBSurfaceFrom(): %s", SDL_GetError()); } // create sprite textures for (size_t i = 0; i < SPRITE_LAST; i++) { // create surface SDL_Surface *s = SDL_CreateRGBSurfaceWithFormat(0, 32, 32, 32, SDL_PIXELFORMAT_RGBA32); if (!s) { die("SDL_CreateRGBSurfaceWithFormat(): %s", SDL_GetError()); } // copy from main surface const SDL_Rect src_rect = { i * 32, 0, 32, 32 }; if (SDL_BlitScaled(src, &src_rect, s, NULL)) { die("SDL_BlitScaled(): %s", SDL_GetError()); } // create texture sprites[i] = SDL_CreateTextureFromSurface(renderer, s); if (!sprites[i]) { die("SDLCreateTextureFromSurface(): %s", SDL_GetError()); } // free surface SDL_FreeSurface(s); } // free main surface SDL_FreeSurface(src); // free image data stbi_image_free(im_data); } SDL_Rect sprites_get_rect( const sprite_t sprite ) { const int x = ((sprite < SPRITE_LAST) ? sprite : SPRITE_NONE) * 32; return (SDL_Rect) { .x = x, .y = 0, .w = 32, .h = 32 }; }