diff options
Diffstat (limited to 'src/sdl/sprites.c')
-rw-r--r-- | src/sdl/sprites.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/sdl/sprites.c b/src/sdl/sprites.c index 51824d8..a64d011 100644 --- a/src/sdl/sprites.c +++ b/src/sdl/sprites.c @@ -67,3 +67,49 @@ sprites_get_rect( const int x = ((sprite < SPRITE_LAST) ? sprite : SPRITE_NONE) * 32; return (SDL_Rect) { .x = x, .y = 0, .w = 32, .h = 32 }; } + +void +sprites_set_window_icon( + SDL_Window * const win, + const sprite_t icon_sprite +) { + // 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 icon surface + SDL_Surface *icon_surface = SDL_CreateRGBSurfaceWithFormat(0, 32, 32, 32, SDL_PIXELFORMAT_RGBA32); + if (!icon_surface) { + die("SDL_CreateRGBSurfaceWithFormat(): %s", SDL_GetError()); + } + + // copy from main surface + const SDL_Rect src_rect = { icon_sprite * 32, 0, 32, 32 }; + if (SDL_BlitScaled(src, &src_rect, icon_surface, NULL)) { + die("SDL_BlitScaled(): %s", SDL_GetError()); + } + + // set window icon + SDL_SetWindowIcon(win, icon_surface); + + // free icon surface + SDL_FreeSurface(icon_surface); + + // free main surface + SDL_FreeSurface(src); + + // free image data + stbi_image_free(im_data); +} |