summaryrefslogtreecommitdiff
path: root/reduced_system_layer.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-01-12 12:13:56 +0100
committerMitya Selivanov <automainint@guattari.tech>2025-01-12 12:13:56 +0100
commit29d736aecc5db0deb67053931e5b1cf03a9defc3 (patch)
tree50caf18887aeda07b24bee5d4143130f8546aff7 /reduced_system_layer.c
parent464575c72a8a20b5e565f91cebfeb470edc8542e (diff)
downloadreduced_system_layer-29d736aecc5db0deb67053931e5b1cf03a9defc3.zip
f32 colors; g_ prefix
Diffstat (limited to 'reduced_system_layer.c')
-rwxr-xr-xreduced_system_layer.c339
1 files changed, 192 insertions, 147 deletions
diff --git a/reduced_system_layer.c b/reduced_system_layer.c
index c27be56..af49453 100755
--- a/reduced_system_layer.c
+++ b/reduced_system_layer.c
@@ -37,13 +37,12 @@
#/ - Window
#/ - Wayland
#/ - Windows graphics
+#/ - Drop files
#/ - Sound
#/ - Windows audio
#/ - Recording
#/ - Networking
-#/ - TCP
#/ - Windows sockets
-#/ - Web Sockets
#/ - Graphics
#/ - Self-contained impl
#/ - UI
@@ -83,6 +82,8 @@
#/
#/ Self-compilation shell script
#/
+#/ ================================================================
+
SRC=${0##*./}
BIN=${SRC%.*}
gcc \
@@ -125,6 +126,19 @@ typedef signed char b8;
typedef float f32;
typedef double f64;
+typedef struct { f64 x, y; } vec2;
+typedef struct { f64 x, y, z; } vec3;
+typedef struct { f64 x, y, z, w; } vec4;
+typedef struct { f32 x, y; } vec2_f32;
+typedef struct { f32 x, y, z; } vec3_f32;
+typedef struct { f32 x, y, z, w; } vec4_f32;
+typedef struct { i64 x, y; } vec2_i64;
+typedef struct { i64 x, y, z; } vec3_i64;
+typedef struct { i64 x, y, z, w; } vec4_i64;
+typedef struct { f64 v[ 4]; } mat2;
+typedef struct { f64 v[ 9]; } mat3;
+typedef struct { f64 v[16]; } mat4;
+
#endif // TYPES_HEADER_GUARD_
// ================================================================
@@ -311,7 +325,7 @@ typedef struct {
c8 * title;
i32 frame_width;
i32 frame_height;
- u32 * pixels;
+ vec3_f32 * pixels;
i64 input_size;
Input_Key *input;
i64 clipboard_size;
@@ -345,6 +359,10 @@ i32 utf8_size(c32 c);
c32 utf8_read(i64 len, c8 *s);
i32 utf8_write(c32 c, c8 *buffer);
+// Color
+u32 rgb_u32_from_f32(vec3_f32 c);
+vec3_f32 rgb_f32_from_u32(u32 color);
+
// Time and sleep
i64 p_time(void);
void p_yield(void);
@@ -375,7 +393,7 @@ void p_queue_sound(i64 delay_in_samples, i64 num_samples, f32 *frames);
i64 p_recv(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port, IP_Address *remote_address);
i64 p_send(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port);
-extern Platform platform;
+extern Platform g_platform;
#ifdef __wasm__
i32 main(i32 argc, c8 **argv);
@@ -424,17 +442,17 @@ f64 atan2(f64 y, f64 x);
void update_and_render_frame(void) {
p_handle_events();
- i64 w = platform.frame_width / 2;
- i64 h = platform.frame_height / 2;
+ i64 w = g_platform.frame_width / 2;
+ i64 h = g_platform.frame_height / 2;
i64 x = w / 2;
i64 y = h / 2;
- for (i64 j = 0; j < platform.frame_height; ++j)
- for (i64 i = 0; i < platform.frame_width; ++i)
+ for (i64 j = 0; j < g_platform.frame_height; ++j)
+ for (i64 i = 0; i < g_platform.frame_width; ++i)
if (i < x || i >= x + w || j < y || j >= y + h)
- platform.pixels[j * platform.frame_width + i] = 0xa0a0a0;
+ g_platform.pixels[j * g_platform.frame_width + i] = (vec3_f32) { .8f, .8f, .8f };
else
- platform.pixels[j * platform.frame_width + i] = 0x131112;
+ g_platform.pixels[j * g_platform.frame_width + i] = (vec3_f32) { .27f, .21f, .24f };
p_render_frame();
p_sleep_for(0);
@@ -444,7 +462,7 @@ i32 main(i32 argc, c8 **argv) {
(void) argc;
(void) argv;
- platform = (Platform) {
+ g_platform = (Platform) {
.title = "Example",
.frame_width = 1280,
.frame_height = 720,
@@ -467,12 +485,14 @@ i32 main(i32 argc, c8 **argv) {
#ifndef REDUCED_SYSTEM_LAYER_IMPL_GUARD_
#define REDUCED_SYSTEM_LAYER_IMPL_GUARD_
-Platform platform = {0};
+Platform g_platform = {0};
void p_event_loop(void) {
+ (void) sqrt; // For the compiler.
+
p_init();
#if !defined(__wasm__)
- while (!platform.done) update_and_render_frame();
+ while (!g_platform.done) update_and_render_frame();
p_cleanup();
#endif
}
@@ -549,6 +569,26 @@ i32 utf8_write(c32 c, c8 *buffer) {
return 0;
}
+u32 rgb_u32_from_f32(vec3_f32 c) {
+ i32 ir = (i32) floor(c.x * 255. + .5);
+ i32 ig = (i32) floor(c.y * 255. + .5);
+ i32 ib = (i32) floor(c.z * 255. + .5);
+
+ u32 r = ir < 0 ? 0u : ir > 255 ? 255u : (u32) ir;
+ u32 g = ig < 0 ? 0u : ig > 255 ? 255u : (u32) ig;
+ u32 b = ib < 0 ? 0u : ib > 255 ? 255u : (u32) ib;
+
+ return (r << 16) | (g << 8) | b;
+}
+
+vec3_f32 rgb_f32_from_u32(u32 color) {
+ return (vec3_f32) {
+ .x = (f32) ((color >> 16) & 0xff) / 255.,
+ .y = (f32) ((color >> 8) & 0xff) / 255.,
+ .z = (f32) ( color & 0xff) / 255.,
+ };
+}
+
// ================================================================
//
// Unix
@@ -1024,7 +1064,8 @@ void p_queue_sound(i64 delay_in_samples, i64 num_samples, f32 *frames) {
static i16 _key_table[MAX_NUM_KEYS] = {0};
static b8 _key_repeat[MAX_NUM_KEYS] = {0};
-static u32 _buffer[MAX_NUM_PIXELS] = {0};
+static vec3_f32 _pixels[MAX_NUM_PIXELS] = {0};
+static u32 _pixels_internal[MAX_NUM_PIXELS] = {0};
static Input_Key _input[MAX_INPUT_SIZE] = {0};
static c8 _clipboard_buffer[MAX_CLIPBOARD_SIZE] = {0};
static XImage _image = {0};
@@ -1165,15 +1206,15 @@ void p_init(void) {
i32 display_width = DisplayWidth (_display, screen);
i32 display_height = DisplayHeight(_display, screen);
- if (platform.frame_width <= 0)
- platform.frame_width = 400;
- if (platform.frame_height <= 0)
- platform.frame_height = 300;
+ if (g_platform.frame_width <= 0)
+ g_platform.frame_width = 400;
+ if (g_platform.frame_height <= 0)
+ g_platform.frame_height = 300;
- i32 x = (display_width - platform.frame_width) / 2;
- i32 y = (display_height - platform.frame_height) / 2;
+ i32 x = (display_width - g_platform.frame_width) / 2;
+ i32 y = (display_height - g_platform.frame_height) / 2;
- _window = XCreateWindow(_display, XDefaultRootWindow(_display), x, y, platform.frame_width, platform.frame_height, 0, depth, InputOutput, visual, CWEventMask, &(XSetWindowAttributes) { .event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | VisibilityChangeMask | FocusChangeMask | StructureNotifyMask | SubstructureNotifyMask, });
+ _window = XCreateWindow(_display, XDefaultRootWindow(_display), x, y, g_platform.frame_width, g_platform.frame_height, 0, depth, InputOutput, visual, CWEventMask, &(XSetWindowAttributes) { .event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | VisibilityChangeMask | FocusChangeMask | StructureNotifyMask | SubstructureNotifyMask, });
_im = XOpenIM(_display, NULL, NULL, NULL);
@@ -1189,23 +1230,23 @@ void p_init(void) {
return;
}
- platform.pixels = _buffer;
- platform.input = _input;
- platform.clipboard = _clipboard_buffer;
+ g_platform.pixels = _pixels;
+ g_platform.input = _input;
+ g_platform.clipboard = _clipboard_buffer;
_image = (XImage) {
- .width = platform.frame_width,
- .height = platform.frame_height,
+ .width = g_platform.frame_width,
+ .height = g_platform.frame_height,
.depth = depth,
.xoffset = 0,
.format = ZPixmap,
- .data = (c8 *) _buffer,
+ .data = (c8 *) _pixels_internal,
.byte_order = LSBFirst,
.bitmap_unit = 32,
.bitmap_bit_order = LSBFirst,
.bitmap_pad = 32,
.bits_per_pixel = 32,
- .bytes_per_line = 4 * platform.frame_width,
+ .bytes_per_line = 4 * g_platform.frame_width,
.red_mask = 0xff0000,
.green_mask = 0x00ff00,
.blue_mask = 0x0000ff,
@@ -1221,17 +1262,17 @@ void p_init(void) {
XSetICFocus(_ic);
XSetWMProtocols(_display, _window, &_wm_delete_window, 1);
- if (platform.title != NULL)
- XStoreName(_display, _window, platform.title);
+ if (g_platform.title != NULL)
+ XStoreName(_display, _window, g_platform.title);
XMapWindow(_display, _window);
- XPutImage(_display, _window, _gc, &_image, 0, 0, 0, 0, platform.frame_width, platform.frame_height);
+ XPutImage(_display, _window, _gc, &_image, 0, 0, 0, 0, g_platform.frame_width, g_platform.frame_height);
XFlush(_display);
}
void p_cleanup(void) {
- if (!platform.graceful_exit)
+ if (!g_platform.graceful_exit)
return;
if (_window != 0)
@@ -1252,13 +1293,13 @@ i32 p_handle_events(void) {
i32 num_events = 0;
- memset(platform.key_pressed, 0, sizeof platform.key_pressed);
+ memset(g_platform.key_pressed, 0, sizeof g_platform.key_pressed);
memset(_key_repeat, 0, sizeof _key_repeat);
- platform.input_size = 0;
- platform.cursor_dx = 0;
- platform.cursor_dy = 0;
- platform.wheel_dy = 0;
+ g_platform.input_size = 0;
+ g_platform.cursor_dx = 0;
+ g_platform.cursor_dy = 0;
+ g_platform.wheel_dy = 0;
XEvent ev;
@@ -1272,34 +1313,34 @@ i32 p_handle_events(void) {
switch (ev.type) {
case DestroyNotify:
- platform.done = 1;
+ g_platform.done = 1;
break;
case MotionNotify:
- platform.cursor_dx += ev.xmotion.x - platform.cursor_x;
- platform.cursor_dy += ev.xmotion.y - platform.cursor_y;
- platform.cursor_x = ev.xmotion.x;
- platform.cursor_y = ev.xmotion.y;
+ g_platform.cursor_dx += ev.xmotion.x - g_platform.cursor_x;
+ g_platform.cursor_dy += ev.xmotion.y - g_platform.cursor_y;
+ g_platform.cursor_x = ev.xmotion.x;
+ g_platform.cursor_y = ev.xmotion.y;
break;
case ButtonPress:
- platform.cursor_x = ev.xbutton.x;
- platform.cursor_y = ev.xbutton.y;
+ g_platform.cursor_x = ev.xbutton.x;
+ g_platform.cursor_y = ev.xbutton.y;
switch (ev.xbutton.button) {
case Button1:
- platform.key_down[BUTTON_LEFT] = 1;
- platform.key_pressed[BUTTON_LEFT] = 1;
+ g_platform.key_down[BUTTON_LEFT] = 1;
+ g_platform.key_pressed[BUTTON_LEFT] = 1;
break;
case Button2:
- platform.key_down[BUTTON_MIDDLE] = 1;
- platform.key_pressed[BUTTON_MIDDLE] = 1;
+ g_platform.key_down[BUTTON_MIDDLE] = 1;
+ g_platform.key_pressed[BUTTON_MIDDLE] = 1;
break;
case Button3:
- platform.key_down[BUTTON_RIGHT] = 1;
- platform.key_pressed[BUTTON_RIGHT] = 1;
+ g_platform.key_down[BUTTON_RIGHT] = 1;
+ g_platform.key_pressed[BUTTON_RIGHT] = 1;
break;
- case Button4: ++platform.wheel_dy; break;
- case Button5: --platform.wheel_dy; break;
+ case Button4: ++g_platform.wheel_dy; break;
+ case Button5: --g_platform.wheel_dy; break;
default:;
}
if (!requested_clipboard) {
@@ -1309,36 +1350,36 @@ i32 p_handle_events(void) {
break;
case ButtonRelease:
- platform.cursor_x = ev.xbutton.x;
- platform.cursor_y = ev.xbutton.y;
+ g_platform.cursor_x = ev.xbutton.x;
+ g_platform.cursor_y = ev.xbutton.y;
switch (ev.xbutton.button) {
- case Button1: platform.key_down[BUTTON_LEFT] = 0; break;
- case Button2: platform.key_down[BUTTON_MIDDLE] = 0; break;
- case Button3: platform.key_down[BUTTON_RIGHT] = 0; break;
+ case Button1: g_platform.key_down[BUTTON_LEFT] = 0; break;
+ case Button2: g_platform.key_down[BUTTON_MIDDLE] = 0; break;
+ case Button3: g_platform.key_down[BUTTON_RIGHT] = 0; break;
default:;
}
break;
case KeyPress: {
i16 k = _key_table[ev.xkey.keycode];
- platform.cursor_x = ev.xkey.x;
- platform.cursor_y = ev.xkey.y;
+ g_platform.cursor_x = ev.xkey.x;
+ g_platform.cursor_y = ev.xkey.y;
- platform.key_down[k] = 1;
+ g_platform.key_down[k] = 1;
if (!_key_repeat[k])
- platform.key_pressed[k] = 1;
+ g_platform.key_pressed[k] = 1;
- platform.key_down[MOD_CTRL] = !!(ev.xkey.state & ControlMask);
- platform.key_down[MOD_SHIFT] = !!(ev.xkey.state & ShiftMask);
- platform.key_down[MOD_ALT] = !!(ev.xkey.state & Mod1Mask);
- platform.key_down[MOD_CAPS] = !!(ev.xkey.state & LockMask);
- platform.key_down[MOD_NUM] = !!(ev.xkey.state & Mod2Mask);
- platform.key_down[MOD_SCROLL] = !!(ev.xkey.state & Mod3Mask);
- platform.key_down[MOD_META] = !!(ev.xkey.state & Mod4Mask);
+ g_platform.key_down[MOD_CTRL] = !!(ev.xkey.state & ControlMask);
+ g_platform.key_down[MOD_SHIFT] = !!(ev.xkey.state & ShiftMask);
+ g_platform.key_down[MOD_ALT] = !!(ev.xkey.state & Mod1Mask);
+ g_platform.key_down[MOD_CAPS] = !!(ev.xkey.state & LockMask);
+ g_platform.key_down[MOD_NUM] = !!(ev.xkey.state & Mod2Mask);
+ g_platform.key_down[MOD_SCROLL] = !!(ev.xkey.state & Mod3Mask);
+ g_platform.key_down[MOD_META] = !!(ev.xkey.state & Mod4Mask);
- if (platform.input_size < MAX_INPUT_SIZE) {
+ if (g_platform.input_size < MAX_INPUT_SIZE) {
if (k < 32 || k >= 128)
- platform.input[platform.input_size++] = (Input_Key) {
+ g_platform.input[g_platform.input_size++] = (Input_Key) {
.ctrl = !!(ev.xkey.state & ControlMask),
.shift = !!(ev.xkey.state & ShiftMask),
.alt = !!(ev.xkey.state & Mod1Mask),
@@ -1353,7 +1394,7 @@ i32 p_handle_events(void) {
c8 buf[16];
i32 len = Xutf8LookupString(_ic, &ev.xkey, buf, sizeof buf - 1, NULL, NULL);
if (len > 0)
- platform.input[platform.input_size++] = (Input_Key) {
+ g_platform.input[g_platform.input_size++] = (Input_Key) {
.ctrl = !!(ev.xkey.state & ControlMask),
.shift = !!(ev.xkey.state & ShiftMask),
.alt = !!(ev.xkey.state & Mod1Mask),
@@ -1376,19 +1417,19 @@ i32 p_handle_events(void) {
case KeyRelease: {
i16 k = _key_table[ev.xkey.keycode];
- platform.cursor_x = ev.xkey.x;
- platform.cursor_y = ev.xkey.y;
+ g_platform.cursor_x = ev.xkey.x;
+ g_platform.cursor_y = ev.xkey.y;
- platform.key_down[k] = 0;
+ g_platform.key_down[k] = 0;
_key_repeat[k] = 1;
- platform.key_down[MOD_CTRL] = !!(ev.xkey.state & ControlMask);
- platform.key_down[MOD_SHIFT] = !!(ev.xkey.state & ShiftMask);
- platform.key_down[MOD_ALT] = !!(ev.xkey.state & Mod1Mask);
- platform.key_down[MOD_CAPS] = !!(ev.xkey.state & LockMask);
- platform.key_down[MOD_NUM] = !!(ev.xkey.state & Mod2Mask);
- platform.key_down[MOD_SCROLL] = !!(ev.xkey.state & Mod3Mask);
- platform.key_down[MOD_META] = !!(ev.xkey.state & Mod4Mask);
+ g_platform.key_down[MOD_CTRL] = !!(ev.xkey.state & ControlMask);
+ g_platform.key_down[MOD_SHIFT] = !!(ev.xkey.state & ShiftMask);
+ g_platform.key_down[MOD_ALT] = !!(ev.xkey.state & Mod1Mask);
+ g_platform.key_down[MOD_CAPS] = !!(ev.xkey.state & LockMask);
+ g_platform.key_down[MOD_NUM] = !!(ev.xkey.state & Mod2Mask);
+ g_platform.key_down[MOD_SCROLL] = !!(ev.xkey.state & Mod3Mask);
+ g_platform.key_down[MOD_META] = !!(ev.xkey.state & Mod4Mask);
} break;
case SelectionRequest:
@@ -1415,8 +1456,8 @@ i32 p_handle_events(void) {
ev.xselectionrequest.target,
8,
PropModeReplace,
- (u8 *) platform.clipboard,
- platform.clipboard_size
+ (u8 *) g_platform.clipboard,
+ g_platform.clipboard_size
);
}
@@ -1471,9 +1512,9 @@ i32 p_handle_events(void) {
} else if (ev.xselection.target == _target) {
if (len > MAX_CLIPBOARD_SIZE)
len = MAX_CLIPBOARD_SIZE;
- platform.clipboard_size = len;
+ g_platform.clipboard_size = len;
if (len > 0)
- memcpy(platform.clipboard, data, len);
+ memcpy(g_platform.clipboard, data, len);
}
if (data)
@@ -1481,12 +1522,12 @@ i32 p_handle_events(void) {
}
break;
- case EnterNotify: platform.has_cursor = 1; break;
- case LeaveNotify: platform.has_cursor = 0; break;
- case FocusOut: platform.has_focus = 0; break;
+ case EnterNotify: g_platform.has_cursor = 1; break;
+ case LeaveNotify: g_platform.has_cursor = 0; break;
+ case FocusOut: g_platform.has_focus = 0; break;
case FocusIn:
- platform.has_focus = 1;
+ g_platform.has_focus = 1;
if (!requested_clipboard) {
XConvertSelection(_display, _clipboard, _targets, _clipboard, _window, CurrentTime);
requested_clipboard = 1;
@@ -1499,7 +1540,7 @@ i32 p_handle_events(void) {
case ClientMessage:
if ((Atom) ev.xclient.data.l[0] == _wm_delete_window)
- platform.done = 1;
+ g_platform.done = 1;
break;
default:;
@@ -1509,15 +1550,15 @@ i32 p_handle_events(void) {
XWindowAttributes attrs;
XGetWindowAttributes(_display, _window, &attrs);
- if ((platform.frame_width != attrs.width || platform.frame_height != attrs.height) && attrs.width * attrs.height * 4 <= (i32) sizeof _buffer) {
+ if ((g_platform.frame_width != attrs.width || g_platform.frame_height != attrs.height) && attrs.width * attrs.height * 4 <= (i32) sizeof _pixels_internal) {
if (attrs.width > 0 && attrs.height > 0) {
_image.width = attrs.width;
_image.height = attrs.height;
_image.bytes_per_line = 4 * attrs.width;
}
- platform.frame_width = attrs.width;
- platform.frame_height = attrs.height;
+ g_platform.frame_width = attrs.width;
+ g_platform.frame_height = attrs.height;
}
return num_events;
@@ -1535,10 +1576,14 @@ i32 p_wait_events(void) {
}
void p_render_frame(void) {
- if (platform.done)
+ if (g_platform.done)
return;
- XPutImage(_display, _window, _gc, &_image, 0, 0, 0, 0, platform.frame_width, platform.frame_height);
+ i64 size = g_platform.frame_width * g_platform.frame_height;
+ for (i64 i = 0; i < size; ++i)
+ _pixels_internal[i] = rgb_u32_from_f32(_pixels[i]);
+
+ XPutImage(_display, _window, _gc, &_image, 0, 0, 0, 0, g_platform.frame_width, g_platform.frame_height);
XFlush(_display);
}
@@ -1550,9 +1595,9 @@ void p_clipboard_write(i64 size, c8 *data) {
XSetSelectionOwner(_display, _clipboard, _window, CurrentTime);
- platform.clipboard_size = size < MAX_CLIPBOARD_SIZE ? size : MAX_CLIPBOARD_SIZE;
- if (platform.clipboard_size > 0)
- memcpy(platform.clipboard, data, platform.clipboard_size);
+ g_platform.clipboard_size = size < MAX_CLIPBOARD_SIZE ? size : MAX_CLIPBOARD_SIZE;
+ if (g_platform.clipboard_size > 0)
+ memcpy(g_platform.clipboard, data, g_platform.clipboard_size);
}
#endif // defined(__linux__)
@@ -1565,7 +1610,8 @@ void p_clipboard_write(i64 size, c8 *data) {
#ifdef __wasm__
-static u32 _buffer[MAX_NUM_PIXELS] = {0};
+static vec3_f32 _pixels[MAX_NUM_PIXELS] = {0};
+static u32 _pixels_internal[MAX_NUM_PIXELS] = {0};
static Input_Key _input[MAX_INPUT_SIZE] = {0};
static c8 _clipboard_buffer[MAX_CLIPBOARD_SIZE] = {0};
static i32 _num_events = 0;
@@ -1589,19 +1635,19 @@ void p_sleep_for(i64 duration) {
void p_init(void) {
++_num_events;
- platform.pixels = _buffer;
- platform.input = _input;
- platform.clipboard = _clipboard_buffer;
- platform.done = 1;
+ g_platform.pixels = _pixels;
+ g_platform.input = _input;
+ g_platform.clipboard = _clipboard_buffer;
+ g_platform.done = 1;
_sound_position = AUDIO_AVAIL_MIN % MAX_NUM_AUDIO_FRAMES;
_sound_read = 0;
}
i32 p_handle_events(void) {
- platform.input_size = _input_size;
+ g_platform.input_size = _input_size;
_input_size = 0;
for (i64 i = 0; i < MAX_NUM_KEYS; ++i)
- platform.key_pressed[i] = _key_pressed[i];
+ g_platform.key_pressed[i] = _key_pressed[i];
for (i64 i = 0; i < MAX_NUM_KEYS; ++i)
_key_pressed[i] = 0;
i32 n = _num_events;
@@ -1615,7 +1661,11 @@ i32 p_wait_events(void) {
return p_handle_events();
}
-void p_render_frame(void) { }
+void p_render_frame(void) {
+ i64 size = g_platform.frame_width * g_platform.frame_height;
+ for (i64 i = 0; i < size; ++i)
+ _pixels_internal[i] = 0xff000000u | rgb_u32_from_f32(_pixels[i]);
+}
void p_clipboard_write_impl(i32 size, c8 *data);
@@ -1625,9 +1675,9 @@ void p_clipboard_write(i64 size, c8 *data) {
if (size > MAX_CLIPBOARD_SIZE)
size = MAX_CLIPBOARD_SIZE;
- platform.clipboard_size = size;
+ g_platform.clipboard_size = size;
for (i64 i = 0; i < size; ++i)
- platform.clipboard[i] = data[i];
+ g_platform.clipboard[i] = data[i];
p_clipboard_write_impl((i32) size, data);
}
@@ -1677,30 +1727,25 @@ __attribute__((export_name("js_main"))) void js_main(c8 *href) {
}
__attribute__((export_name("js_title"))) void *js_title(void) {
- return platform.title;
+ return g_platform.title;
}
__attribute__((export_name("js_pixels"))) void *js_pixels(void) {
- return platform.pixels;
+ return _pixels_internal;
}
__attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 frame_height, i32 num_samples) {
- if (platform.frame_width != frame_width || platform.frame_height != frame_height) {
+ if (g_platform.frame_width != frame_width || g_platform.frame_height != frame_height) {
++_num_events;
- platform.frame_width = frame_width;
- platform.frame_height = frame_height;
+ g_platform.frame_width = frame_width;
+ g_platform.frame_height = frame_height;
}
- platform.done = 0;
+ g_platform.done = 0;
if (_num_events > 0 || !_wait_events) {
_wait_events = 0;
update_and_render_frame();
-
- // Make canvas pixels opaque.
- i64 size = platform.frame_width * platform.frame_height;
- for (i64 i = 0; i < size; ++i)
- platform.pixels[i] |= 0xff000000;
}
// Convert interleaved frames to non-interleaved.
@@ -1716,39 +1761,39 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram
__attribute__((export_name("js_mousemove"))) void js_mousemove(i32 x, i32 y) {
++_num_events;
- platform.cursor_dx = x - platform.cursor_x;
- platform.cursor_dy = y - platform.cursor_y;
- platform.cursor_x = x;
- platform.cursor_y = y;
+ g_platform.cursor_dx = x - g_platform.cursor_x;
+ g_platform.cursor_dy = y - g_platform.cursor_y;
+ g_platform.cursor_x = x;
+ g_platform.cursor_y = y;
}
__attribute__((export_name("js_mousedown"))) void js_mousedown(u32 buttons) {
++_num_events;
- if ((buttons & 1) && !platform.key_down[BUTTON_LEFT]) _key_pressed[BUTTON_LEFT] = 1;
- if ((buttons & 2) && !platform.key_down[BUTTON_RIGHT]) _key_pressed[BUTTON_RIGHT] = 1;
- if ((buttons & 4) && !platform.key_down[BUTTON_MIDDLE]) _key_pressed[BUTTON_MIDDLE] = 1;
- if (buttons & 1) platform.key_down[BUTTON_LEFT] = 1;
- if (buttons & 2) platform.key_down[BUTTON_RIGHT] = 1;
- if (buttons & 4) platform.key_down[BUTTON_MIDDLE] = 1;
+ if ((buttons & 1) && !g_platform.key_down[BUTTON_LEFT]) _key_pressed[BUTTON_LEFT] = 1;
+ if ((buttons & 2) && !g_platform.key_down[BUTTON_RIGHT]) _key_pressed[BUTTON_RIGHT] = 1;
+ if ((buttons & 4) && !g_platform.key_down[BUTTON_MIDDLE]) _key_pressed[BUTTON_MIDDLE] = 1;
+ if (buttons & 1) g_platform.key_down[BUTTON_LEFT] = 1;
+ if (buttons & 2) g_platform.key_down[BUTTON_RIGHT] = 1;
+ if (buttons & 4) g_platform.key_down[BUTTON_MIDDLE] = 1;
}
__attribute__((export_name("js_mouseup"))) void js_mouseup(u32 buttons) {
++_num_events;
- if (!(buttons & 1)) platform.key_down[BUTTON_LEFT] = 0;
- if (!(buttons & 2)) platform.key_down[BUTTON_RIGHT] = 0;
- if (!(buttons & 4)) platform.key_down[BUTTON_MIDDLE] = 0;
+ if (!(buttons & 1)) g_platform.key_down[BUTTON_LEFT] = 0;
+ if (!(buttons & 2)) g_platform.key_down[BUTTON_RIGHT] = 0;
+ if (!(buttons & 4)) g_platform.key_down[BUTTON_MIDDLE] = 0;
}
__attribute__((export_name("js_keydown"))) void js_keydown(u32 key, u32 mod, u32 ch) {
++_num_events;
_key_pressed[key] = 1;
- platform.key_down[key] = 1;
- platform.key_down[MOD_CTRL] = (mod & 1) ? 1 : 0;
- platform.key_down[MOD_SHIFT] = (mod & 2) ? 1 : 0;
- platform.key_down[MOD_ALT] = (mod & 4) ? 1 : 0;
- platform.key_down[MOD_META] = (mod & 8) ? 1 : 0;
- if (platform.input_size < MAX_INPUT_SIZE)
- platform.input[_input_size++] = (Input_Key) {
+ g_platform.key_down[key] = 1;
+ g_platform.key_down[MOD_CTRL] = (mod & 1) ? 1 : 0;
+ g_platform.key_down[MOD_SHIFT] = (mod & 2) ? 1 : 0;
+ g_platform.key_down[MOD_ALT] = (mod & 4) ? 1 : 0;
+ g_platform.key_down[MOD_META] = (mod & 8) ? 1 : 0;
+ if (g_platform.input_size < MAX_INPUT_SIZE)
+ g_platform.input[_input_size++] = (Input_Key) {
.ctrl = (mod & 1) ? 1 : 0,
.shift = (mod & 2) ? 1 : 0,
.alt = (mod & 4) ? 1 : 0,
@@ -1760,11 +1805,11 @@ __attribute__((export_name("js_keydown"))) void js_keydown(u32 key, u32 mod, u32
__attribute__((export_name("js_keyup"))) void js_keyup(u32 key, u32 mod) {
++_num_events;
- platform.key_down[key] = 0;
- platform.key_down[MOD_CTRL] = (mod & 1) ? 1 : 0;
- platform.key_down[MOD_SHIFT] = (mod & 2) ? 1 : 0;
- platform.key_down[MOD_ALT] = (mod & 4) ? 1 : 0;
- platform.key_down[MOD_META] = (mod & 8) ? 1 : 0;
+ g_platform.key_down[key] = 0;
+ g_platform.key_down[MOD_CTRL] = (mod & 1) ? 1 : 0;
+ g_platform.key_down[MOD_SHIFT] = (mod & 2) ? 1 : 0;
+ g_platform.key_down[MOD_ALT] = (mod & 4) ? 1 : 0;
+ g_platform.key_down[MOD_META] = (mod & 8) ? 1 : 0;
}
__attribute__((export_name("js_sample_rate"))) f64 js_sample_rate(void) {
@@ -1784,7 +1829,7 @@ __attribute__((export_name("js_sound_buffer"))) void *js_sound_buffer(void) {
}
__attribute__((export_name("js_clipboard_size"))) i32 js_clipboard_size(void) {
- return platform.clipboard_size;
+ return g_platform.clipboard_size;
}
__attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i32 len) {
@@ -1792,8 +1837,8 @@ __attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i3
len = 0;
if (len > MAX_CLIPBOARD_SIZE)
len = MAX_CLIPBOARD_SIZE;
- platform.clipboard_size = len;
- return platform.clipboard;
+ g_platform.clipboard_size = len;
+ return g_platform.clipboard;
}
#endif // __wasm__