diff options
author | KikooDX <kikoodx@paranoici.org> | 2022-08-31 16:13:41 +0200 |
---|---|---|
committer | KikooDX <kikoodx@paranoici.org> | 2022-08-31 16:32:30 +0200 |
commit | cda3e78a95cbd18fa39a0713bc5ba3362d715916 (patch) | |
tree | 1e663df551be978af1868702c0b395082f58df7c | |
parent | db39a7927d08ef15741fc22af15f1644e4c680ad (diff) | |
download | scr16-main.tar.gz |
-rw-r--r-- | Tupfile.emcc | 3 | ||||
-rw-r--r-- | audio.c | 9 | ||||
-rw-r--r-- | fe.c | 7 | ||||
-rw-r--r-- | main.c | 74 | ||||
-rw-r--r-- | render.c | 2 | ||||
-rw-r--r-- | sdl_init.c | 2 |
6 files changed, 66 insertions, 31 deletions
diff --git a/Tupfile.emcc b/Tupfile.emcc index 8df6ebf..66b5166 100644 --- a/Tupfile.emcc +++ b/Tupfile.emcc @@ -1,8 +1,9 @@ CC = emcc CFLAGS = -s USE_SDL=2 -s USE_SDL_IMAGE=2 -DEMCC -Os -std=c99 `sdl2-config --cflags` +LDFLAGS = -s EXIT_RUNTIME LIBS = -lm `sdl2-config --libs` -lSDL2_image .gitignore : beep.wav |> cembed -s -t beep_info -o %o %f |> beep.c : foreach *.c |> $(CC) $(CFLAGS) -c -o %o %f |> %B.o -: *.o |> $(CC) -o scr16.html %f $(LIBS) |> scr16.html scr16.wasm scr16.js +: *.o |> $(CC) $(LDFLAGS) -o scr16.html %f $(LIBS) |> scr16.html scr16.wasm scr16.js @@ -24,6 +24,9 @@ static void audio_callback(void *udata, unsigned char *stream, int size) int audio_init(void) { +#ifdef EMCC + return 0; +#endif audio_mutex = SDL_CreateMutex(); if (audio_mutex == NULL) { dx_log_error("%s", SDL_GetError()); @@ -51,6 +54,9 @@ int audio_init(void) void audio_deinit(void) { +#ifdef EMCC + return; +#endif if (dev != 0) { SDL_CloseAudioDevice(dev); dev = 0; @@ -63,6 +69,9 @@ void audio_deinit(void) cm_Source *audio_load(unsigned char *data, size_t size) { +#ifdef EMCC + return NULL; +#endif cm_Source *const snd = cm_new_source_from_mem(data, size); if (snd == NULL) { dx_log_error("%s", cm_get_error()); @@ -21,6 +21,7 @@ */ #include "fe.h" +#include "dx_log.h" #include <string.h> #define unused(x) ((void)(x)) @@ -119,11 +120,11 @@ void fe_error(fe_Context *ctx, const char *msg) ctx->handlers.error(ctx, msg, cl); } /* error handler returned -- print error and traceback, exit */ - fprintf(stderr, "error: %s\n", msg); + dx_log_error("%s", msg); for (; !isnil(cl); cl = cdr(cl)) { char buf[64]; fe_tostring(ctx, car(cl), buf, sizeof(buf)); - fprintf(stderr, "=> %s\n", buf); + dx_log_error("=> %s", buf); } exit(EXIT_FAILURE); } @@ -978,7 +979,7 @@ static char buf[64000]; static void onerror(fe_Context *ctx, const char *msg, fe_Object *cl) { unused(ctx), unused(cl); - fprintf(stderr, "error: %s\n", msg); + dx_log_error("%s", msg); longjmp(toplevel, -1); } @@ -12,12 +12,19 @@ #include <math.h> #include <stdio.h> #include <string.h> +#ifdef EMCC +#include "emscripten.h" +#endif FILE *fp = NULL; static void *data = NULL; static fe_Context *ctx = NULL; static cm_Source *beep = NULL; +static int gc = 0, stop = 0; +static fe_Object *update_sym = NULL; +static fe_Object *draw_sym = NULL; +static void run_frame(void); static int init(void); static int deinit(void); static int cycle_events(void); @@ -55,7 +62,7 @@ int main(int argc, char **argv) return deinit(); } - int gc = fe_savegc(ctx); + gc = fe_savegc(ctx); for (;;) { fe_Object *const obj = fe_readfp(ctx, fp); if (obj == NULL) @@ -70,32 +77,47 @@ int main(int argc, char **argv) fe_eval(ctx, fe_list(ctx, &init_sym, 1)); fe_restoregc(ctx, gc); - fe_Object *update_sym = fe_symbol(ctx, "_update"); - fe_Object *draw_sym = fe_symbol(ctx, "_draw"); + update_sym = fe_symbol(ctx, "_update"); + draw_sym = fe_symbol(ctx, "_draw"); while (!cycle_events()) { - static int cleaned = 0; - fe_eval(ctx, fe_list(ctx, &update_sym, 1)); - fe_restoregc(ctx, gc); - if (r_draw_begin()) { - dx_log_error("r_draw_begin failed"); - return deinit(); - } - if (!cleaned) { - r_cls(); - cleaned = 1; - } - fe_eval(ctx, fe_list(ctx, &draw_sym, 1)); - fe_restoregc(ctx, gc); - if (r_draw_end()) { - dx_log_error("r_draw_end failed"); - return deinit(); - } +#ifdef EMCC + emscripten_set_main_loop(run_frame, 0, 0); +#else + run_frame(); +#endif + if (stop) + return 1; } deinit(); return 0; } +static void run_frame(void) +{ + static int cleaned = 0; + fe_eval(ctx, fe_list(ctx, &update_sym, 1)); + fe_restoregc(ctx, gc); + if (r_draw_begin()) { + dx_log_error("r_draw_begin failed"); + deinit(); + stop = 1; + return; + } + if (!cleaned) { + r_cls(); + cleaned = 1; + } + fe_eval(ctx, fe_list(ctx, &draw_sym, 1)); + fe_restoregc(ctx, gc); + if (r_draw_end()) { + dx_log_error("r_draw_end failed"); + deinit(); + stop = 1; + return; + } +} + static int init(void) { const size_t size = 1024 * 1024; @@ -114,10 +136,8 @@ static int init(void) return 1; } beep = audio_load(beep_info[0].data, beep_info[0].size); - if (beep == NULL) { - dx_log_error("audio_load failed"); - return 1; - } + if (beep == NULL) + dx_log_warn("audio_load failed"); fe_set(ctx, fe_symbol(ctx, "floor"), fe_cfunc(ctx, cf_floor)); fe_set(ctx, fe_symbol(ctx, "ceil"), fe_cfunc(ctx, cf_ceil)); fe_set(ctx, fe_symbol(ctx, "round"), fe_cfunc(ctx, cf_round)); @@ -274,7 +294,9 @@ CFUNC(cf_keypress) CFUNC(cf_beep) { (void)ctx, (void)arg; - cm_stop(beep); - cm_play(beep); + if (beep != NULL) { + cm_stop(beep); + cm_play(beep); + } return NULL; } @@ -20,7 +20,7 @@ int r_init(void) return 1; } SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 0); - window = SDL_CreateWindow("enefe", SDL_WINDOWPOS_UNDEFINED, + window = SDL_CreateWindow("scr16", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 256, 256, SDL_WINDOW_RESIZABLE); if (window == NULL) { @@ -9,10 +9,12 @@ int sdl_init(void) dx_log_error("%s", SDL_GetError()); return 1; } +#ifndef EMCC if (IMG_Init(IMG_INIT_PNG) == 0) { dx_log_error("%s", IMG_GetError()); return 1; } +#endif return 0; } |