prosperon/source/engine/window.c

113 lines
2.5 KiB
C
Raw Normal View History

#include "window.h"
2022-06-30 10:31:23 -05:00
#include "input.h"
2023-05-12 13:22:05 -05:00
#include "log.h"
#include "script.h"
#include "texture.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2023-06-06 15:49:55 -05:00
#include "ffi.h"
2021-11-30 21:29:18 -06:00
#include "render.h"
2022-08-26 09:19:17 -05:00
#include "stb_ds.h"
#include "sokol/sokol_app.h"
#include "stb_image_resize.h"
struct window mainwin;
static struct window *windows = NULL;
2022-08-26 09:19:17 -05:00
struct Texture *icon = NULL;
2021-11-30 21:29:18 -06:00
void window_resize(int width, int height)
{
mainwin.dpi = sapp_dpi_scale();
mainwin.width = sapp_width();
mainwin.height = sapp_height();
mainwin.rwidth = mainwin.width/mainwin.dpi;
mainwin.rheight = mainwin.height/mainwin.dpi;
2023-05-24 20:45:50 -05:00
render_winsize();
2023-06-06 15:49:55 -05:00
JSValue vals[2] = { int2js(width), int2js(height) };
send_signal("window_resize", 2, vals);
2022-06-30 10:31:23 -05:00
}
void window_quit()
{
2023-05-12 13:22:05 -05:00
quit();
2022-06-30 10:31:23 -05:00
}
void window_focused(int focus)
{
mainwin.focus = focus;
}
void window_iconified(int s)
{
mainwin.iconified = s;
}
2022-08-12 14:03:56 -05:00
2023-05-04 17:07:00 -05:00
void window_suspended(int s)
{
2023-06-06 15:49:55 -05:00
2021-11-30 21:29:18 -06:00
}
2023-05-12 13:22:05 -05:00
void window_set_icon(const char *png) {
2023-03-24 14:01:01 -05:00
icon = texture_pullfromfile(png);
window_seticon(&mainwin, icon);
2022-01-19 16:43:21 -06:00
}
2023-05-12 13:22:05 -05:00
void window_makefullscreen(struct window *w) {
if (!w->fullscreen)
window_togglefullscreen(w);
2022-08-12 14:03:56 -05:00
}
2023-05-12 13:22:05 -05:00
void window_unfullscreen(struct window *w) {
if (w->fullscreen)
window_togglefullscreen(w);
2021-11-30 21:29:18 -06:00
}
2023-05-12 13:22:05 -05:00
void window_togglefullscreen(struct window *w) {
sapp_toggle_fullscreen();
mainwin.fullscreen = sapp_is_fullscreen();
2021-11-30 21:29:18 -06:00
}
2022-01-19 16:43:21 -06:00
void window_seticon(struct window *w, struct Texture *tex)
{
struct isize {
int size;
unsigned char *data;
};
struct isize sizes[4];
sizes[0].size = 16;
sizes[1].size = 32;
sizes[2].size = 64;
sizes[3].size = 128;
for (int i = 0; i < 4; i++) {
sizes[i].data = malloc(4*sizes[i].size*sizes[i].size);
stbir_resize_uint8(tex->data, tex->width, tex->height, 0, sizes[i].data, sizes[i].size, sizes[i].size, 0, 4);
}
sapp_icon_desc idsc = {
.images = {
{ .width = sizes[0].size, .height = sizes[0].size, .pixels = { .ptr=sizes[0].data, .size=4*sizes[0].size*sizes[0].size } },
{ .width = sizes[1].size, .height = sizes[1].size, .pixels = { .ptr=sizes[1].data, .size=4*sizes[1].size*sizes[1].size } },
{ .width = sizes[2].size, .height = sizes[2].size, .pixels = { .ptr=sizes[2].data, .size=4*sizes[2].size*sizes[2].size } },
{ .width = sizes[3].size, .height = sizes[3].size, .pixels = { .ptr=sizes[3].data, .size=4*sizes[3].size*sizes[3].size } },
}
};
sapp_set_icon(&idsc);
for (int i = 0; i < 4; i++)
free(sizes[i].data);
2022-02-06 10:14:57 -06:00
}
void window_render(struct window *w) {
2023-05-12 13:22:05 -05:00
openglRender(w);
}