aboutsummaryrefslogtreecommitdiff
path: root/src/sdl/sprites.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sdl/sprites.c')
-rw-r--r--src/sdl/sprites.c46
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);
+}