diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2025-02-14 17:30:28 +0100 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2025-02-14 17:30:28 +0100 |
commit | 7d92468a5d298ec6dd6455482ff0521efecf9541 (patch) | |
tree | a060fa81ed5b9187f8b98178582f7abbca69e29f /reduced_system_layer.c | |
parent | 9eb170e70a7be9ed418152ad1b679473fbe0c35a (diff) | |
download | reduced_system_layer-7d92468a5d298ec6dd6455482ff0521efecf9541.zip |
Adjust wasm code and examples for new features
Diffstat (limited to 'reduced_system_layer.c')
-rwxr-xr-x | reduced_system_layer.c | 183 |
1 files changed, 87 insertions, 96 deletions
diff --git a/reduced_system_layer.c b/reduced_system_layer.c index 2b9ae9e..ae28109 100755 --- a/reduced_system_layer.c +++ b/reduced_system_layer.c @@ -1461,7 +1461,8 @@ static void drop_files_set_num_(i64 num) { resize_dynamic_array_exact(&g_platform.num_drop_files, (void **) &g_platform.drop_files, sizeof *g_platform.drop_files, num); - mem_set_(g_platform.drop_files + prev_num, 0, sizeof *g_platform.drop_files * (g_platform.num_drop_files - prev_num)); + if (prev_num < g_platform.num_drop_files) + mem_set_(g_platform.drop_files + prev_num, 0, sizeof *g_platform.drop_files * (g_platform.num_drop_files - prev_num)); } static void drop_files_set_name_(i64 index, i64 name_len, c8 *name) { @@ -1478,7 +1479,8 @@ static void drop_files_set_name_(i64 index, i64 name_len, c8 *name) { Drop_File *f = g_platform.drop_files + index; resize_dynamic_array_exact(&f->name_len, (void **) &f->name, 1, name_len); - mem_cpy_(f->name, name, f->name_len); + if (name != NULL) + mem_cpy_(f->name, name, f->name_len); } static void drop_files_set_data_(i64 index, i64 data_size) { @@ -1517,7 +1519,7 @@ static i8 pixel_size_update_(i64 real_width, i64 real_height) { resize_dynamic_array_exact(&g_platform.num_pixels, (void **) &g_platform.pixels, sizeof *g_platform.pixels, width * height); if (g_platform.num_pixels < width * height) LOG_ERROR("Failed to allocate %lld x %lld pixel buffer.", width, height); - height = g_platform.num_pixels / width; + height = width <= 0 ? 0 : g_platform.num_pixels / width; if (g_platform.frame_width != width || g_platform.frame_height != height) { size_changed = 1; @@ -1532,7 +1534,7 @@ static i8 pixel_size_update_(i64 real_width, i64 real_height) { if (_internal_pixels_len < internal_width * internal_height) LOG_ERROR("Failed to allocate %lld x %lld internal pixel buffer.", internal_width, internal_height); _internal_width = real_width; - _internal_height = min2_i32_(_internal_pixels_len / real_width, real_height); + _internal_height = real_width <= 0 ? 0 : min2_i32_(_internal_pixels_len / real_width, real_height); return size_changed; } @@ -1673,6 +1675,18 @@ static void cleanup_pixel_buffers_(void) { resize_dynamic_array_exact(&g_platform.num_pixels, (void **) &g_platform.pixels, sizeof *g_platform.pixels, 0); } +static void store_clipboard_text_(i64 size, c8 *data) { + if (size < 0 || data == NULL) + return; + + resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, size + 1); + + i64 len = g_platform.clipboard_text_len - 1; + mem_cpy_(g_platform.clipboard_text, data, len); + if (len >= 0) + g_platform.clipboard_text[len] = '\0'; +} + // ================================================================ // // Unix @@ -3556,15 +3570,13 @@ void render_main_window_frame(void) { } void write_clipboard_text(i64 size, c8 *data) { - XSetSelectionOwner(_display, _clipboard, _window, CurrentTime); + if (size < 0 || data == NULL) + return; - resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, size + 1); + store_clipboard_text_(size, data); - i64 len = g_platform.clipboard_text_len - 1; - if (len >= 0) { - mem_cpy_(g_platform.clipboard_text, data, len); - g_platform.clipboard_text[len] = '\0'; - } + if (g_platform.clipboard_text_len > 0) + XSetSelectionOwner(_display, _clipboard, _window, CurrentTime); } b8 x11_screenshot_(i64 max_num_pixels, i64 *width, i64 *height, vec4_f32 *pixels) { @@ -3765,10 +3777,8 @@ __attribute__((export_name("js_num_sound_channels"))) i32 js_num_sound_channels( #if defined(__wasm__) -static i32 _frame_width = 0; -static i32 _frame_height = 0; static i32 _num_events = 0; -static i32 _input_size = 0; +static i32 _input_len = 0; static i32 _cursor_dx = 0; static i32 _cursor_dy = 0; static f64 _wheel_dx = 0; @@ -3779,12 +3789,9 @@ static i64 _sound_read = 0; static b8 _files_dragged = 0; static b8 _files_dropped = 0; -static c8 _href [4096] = {0}; -static u32 _pixels_scaled [MAX_NUM_PIXELS] = {0}; -static u32 _internal_pixels [MAX_NUM_PIXELS] = {0}; -static b8 _key_pressed [MAX_NUM_KEYS] = {0}; -static f32 _sound_buffer [MAX_NUM_PRIMARY_SOUND_FRAMES] = {0}; -static u8 _drop_buffer [DROP_FILES_BUFFER_SIZE] = {0}; +static c8 _href [4096] = {0}; +static b8 _key_pressed [MAX_NUM_KEYS] = {0}; +static f32 _sound_buffer [MAX_NUM_PRIMARY_SOUND_FRAMES] = {0}; void shutdown_all_systems(void) { g_platform.done = 1; @@ -3838,10 +3845,17 @@ void init_main_window(void) { } i32 handle_main_window_events(void) { - if (g_platform.files_dropped) + if (g_platform.files_dropped) { + // NOTE: We won't be able to drop files at each + // of 2 sequential frames. + drop_files_clean_(); - g_platform.input_size = _input_size; + _files_dragged = 0; + _files_dropped = 0; + } + + g_platform.input_len = _input_len; g_platform.cursor_dx = _cursor_dx; g_platform.cursor_dy = _cursor_dy; g_platform.wheel_dx = _wheel_dx; @@ -3849,11 +3863,11 @@ i32 handle_main_window_events(void) { g_platform.files_dragged = _files_dragged; g_platform.files_dropped = _files_dropped; - _input_size = 0; - _cursor_dx = 0; - _cursor_dy = 0; - _wheel_dx = 0; - _wheel_dy = 0; + _input_len = 0; + _cursor_dx = 0; + _cursor_dy = 0; + _wheel_dx = 0; + _wheel_dy = 0; if (_files_dropped) { _files_dragged = 0; @@ -3877,36 +3891,7 @@ i32 wait_main_window_events(void) { } void render_main_window_frame(void) { - if (_frame_width == g_platform.frame_width && _frame_height == g_platform.frame_height) { - i64 size = g_platform.frame_width * g_platform.frame_height; - if (size > g_platform.num_pixels) - size = g_platform.num_pixels; - if (size > _internal_pixels_len) - size = _internal_pixels_len; - - for (i64 i = 0; i < size; ++i) - _internal_pixels[i] = 0xff000000u | rgb_u32_from_f32_((vec3_f32) { g_platform.pixels[i].z, g_platform.pixels[i].y, g_platform.pixels[i].x }); - } else { - i64 size = g_platform.frame_width * g_platform.frame_height; - if (size > g_platform.num_pixels) - size = g_platform.num_pixels; - if (size > _pixels_scaled_len) - size = _pixels_scaled_len; - - for (i64 i = 0; i < size; ++i) - _pixels_scaled[i] = rgb_u32_from_f32_((vec3_f32) { g_platform.pixels[i].z, g_platform.pixels[i].y, g_platform.pixels[i].x }); - - for (i64 j = 0; j < _frame_height; ++j) { - i64 j0 = (j * g_platform.frame_height) / _frame_height; - if ((j0 + 1) * _frame_width > _internal_pixels_len) break; - for (i64 i = 0; i < _frame_width; ++i) { - i64 i0 = (i * g_platform.frame_width) / _frame_width; - i64 n0 = j0 * g_platform.frame_width + i0; - if (n0 > _pixels_scaled_len) break; - _internal_pixels[j * _frame_width + i] = 0xff000000u | _pixels_scaled[n0]; - } - } - } + convert_pixels_for_window_(); } void write_clipboard_text_impl(i32 size, c8 *data); @@ -3914,14 +3899,11 @@ void write_clipboard_text_impl(i32 size, c8 *data); void write_clipboard_text(i64 size, c8 *data) { if (size < 0 || data == NULL) return; - if (size > MAX_CLIPBOARD_SIZE) - size = MAX_CLIPBOARD_SIZE; - g_platform.clipboard_size = size; - for (i64 i = 0; i < size; ++i) - g_platform.clipboard[i] = data[i]; + store_clipboard_text_(size, data); - write_clipboard_text_impl((i32) size, data); + if (g_platform.clipboard_text_len > 0) + write_clipboard_text_impl((i32) g_platform.clipboard_text_len - 1, data); } void take_screenshot(i64 max_num_pixels, i64 *width, i64 *height, vec4_f32 *pixels) { @@ -4005,12 +3987,7 @@ __attribute__((export_name("js_pixels"))) void *js_pixels(void) { __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 frame_height, i32 num_samples) { i64 frame_time = current_utc_time_in_milliseconds(); - if (frame_width > 0 && frame_height > 0 && frame_width * frame_height <= MAX_NUM_PIXELS) { - _frame_width = frame_width; - _frame_height = frame_height; - } - - _num_events += pixel_size_update_(_frame_width, _frame_height); + _num_events += pixel_size_update_(frame_width, frame_height); g_platform.done = 0; @@ -4026,7 +4003,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram for (i64 i = 0; i < num_samples; ++i) { i64 n = (_sound_read + i * NUM_PRIMARY_SOUND_CHANNELS + j) % MAX_NUM_PRIMARY_SOUND_FRAMES; _sound_buffer[j * num_samples + i] = _sound_ring[n]; - _sound_ring[n] = 0.f; + _sound_ring[n] = 0.f; } _sound_read = (_sound_read + num_samples * NUM_PRIMARY_SOUND_CHANNELS) % MAX_NUM_PRIMARY_SOUND_FRAMES; @@ -4068,8 +4045,12 @@ __attribute__((export_name("js_keydown"))) void js_keydown(u32 key, u32 mod, u32 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) { + + i64 n = g_platform.input_len; + resize_dynamic_array_capacity(&g_platform.input_len, &g_platform.input_capacity, (void **) &g_platform.input, sizeof *g_platform.input, n + 1); + + if (n < g_platform.input_len) + g_platform.input[n] = (Input_Key) { .ctrl = (mod & 1) ? 1 : 0, .shift = (mod & 2) ? 1 : 0, .alt = (mod & 4) ? 1 : 0, @@ -4094,17 +4075,15 @@ __attribute__((export_name("js_wheel"))) void js_wheel(f64 delta_x, f64 delta_y) _wheel_dy += delta_y * MOUSE_WHEEL_FACTOR; } -__attribute__((export_name("js_clipboard_size"))) i32 js_clipboard_size(void) { - return g_platform.clipboard_size; +__attribute__((export_name("js_clipboard_text_len"))) i32 js_clipboard_text_len(void) { + return g_platform.clipboard_text_len; } -__attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i32 len) { +__attribute__((export_name("js_clipboard_text"))) void *js_clipboard_text(i32 len) { if (len < 0) len = 0; - if (len > MAX_CLIPBOARD_SIZE) - len = MAX_CLIPBOARD_SIZE; - g_platform.clipboard_size = len; - return g_platform.clipboard; + resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, len); + return g_platform.clipboard_text; } __attribute__((export_name("js_dragenter"))) void js_dragenter(void) { @@ -4115,30 +4094,42 @@ __attribute__((export_name("js_dragleave"))) void js_dragleave(void) { _files_dragged = 0; } -__attribute__((export_name("js_max_drop_size"))) i32 js_max_drop_size(void) { - return sizeof _drop_buffer; -} - -__attribute__((export_name("js_drop_buffer"))) void *js_drop_buffer(void) { - return _drop_buffer; -} - -__attribute__((export_name("js_drop"))) void js_drop(i32 name_len, i32 data_size) { - if (name_len + data_size > (i32) sizeof _drop_buffer) { - LOG_ERROR("File too big."); - return; - } - +__attribute__((export_name("js_drop"))) i32 js_drop(i32 name_len, i32 data_size) { i64 n = g_platform.num_drop_files; drop_files_set_num_(n + 1); - drop_files_set_name_(n, name_len, (c8 *) _drop_buffer); + + if (n >= g_platform.num_drop_files) + return 0; + + drop_files_set_name_(n, name_len, NULL); drop_files_set_data_(n, data_size); - for (i64 i = 0; i < data_size; ++i) - g_platform.drop_files[n].data[i] = _drop_buffer[name_len + i]; + Drop_File *f = g_platform.drop_files + n; + + if (f->name_len != name_len || f->data_size != data_size) { + drop_files_set_name_(n, 0, NULL); + drop_files_set_data_(n, 0); + drop_files_set_num_(n); + return 0; + } + + mem_set_(f->name, 0, name_len); _files_dropped = 1; + return 1; +} + +__attribute__((export_name("js_drop_name"))) void *js_drop_name(void) { + if (g_platform.num_drop_files <= 0) + return NULL; + return g_platform.drop_files[g_platform.num_drop_files - 1].name; +} + +__attribute__((export_name("js_drop_data"))) void *js_drop_data(void) { + if (g_platform.num_drop_files <= 0) + return NULL; + return g_platform.drop_files[g_platform.num_drop_files - 1].data; } #endif // defined(__wasm__) |