summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-10-26 09:39:52 +0200
committerkdx <kikoodx@paranoici.org>2023-10-26 09:39:52 +0200
commit1a230616c03a0b9f3b5767e12d9c88005df16a70 (patch)
tree789338e0277061b65425fc48626ef1d45d1e2f4f
parent8bb9559d8746657f97089353952cc6b47d1201e7 (diff)
downloadcarrenoirsurfondblanc-1a230616c03a0b9f3b5767e12d9c88005df16a70.tar.gz
get rid of tzr
-rw-r--r--TZR.c1329
-rw-r--r--TZR.h476
-rw-r--r--_.h11
-rwxr-xr-xbuild.sh1
-rw-r--r--compile_flags.txt1
-rw-r--r--main.c37
6 files changed, 14 insertions, 1841 deletions
diff --git a/TZR.c b/TZR.c
deleted file mode 100644
index a39eb0a..0000000
--- a/TZR.c
+++ /dev/null
@@ -1,1329 +0,0 @@
-/* Licensing information can be found at the end of the file. */
-
-#ifdef TZR_STB_IMAGE
-#define STB_IMAGE_IMPLEMENTATION
-#include "stb_image.h"
-#undef STB_IMAGE_IMPLEMENTATION
-#endif
-
-#ifdef TZR_SOLOUD
-#include "soloud_c.h"
-#endif
-#include <limits.h>
-#include <math.h>
-#include <SDL2/SDL_error.h>
-#include <SDL2/SDL_events.h>
-#include <SDL2/SDL_gamecontroller.h>
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_log.h>
-#include <SDL2/SDL_mixer.h>
-#include <SDL2/SDL_mouse.h>
-#include <SDL2/SDL_render.h>
-#include <SDL2/SDL_rwops.h>
-#include <SDL2/SDL_scancode.h>
-#include <SDL2/SDL_timer.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <sys/stat.h>
-#include "TZR.h"
-#include <unistd.h>
-
-/* sources/drain.h */
-
-static void *drain_error(void)
-{
- perror("TZR_LoadResourceTyped:drain");
- return NULL;
-}
-
-static char *drain(FILE *fp, size_t *size)
-{
- if (fseek(fp, 0, SEEK_END) < 0)
- return drain_error();
- *size = ftell(fp);
- if (fseek(fp, 0, SEEK_SET) < 0)
- return drain_error();
- char *data = malloc(*size);
- if (data == NULL)
- return drain_error();
- if (fread(data, 1, *size, fp) != *size)
- return free(data), drain_error();
- return data;
-}
-
-/* sources/reserve.h */
-
-static int
-reserve(void **vec, size_t size, size_t *capacity, size_t elem)
-{
- if (size <= *capacity)
- return 0;
- size_t target = 16;
- while (target < size * elem)
- target *= 2;
- void *new_resources;
- if (*vec == NULL)
- new_resources = malloc(target);
- else
- new_resources = realloc(*vec, target);
- if (new_resources == NULL) {
- perror("TZR_LoadResourceFromMemory:reserve_ressources");
- return 1;
- }
- *vec = new_resources;
- *capacity = target / elem;
- return 0;
-}
-
-/* sources/sdl_error.h */
-
-static int sdl_error(int rv)
-{
- SDL_Log("%s\n", SDL_GetError());
- return rv;
-}
-/* sources/sdl_rect_to_rect.h */
-
-static void TZR_RectFromSDLRect(TZR_Rect *dest, const SDL_Rect *src)
-{
- dest->from.x = src->x;
- dest->from.y = src->y;
- dest->to.x = src->x + src->w - 1;
- dest->to.y = src->y + src->h - 1;
-}
-/* sources/globals.c */
-
-TZR_Config ___tzr_config = {0};
-TZR_Color ___tzr_color = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-TZR_Resource *___tzr_resources = NULL;
-size_t ___tzr_resources_capacity = 0;
-size_t ___tzr_resources_size = 0;
-SDL_Window *___tzr_window = NULL;
-SDL_Renderer *___tzr_renderer = NULL;
-SDL_Texture *___tzr_target = NULL;
-unsigned long ___tzr_tick = 0;
-unsigned long ___tzr_next_time = 0;
-unsigned long ___tzr_min_dt = 0;
-int ___tzr_should_quit = 0;
-int ___tzr_mouse_x = 0;
-int ___tzr_mouse_y = 0;
-TZR_KeyState ___tzr_keystates[SDL_NUM_SCANCODES] = {0};
-TZR_KeyState ___tzr_mousestates[256] = {0}; //doc says than mouse button is u8
-TZR_KeyState ___tzr_joystates[SDL_CONTROLLER_BUTTON_MAX] = {0};
-float ___tzr_scale = 1.0;
-int ___tzr_off_x = 1.0;
-int ___tzr_off_y = 1.0;
-Mix_Music *___tzr_music = NULL;
-TZR_Joystick *___tzr_joysticks = NULL;
-size_t ___tzr_joysticks_capacity = 0;
-size_t ___tzr_joysticks_size = 0;
-SDL_BlendMode ___tzr_blendmode = SDL_BLENDMODE_BLEND;
-
-#ifdef TZR_SOLOUD
-Soloud ___tzr_soloud = NULL;
-#endif
-/* sources/TZR_BlendMode.c */
-
-int
-TZR_BlendMode(SDL_BlendMode mode)
-{
- ___tzr_blendmode = mode;
- if (SDL_SetRenderDrawBlendMode(___tzr_renderer, mode))
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_CycleEvents.c */
-
-void
-next_state(TZR_KeyState *keystate)
-{
- switch (*keystate) {
- case TZR_KEYSTATE_RELEASE:
- case TZR_KEYSTATE_UP:
- *keystate = TZR_KEYSTATE_UP;
- break;
- case TZR_KEYSTATE_PRESS:
- case TZR_KEYSTATE_DOWN:
- *keystate = TZR_KEYSTATE_DOWN;
- break;
- default:
- break;
- }
-}
-
-static void
-get_axis(SDL_GameController *gc, float *out, SDL_GameControllerAxis axis)
-{
- const Sint16 v = SDL_GameControllerGetAxis(gc, axis);
- if (v > -16384 && v < 16384)
- *out = 0.0f;
- else
- *out = (float)v / INT16_MAX;
-}
-
-void
-TZR_CycleEvents(void)
-{
- TZR_ResourcesWatch();
- for (int i = 0; i < SDL_NUM_SCANCODES; i++)
- next_state(&___tzr_keystates[i]);
- for (int i = 0; i < 256; i++)
- next_state(&___tzr_mousestates[i]);
- for (int i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++)
- next_state(&___tzr_joystates[i]);
- TZR_Event e;
- while (TZR_PollEvent(&e))
- ;
-
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- TZR_Joystick *const jstick = &___tzr_joysticks[i];
- if (jstick->ptr == NULL)
- continue;
- for (int k = 0; k < SDL_CONTROLLER_BUTTON_MAX; k++) {
- if (SDL_GameControllerGetButton(jstick->ptr, k)) {
- if (___tzr_joystates[k] != TZR_KEYSTATE_DOWN)
- ___tzr_joystates[k] = TZR_KEYSTATE_PRESS;
- } else {
- if (___tzr_joystates[k] != TZR_KEYSTATE_UP)
- ___tzr_joystates[k] = TZR_KEYSTATE_RELEASE;
- }
- }
- get_axis(jstick->ptr, &jstick->leftx, SDL_CONTROLLER_AXIS_LEFTX);
- get_axis(jstick->ptr, &jstick->lefty, SDL_CONTROLLER_AXIS_LEFTY);
- get_axis(jstick->ptr, &jstick->rightx, SDL_CONTROLLER_AXIS_RIGHTX);
- get_axis(jstick->ptr, &jstick->righty, SDL_CONTROLLER_AXIS_RIGHTY);
- }
-}
-/* sources/TZR_DestroyResource.c */
-
-void
-TZR_DestroyResource(TZR_Resource *res, int free_path)
-{
- if (res->path != NULL && free_path)
- free(res->path);
- switch (res->type) {
- case TZR_RES_RAW:
- if (res->raw.data != NULL)
- free(res->raw.data);
- break;
- case TZR_RES_IMAGE:
- if (res->image.ptr != NULL)
- SDL_DestroyTexture(res->image.ptr);
- break;
- case TZR_RES_SOUND:
-#ifdef TZR_SOLOUD
- if (res->sound.ptr != NULL)
- Wav_destroy(res->sound.ptr);
-#else
- if (res->sound.ptr != NULL)
- Mix_FreeChunk(res->sound.ptr);
-#endif
- break;
- default:
- fprintf(stderr, "unknown resource type %u\n", res->type);
- break;
- }
-}
-
-/* sources/TZR_DirectResourceLoad.c */
-
-#ifdef TZR_STB_IMAGE
-#define STB_IMAGE_IMPLEMENTATION
-
-SDL_Surface *
-stbi_load_surface(void *src, int size)
-{
- int width, height, chans;
- void *const data = stbi_load_from_memory(src, size, &width, &height,
- &chans, 4);
- const int pitch = (width * 4 + 3) & ~3;
-
- if (data == NULL) {
- fprintf(stderr, "stbi: %s\n", stbi_failure_reason());
- return NULL;
- }
-
- if (chans != 4) {
- fprintf(stderr, "TZR only supports RGBA images\n");
- free(data);
- return NULL;
- }
-
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN
- const int rmask = 0x000000ff;
- const int gmask = 0x0000ff00;
- const int bmask = 0x00ff0000;
- const int amask = 0xff000000 * (chans == 4);
-#else
- const int s = 8 * (chans != 4);
- const int rmask = 0xff000000 >> s;
- const int gmask = 0x00ff0000 >> s;
- const int bmask = 0x0000ff00 >> s;
- const int amask = 0x000000ff >> s;
-#endif
-
- SDL_Surface *const surf = SDL_CreateRGBSurfaceFrom(data, width, height, chans * 8, pitch, rmask, gmask, bmask, amask);
- if (surf == NULL) {
- sdl_error(0);
- free(data);
- return NULL;
- }
-
- return surf;
-}
-#endif
-
-int
-TZR_DirectResourceLoad(TZR_Resource *res, const void *data, int size)
-{
- switch (res->type) {
- case TZR_RES_RAW:
- res->raw.size = size;
- res->raw.data = malloc(size);
- if (res->raw.data == NULL) {
- perror("TZR_DirectResourceLoad");
- return -1;
- }
- memcpy(res->raw.data, data, size);
- break;
- case TZR_RES_IMAGE: {
-#ifdef TZR_STB_IMAGE
- SDL_Surface *const surf = stbi_load_surface((void*)data, size);
- if (surf == NULL)
- return -1;
-#else
- SDL_RWops *const rw = SDL_RWFromConstMem(data, size);
- if (rw == NULL)
- return sdl_error(-1);
- SDL_Surface *const surf = SDL_LoadBMP_RW(rw, 1);
- if (surf == NULL)
- return sdl_error(-1);
-#endif
- SDL_Texture *const tex =
- SDL_CreateTextureFromSurface(___tzr_renderer, surf);
- SDL_FreeSurface(surf);
- if (tex == NULL)
- return sdl_error(-1);
- if (SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND) < 0) {
- SDL_DestroyTexture(tex);
- return sdl_error(-1);
- }
- if (SDL_QueryTexture(tex, NULL, NULL,
- &res->image.width, &res->image.height)) {
- SDL_DestroyTexture(tex);
- return sdl_error(-1);
- }
- res->image.ptr = tex;
- } break;
- case TZR_RES_SOUND: {
- if (!___tzr_config.mixer) {
- SDL_Log("audio mixer disabled, skip loading");
- return -1;
- }
-#ifdef TZR_SOLOUD
- Wav *wav = Wav_create();
- if (wav == NULL) {
- SDL_Log("Wav_create failed");
- return -1;
- }
- if (Wav_loadMemEx(wav, data, size, true, false)) {
- SDL_Log("Wav_loadMem failed");
- Wav_destroy(wav);
- return -1;
- }
- res->sound.ptr = wav;
-#else
- SDL_RWops *const rw = SDL_RWFromConstMem(data, size);
- if (rw == NULL)
- return sdl_error(-1);
- Mix_Chunk *const chunk = Mix_LoadWAV_RW(rw, 0);
- SDL_RWclose(rw);
- if (chunk == NULL)
- return sdl_error(-1);
- res->sound.ptr = chunk;
-#endif
- } break;
- default:
- fprintf(stderr, "invalid type\n");
- return -1;
- }
- return 0;
-}
-/* sources/TZR_DrawBegin.c */
-
-int
-TZR_DrawBegin(void)
-{
- if (TZR_BlendMode(SDL_BLENDMODE_BLEND))
- return sdl_error(-1);
- if (___tzr_config.hd_render)
- return 0;
- if (SDL_SetRenderTarget(___tzr_renderer, ___tzr_target) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_DrawClear.c */
-
-int
-TZR_DrawClear(void)
-{
- if (SDL_RenderClear(___tzr_renderer) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_DrawEnd.c */
-
-static int
-pixel_draw_end(void)
-{
- if (SDL_SetRenderTarget(___tzr_renderer, NULL) < 0)
- return sdl_error(-1);
- if (SDL_SetRenderDrawColor(___tzr_renderer, 0, 0, 0, 255) < 0)
- return sdl_error(-1);
- if (SDL_RenderClear(___tzr_renderer) < 0)
- return sdl_error(-1);
-
- int win_w, win_h;
- SDL_GetWindowSize(___tzr_window, &win_w, &win_h);
- win_w = win_w ? win_w : 1;
- win_h = win_h ? win_h : 1;
-
- const float ratio_w = win_w / (float)___tzr_config.width;
- const float ratio_h = win_h / (float)___tzr_config.height;
- ___tzr_scale = (ratio_w < ratio_h) ? ratio_w : ratio_h;
- if (___tzr_scale > 1.0f && ___tzr_config.pixel_perfect)
- ___tzr_scale = (int)___tzr_scale;
- ___tzr_off_x = (win_w - ___tzr_config.width * ___tzr_scale) / 2;
- ___tzr_off_y = (win_h - ___tzr_config.height * ___tzr_scale) / 2;
- const SDL_Rect dest = {
- ___tzr_off_x,
- ___tzr_off_y,
- ___tzr_config.width * ___tzr_scale,
- ___tzr_config.height * ___tzr_scale
- };
-
- if (SDL_RenderCopy(___tzr_renderer, ___tzr_target, NULL, &dest) < 0)
- return sdl_error(-1);
-
- return 0;
-}
-
-int
-TZR_DrawEnd(void)
-{
- if (!___tzr_config.hd_render && pixel_draw_end())
- return -1;
-
- if (___tzr_config.target_fps > 0) {
- ___tzr_next_time += ___tzr_min_dt;
- const unsigned long cur_time = SDL_GetTicks64();
- if (___tzr_next_time <= cur_time)
- ___tzr_next_time = cur_time;
- else
- SDL_Delay(___tzr_next_time - cur_time);
- }
- SDL_RenderPresent(___tzr_renderer);
-
- ___tzr_tick += 1;
- return 0;
-}
-/* sources/TZR_DrawImage.c */
-
-int
-_TZR_DrawImage(const TZR_DrawImageArgs *args)
-{
- if (args->id == 0) {
- fprintf(stderr, "args->id is 0\n");
- return -1;
- }
-
- if (TZR_GetResourceType(args->id) != TZR_RES_IMAGE) {
- fprintf(stderr, "%u isn't an image\n", args->id);
- return -1;
- }
- TZR_Resource *const res = TZR_GetResourcePointer(args->id);
- const TZR_Image *const img = &res->image;
-
- if (SDL_SetTextureColorMod(img->ptr, ___tzr_color.r * 255,
- ___tzr_color.g * 255, ___tzr_color.b * 255))
- return sdl_error(-1);
- if (SDL_SetTextureAlphaMod(img->ptr, ___tzr_color.a * 255))
- return sdl_error(-1);
- if (SDL_SetTextureBlendMode(img->ptr, ___tzr_blendmode) < 0)
- return sdl_error(-1);
-
- float scale_x = args->sx;
- float scale_y = args->sy;
-
- int simg_width = (args->w == INT_MIN) ? img->width : args->w;
- if (simg_width < 0) {
- simg_width *= -1;
- scale_x *= -1;
- }
- if (simg_width + args->ix > img->width)
- simg_width = img->width - args->ix;
-
- int simg_height = (args->h == INT_MIN) ? img->height : args->h;
- if (simg_height < 0) {
- simg_height *= -1;
- scale_y *= -1;
- }
- if (simg_height + args->iy > img->height)
- simg_height = img->height - args->iy;
-
- int flip = 0;
- flip |= SDL_FLIP_HORIZONTAL * ((scale_x < 0.0f) ^ args->flip_x);
- flip |= SDL_FLIP_VERTICAL * ((scale_y < 0.0f) ^ args->flip_y);
- const SDL_Rect src = {
- args->ix,
- args->iy,
- simg_width,
- simg_height
- };
-
- const int width = simg_width * fabs(scale_x);
- const int height = simg_height * fabs(scale_y);
- const int x = args->x - (scale_x < 0.0f ? width : 0);
- const int y = args->y - (scale_y < 0.0f ? height : 0);
-
- const SDL_Rect dest = {
- x - (args->center ? (simg_width * scale_x / 2) : 0),
- y - (args->center ? (simg_height * scale_y / 2) : 0),
- width,
- height
- };
- if (SDL_RenderCopyEx(___tzr_renderer, img->ptr, &src, &dest,
- args->r * 360, NULL, flip) < 0)
- return sdl_error(-1);
- TZR_Rect area;
- TZR_RectFromSDLRect(&area, &dest);
- return 0;
-}
-/* sources/TZR_DrawLine.c */
-
-int
-TZR_DrawLine(int x0, int y0, int x1, int y1)
-{
- if (SDL_RenderDrawLine(___tzr_renderer, x0, y0, x1, y1) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_DrawPoint.c */
-
-int
-TZR_DrawPoint(int x, int y)
-{
- if (SDL_RenderDrawPoint(___tzr_renderer, x, y) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_DrawRectangle.c */
-
-int
-_TZR_DrawRectangle(const TZR_DrawRectangleArgs *args)
-{
- const SDL_Rect rect = {
- args->x - args->center * (args->w / 2),
- args->y - args->center * (args->h / 2),
- args->w,
- args->h
- };
- if (args->fill) {
- if (SDL_RenderFillRect(___tzr_renderer, &rect) < 0)
- return sdl_error(-1);
- } else {
- if (SDL_RenderDrawRect(___tzr_renderer, &rect) < 0)
- return sdl_error(-1);
- }
- return 0;
-}
-/* sources/TZR_DrawSetColor8.c */
-
-int
-TZR_DrawSetColor8(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
-{
- ___tzr_color.r = (float)r / 255.0f;
- ___tzr_color.g = (float)g / 255.0f;
- ___tzr_color.b = (float)b / 255.0f;
- ___tzr_color.a = (float)a / 255.0f;
- if (SDL_SetRenderDrawColor(___tzr_renderer, r, g, b, a) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_DrawSetColor.c */
-
-int
-_TZR_DrawSetColor(const TZR_Color *color)
-{
- ___tzr_color.r = (color->r < 0.0f) ? ___tzr_color.r : color->r;
- ___tzr_color.g = (color->g < 0.0f) ? ___tzr_color.g : color->g;
- ___tzr_color.b = (color->b < 0.0f) ? ___tzr_color.b : color->b;
- ___tzr_color.a = (color->a < 0.0f) ? ___tzr_color.a : color->a;
- const uint8_t r = ___tzr_color.r * 255;
- const uint8_t g = ___tzr_color.g * 255;
- const uint8_t b = ___tzr_color.b * 255;
- const uint8_t a = ___tzr_color.a * 255;
- if (SDL_SetRenderDrawColor(___tzr_renderer, r, g, b, a) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_GetImageHeight.c */
-
-int
-TZR_GetImageHeight(TZR_Uint id)
-{
- return TZR_GetResourcePointer(id)->image.height;
-}
-/* sources/TZR_GetImageWidth.c */
-
-int
-TZR_GetImageWidth(TZR_Uint id)
-{
- return TZR_GetResourcePointer(id)->image.width;
-}
-/* sources/TZR_GetKeyState.c */
-
-TZR_KeyState
-TZR_GetKeyState(int scancode)
-{
- return ___tzr_keystates[scancode];
-}
-/* sources/TZR_GetRawResource.c */
-
-TZR_Raw *
-TZR_GetRawResource(TZR_Uint id)
-{
- return &TZR_GetResourcePointer(id)->raw;
-}
-/* sources/TZR_GetResourcePath.c */
-
-const char *
-TZR_GetResourcePath(TZR_Uint id)
-{
- return TZR_GetResourcePointer(id)->path;
-}
-/* sources/TZR_GetResourcePointer.c */
-
-TZR_Resource *
-TZR_GetResourcePointer(TZR_Uint id)
-{
- return &___tzr_resources[id - 1];
-}
-/* sources/TZR_GetResourceType.c */
-
-TZR_ResourceType
-TZR_GetResourceType(TZR_Uint id)
-{
- return TZR_GetResourcePointer(id)->type;
-}
-/* sources/TZR_GetTick.c */
-
-unsigned long
-TZR_GetTick(void)
-{
- return ___tzr_tick;
-}
-/* sources/TZR_Init.c */
-
-static int
-_sdl_error(void)
-{
- sdl_error(-1);
- TZR_Quit();
- return -1;
-}
-
-int
-_TZR_Init(const TZR_Config *config)
-{
- memcpy(&___tzr_config, config, sizeof(TZR_Config));
-
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0)
- return _sdl_error();
- if (___tzr_config.mixer == TZR_MIXER_FLAC &&
- Mix_Init(MIX_INIT_FLAC) != MIX_INIT_FLAC)
- {
- SDL_Log("%s", Mix_GetError());
- ___tzr_config.mixer = TZR_MIXER_OFF;
- }
-
- int chdir_rv;
- if (___tzr_config.basepath == NULL) {
- char *const basepath = SDL_GetBasePath();
- if (basepath == NULL)
- return _sdl_error();
- chdir_rv = chdir(basepath);
- SDL_free(basepath);
- } else
- chdir_rv = chdir(___tzr_config.basepath);
- if (chdir_rv < 0)
- return perror("TZR_Init"), -1;
-
- ___tzr_window =
- SDL_CreateWindow(config->title,
- SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED,
- ___tzr_config.width * ___tzr_config.scale,
- ___tzr_config.height * ___tzr_config.scale,
- SDL_WINDOW_RESIZABLE);
- if (___tzr_window == NULL)
- return _sdl_error();
-
-#ifdef __EMSCRIPTEN__
- ___tzr_renderer = SDL_CreateRenderer(___tzr_window, -1,
- SDL_RENDERER_SOFTWARE);
-#else
- ___tzr_renderer = SDL_CreateRenderer(___tzr_window, -1,
- SDL_RENDERER_ACCELERATED);
-#endif
- if (___tzr_renderer == NULL)
- return _sdl_error();
-
- if (___tzr_config.hd_render) {
- if (SDL_RenderSetLogicalSize(___tzr_renderer,
- ___tzr_config.width,
- ___tzr_config.height) < 0)
- return _sdl_error();
- } else {
- ___tzr_target = SDL_CreateTexture(___tzr_renderer,
- SDL_PIXELFORMAT_RGB888,
- SDL_TEXTUREACCESS_TARGET,
- ___tzr_config.width,
- ___tzr_config.height);
- if (___tzr_target == NULL)
- return _sdl_error();
- }
-
- SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,
- ___tzr_config.scale_linear ? "1" : "0");
- ___tzr_tick = 0;
-
- if (___tzr_config.target_fps > 0) {
- ___tzr_min_dt = 1000 / ___tzr_config.target_fps;
- ___tzr_next_time = SDL_GetTicks64();
- }
-
- if (!___tzr_config.show_cursor)
- SDL_ShowCursor(SDL_FALSE);
- ___tzr_mouse_x = ___tzr_config.width / 2;
- ___tzr_mouse_y = ___tzr_config.height / 2;
-
- /* Setup audio. */
- do if (___tzr_config.mixer) {
- if (Mix_OpenAudio(48000, MIX_DEFAULT_FORMAT, 8, 1024) < 0) {
- sdl_error(0);
- Mix_Quit();
- ___tzr_config.mixer = false;
- break;
- }
-
-#ifdef TZR_SOLOUD
- ___tzr_soloud = Soloud_create();
- if (___tzr_soloud == NULL) {
- SDL_Log("Soloud_create failed");
- Mix_Quit();
- ___tzr_config.mixer = false;
- break;
- }
-
- if (Soloud_init(___tzr_soloud)) {
- SDL_Log("Soloud_init failed");
- Soloud_destroy(___tzr_soloud);
- ___tzr_soloud = NULL;
- Mix_Quit();
- ___tzr_config.mixer = false;
- break;
- }
-#endif
- } while (0);
- return 0;
-}
-/* sources/TZR_IsKeyDown.c */
-
-bool
-TZR_IsKeyDown(int scancode)
-{
- const TZR_KeyState state = TZR_GetKeyState(scancode);
- return (state == TZR_KEYSTATE_DOWN || state == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_IsKeyPressed.c */
-
-bool
-TZR_IsKeyPressed(int scancode)
-{
- return (TZR_GetKeyState(scancode) == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_IsKeyReleased.c */
-
-bool
-TZR_IsKeyReleased(int scancode)
-{
- if (TZR_GetKeyState(scancode) == TZR_KEYSTATE_RELEASE)
- return true;
- return false;
-}
-/* sources/TZR_IsKeyUp.c */
-
-bool
-TZR_IsKeyUp(int scancode)
-{
- const TZR_KeyState state = TZR_GetKeyState(scancode);
- return (state == TZR_KEYSTATE_UP || state == TZR_KEYSTATE_RELEASE);
-}
-/* sources/TZR_JoystickDown.c */
-
-bool
-TZR_JoystickDown(uint8_t button)
-{
- const TZR_KeyState state = TZR_JoystickGetState(button);
- return (state == TZR_KEYSTATE_DOWN || state == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_JoystickGetState.c */
-
-TZR_KeyState
-TZR_JoystickGetState(uint8_t button)
-{
- return ___tzr_joystates[button];
-}
-/* sources/TZR_JoystickLeftX.c */
-
-float
-TZR_JoystickLeftX(void)
-{
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr == NULL)
- continue;
- if (___tzr_joysticks[i].leftx)
- return ___tzr_joysticks[i].leftx;
- }
- return 0.0f;
-}
-/* sources/TZR_JoystickLeftY.c */
-
-float
-TZR_JoystickLeftY(void)
-{
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr == NULL)
- continue;
- if (___tzr_joysticks[i].lefty)
- return ___tzr_joysticks[i].lefty;
- }
- return 0.0f;
-}
-/* sources/TZR_JoystickPressed.c */
-
-bool
-TZR_JoystickPressed(uint8_t button)
-{
- return (TZR_JoystickGetState(button) == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_JoystickReleased.c */
-
-bool
-TZR_JoystickReleased(uint8_t button)
-{
- return (TZR_JoystickGetState(button) == TZR_KEYSTATE_RELEASE);
-}
-/* sources/TZR_JoystickRightX.c */
-
-float
-TZR_JoystickRightX(void)
-{
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr == NULL)
- continue;
- if (___tzr_joysticks[i].rightx)
- return ___tzr_joysticks[i].rightx;
- }
- return 0.0f;
-}
-/* sources/TZR_JoystickRightY.c */
-
-float
-TZR_JoystickRightY(void)
-{
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr == NULL)
- continue;
- if (___tzr_joysticks[i].righty)
- return ___tzr_joysticks[i].righty;
- }
- return 0.0f;
-}
-/* sources/TZR_JoystickUp.c */
-
-bool
-TZR_JoystickUp(uint8_t button)
-{
- const TZR_KeyState state = TZR_JoystickGetState(button);
- return (state == TZR_KEYSTATE_UP || state == TZR_KEYSTATE_RELEASE);
-}
-/* sources/TZR_LoadResource.c */
-
-static TZR_ResourceType
-deduce_type(const char *path)
-{
- const char *const path_extension = strrchr(path, '.');
- if (path_extension == NULL)
- return TZR_RES_RAW;
- if (strcasecmp(path_extension, ".bmp") == 0 ||
- strcasecmp(path_extension, ".png") == 0 ||
- strcasecmp(path_extension, ".jpg") == 0 ||
- strcasecmp(path_extension, ".qoi") == 0)
- return TZR_RES_IMAGE;
- if (strcasecmp(path_extension, ".wav") == 0)
- return TZR_RES_SOUND;
- return TZR_RES_RAW;
-}
-
-TZR_Uint
-TZR_LoadResource(const char *path)
-{
- return TZR_LoadResourceTyped(deduce_type(path), path);
-}
-/* sources/TZR_LoadResourceFromMemory.c */
-
-TZR_Uint
-TZR_LoadResourceFromMemory(TZR_ResourceType type, const void *data, int size)
-{
- void *vec = ___tzr_resources;
- if (reserve(&vec,
- ___tzr_resources_size + 1,
- &___tzr_resources_capacity,
- sizeof(TZR_Resource)))
- {
- fprintf(stderr, "failed to reserve for new ressource\n");
- return 0;
- }
- ___tzr_resources = vec;
-
- TZR_Resource *const res = &___tzr_resources[___tzr_resources_size];
- res->type = type;
- res->path = NULL;
- if (TZR_DirectResourceLoad(res, data, size))
- return 0;
- ___tzr_resources_size += 1;
- return ___tzr_resources_size;
-}
-/* sources/TZR_LoadResourceTyped.c */
-
-TZR_Uint
-TZR_LoadResourceTyped(TZR_ResourceType type, const char *path)
-{
- for (TZR_Uint i = 0; i < ___tzr_resources_size; i++)
- if (___tzr_resources[i].type == type &&
- strcmp(___tzr_resources[i].path, path) == 0)
- return i + 1;
- FILE *const fp = fopen(path, "rb");
- if (fp == NULL) {
- perror(path);
- return 0;
- }
- size_t size;
- char *const data = drain(fp, &size);
- fclose(fp);
- if (data == NULL)
- return 0;
- const TZR_Uint id = TZR_LoadResourceFromMemory(type, data, size);
- free(data);
- if (id == 0)
- return 0;
- TZR_Resource *const res = TZR_GetResourcePointer(id);
-
- const size_t path_len = strlen(path);
- struct stat st = {0};
- (void)stat(path, &st);
- res->path = malloc(path_len + 1);
- res->mtime = 0;
- if (res->path == NULL)
- perror("TZR_LoadResourceTyped");
- else
- strcpy(res->path, path);
- return id;
-}
-/* sources/TZR_MainLoop.c */
-
-#ifdef __EMSCRIPTEN__
-
-static int (*_main_loop)(void *udata);
-static void *_udata;
-static void
-_em_loop(void)
-{
- TZR_CycleEvents();
- _main_loop(_udata);
-}
-
-int
-TZR_MainLoop(int (*main_loop)(void *udata), void *udata)
-{
- _main_loop = main_loop;
- _udata = udata;
- emscripten_set_main_loop(_em_loop, 0, 1);
- return 0;
-}
-
-#else
-
-int
-TZR_MainLoop(int (*main_loop)(void *udata), void *udata)
-{
- while (!TZR_ShouldQuit()) {
- TZR_CycleEvents();
- if (main_loop(udata))
- return 1;
- }
- return 0;
-}
-
-#endif
-/* sources/TZR_MouseDown.c */
-
-bool
-TZR_MouseDown(uint8_t button)
-{
- const TZR_KeyState state = TZR_MouseGetState(button);
- return (state == TZR_KEYSTATE_DOWN || state == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_MouseGetPosition.c */
-
-void
-TZR_MouseGetPosition(int *x, int *y)
-{
- if (x != NULL)
- *x = ___tzr_mouse_x;
- if (y != NULL)
- *y = ___tzr_mouse_y;
- TZR_ScreenTransform(x, y);
-}
-/* sources/TZR_MouseGetState.c */
-
-TZR_KeyState
-TZR_MouseGetState(uint8_t button)
-{
- return ___tzr_mousestates[button];
-}
-/* sources/TZR_MousePressed.c */
-
-bool
-TZR_MousePressed(uint8_t button)
-{
- return (TZR_MouseGetState(button) == TZR_KEYSTATE_PRESS);
-}
-/* sources/TZR_MouseReleased.c */
-
-bool
-TZR_MouseReleased(uint8_t button)
-{
- return (TZR_MouseGetState(button) == TZR_KEYSTATE_RELEASE);
-}
-/* sources/TZR_MouseUp.c */
-
-bool
-TZR_MouseUp(uint8_t button)
-{
- const TZR_KeyState state = TZR_MouseGetState(button);
- return (state == TZR_KEYSTATE_UP || state == TZR_KEYSTATE_RELEASE);
-}
-/* sources/TZR_PlayMusic.c */
-
-int
-TZR_PlayMusic(const char *path, int loop)
-{
- if (!___tzr_config.mixer) {
- fprintf(stderr, "mixer is disabled\n");
- return -1;
- }
- TZR_StopMusic();
- ___tzr_music = Mix_LoadMUS(path);
- if (___tzr_music == NULL)
- return sdl_error(-1);
- if (Mix_PlayMusic(___tzr_music, loop) < 0)
- return sdl_error(-1);
- return 0;
-}
-/* sources/TZR_PlaySound.c */
-
-int
-_TZR_PlaySound(const TZR_PlaySoundArgs *args)
-{
- if (args->id == 0) {
- SDL_Log("args->id is 0");
- return -1;
- }
-
- if (TZR_GetResourceType(args->id) != TZR_RES_SOUND) {
- SDL_Log("%u isn't a sound", args->id);
- return -1;
- }
-
- TZR_Sound *const sound = &TZR_GetResourcePointer(args->id)->sound;
-
-#ifdef TZR_SOLOUD
- const unsigned handle = Soloud_play(___tzr_soloud, sound->ptr);
- Soloud_setVolume(___tzr_soloud, handle, args->volume);
- Soloud_setLooping(___tzr_soloud, handle, args->loop);
-#else
- Mix_VolumeChunk(sound->ptr, args->volume * MIX_MAX_VOLUME);
- if (Mix_PlayChannel(-1, sound->ptr, args->loop) < 0)
- return sdl_error(-1);
-#endif
-
- return 0;
-}
-/* sources/TZR_PollEvent.c */
-
-int
-TZR_PollEvent(TZR_Event *e)
-{
- TZR_Event discard;
- if (e == NULL)
- e = &discard;
-
- SDL_Event se;
- while (SDL_PollEvent(&se)) switch (se.type) {
- case SDL_QUIT:
- e->type = TZR_EV_QUIT;
- ___tzr_should_quit = 1;
- return 1;
- case SDL_KEYDOWN:
- if (se.key.repeat)
- break;
- e->type = TZR_EV_KEYDOWN;
- e->button = se.key.keysym.scancode;
- ___tzr_keystates[e->button] = TZR_KEYSTATE_PRESS;
- return 1;
- case SDL_KEYUP:
- e->type = TZR_EV_KEYUP;
- e->button = se.key.keysym.scancode;
- ___tzr_keystates[e->button] = TZR_KEYSTATE_RELEASE;
- return 1;
- case SDL_MOUSEBUTTONDOWN:
- ___tzr_mouse_x = se.button.x;
- ___tzr_mouse_y = se.button.y;
- ___tzr_mousestates[se.button.button] = TZR_KEYSTATE_PRESS;
- break;
- case SDL_MOUSEBUTTONUP:
- ___tzr_mouse_x = se.button.x;
- ___tzr_mouse_y = se.button.y;
- ___tzr_mousestates[se.button.button] = TZR_KEYSTATE_RELEASE;
- break;
- case SDL_MOUSEMOTION:
- ___tzr_mouse_x = se.motion.x;
- ___tzr_mouse_y = se.motion.y;
- break;
- case SDL_JOYDEVICEADDED: {
- size_t i;
- for (i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr == NULL)
- break;
- }
- if (i == ___tzr_joysticks_size) {
- void *vec = ___tzr_joysticks;
- if (reserve(&vec,
- ___tzr_joysticks_size + 1,
- &___tzr_joysticks_capacity,
- sizeof(SDL_Joystick *)))
- {
- fprintf(stderr, "failed to reserve"
- "for new joystick\n");
- break;
- }
- ___tzr_joysticks = vec;
- ___tzr_joysticks_size += 1;
- i = ___tzr_joysticks_size - 1;
- }
-
- SDL_GameController *jstick = SDL_GameControllerOpen(se.jdevice.which);
- if (jstick == NULL) {
- sdl_error(0);
- break;
- }
- memset(&___tzr_joysticks[i], 0, sizeof(___tzr_joysticks[i]));
- ___tzr_joysticks[i].ptr = jstick;
- fprintf(stderr, "opened joystick\n");
- break;
- }
- case SDL_JOYDEVICEREMOVED:
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- SDL_Joystick *const jstick =
- SDL_GameControllerGetJoystick(___tzr_joysticks[i].ptr);
- if (se.jdevice.which == SDL_JoystickInstanceID(jstick)) {
- SDL_GameControllerClose(___tzr_joysticks[i].ptr);
- ___tzr_joysticks[i].ptr = NULL;
- break;
- }
- }
- fprintf(stderr, "didn't remove no joystick\n");
- break;
- default:
- break;
- }
- return 0;
-}
-/* sources/TZR_Quit.c */
-
-void
-TZR_Quit(void)
-{
- for (size_t i = 0; i < ___tzr_resources_size; i++)
- TZR_DestroyResource(&___tzr_resources[i], 1);
- if (___tzr_resources != NULL)
- free(___tzr_resources);
- ___tzr_resources = NULL;
- ___tzr_resources_size = 0;
- ___tzr_resources_capacity = 0;
- for (size_t i = 0; i < ___tzr_joysticks_size; i++) {
- if (___tzr_joysticks[i].ptr != NULL)
- SDL_GameControllerClose(___tzr_joysticks[i].ptr);
- }
- if (___tzr_joysticks != NULL)
- free(___tzr_joysticks);
- ___tzr_joysticks = NULL;
- ___tzr_joysticks_size = 0;
- ___tzr_joysticks_capacity = 0;
- if (___tzr_target != NULL) {
- SDL_DestroyTexture(___tzr_target);
- ___tzr_target = NULL;
- }
- if (___tzr_renderer != NULL) {
- SDL_DestroyRenderer(___tzr_renderer);
- ___tzr_renderer = NULL;
- }
- if (___tzr_window != NULL) {
- SDL_DestroyWindow(___tzr_window);
- ___tzr_window = NULL;
- }
- if (___tzr_config.mixer) {
-#ifdef TZR_SOLOUD
- Soloud_deinit(___tzr_soloud);
- Soloud_destroy(___tzr_soloud);
- ___tzr_soloud = NULL;
-#endif
- Mix_CloseAudio();
- Mix_Quit();
- }
- SDL_Quit();
-}
-/* sources/TZR_ReloadResource.c */
-
-int
-TZR_ReloadResource(TZR_Uint id)
-{
- TZR_Resource *const res = TZR_GetResourcePointer(id);
- if (res->path == NULL) {
- fprintf(stderr, "resource path of %u is NULL\n", id);
- return -1;
- }
- FILE *const fp = fopen(res->path, "rb");
- if (fp == NULL) {
- perror(res->path);
- return -1;
- }
- size_t size;
- char *const data = drain(fp, &size);
- fclose(fp);
- if (data == NULL)
- return -1;
- TZR_Resource new_res;
- memcpy(&new_res, res, sizeof(TZR_Resource));
- const int load_rv = TZR_DirectResourceLoad(&new_res, data, size);
- free(data);
- if (load_rv)
- return -1;
- TZR_DestroyResource(res, 0);
- memcpy(res, &new_res, sizeof(TZR_Resource));
- return 0;
-}
-/* sources/TZR_ResourcesWatch.c */
-
-void
-TZR_ResourcesWatch(void)
-{
- for (TZR_Uint i = 0; i < ___tzr_resources_size; i++) {
- TZR_Resource *const res = TZR_GetResourcePointer(i + 1);
- if (res->path == NULL)
- continue;
- struct stat st = {0};
- (void)stat(res->path, &st);
- if (st.st_mtime != res->mtime) {
- if (res->mtime != 0)
- TZR_ReloadResource(i + 1);
- res->mtime = st.st_mtime;
- }
- }
-}
-/* sources/TZR_ScreenTransform.c */
-
-void
-TZR_ScreenTransform(int *x, int *y)
-{
- if (___tzr_scale == 0.0)
- return;
- if (x != NULL) {
- *x -= ___tzr_off_x;
- *x /= ___tzr_scale;
- }
- if (y != NULL) {
- *y -= ___tzr_off_y;
- *y /= ___tzr_scale;
- }
-}
-/* sources/TZR_ShouldQuit.c */
-
-int
-TZR_ShouldQuit(void)
-{
- return ___tzr_should_quit;
-}
-/* sources/TZR_StopMusic.c */
-
-void
-TZR_StopMusic(void)
-{
- if (!___tzr_config.mixer)
- return;
- if (Mix_PlayingMusic())
- Mix_HaltMusic();
- if (___tzr_music != NULL)
- Mix_FreeMusic(___tzr_music);
- ___tzr_music = NULL;
-}
-/* sources/TZR_ToggleFullscreen.c */
-
-void
-TZR_ToggleFullscreen(void)
-{
- static bool fullscreen = false;
- fullscreen = !fullscreen;
- SDL_SetWindowFullscreen(___tzr_window, fullscreen
- ? SDL_WINDOW_FULLSCREEN_DESKTOP
- : 0);
-}
-
-/*
-** Copyright (c) 2023 kdx
-**
-** Permission is hereby granted, free of charge, to any person obtaining a copy
-** of this software and associated documentation files (the "Software"), to
-** deal in the Software without restriction, including without limitation the
-** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-** sell copies of the Software, and to permit persons to whom the Software is
-** furnished to do so, subject to the following conditions:
-**
-** The above copyright notice and this permission notice shall be included in
-** all copies or substantial portions of the Software.
-**
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-** IN THE SOFTWARE.
-*/
-/* commit hash: 7bac5474e14d7e95fbc6be096e14a9b37f363749 */
diff --git a/TZR.h b/TZR.h
deleted file mode 100644
index 81c1edf..0000000
--- a/TZR.h
+++ /dev/null
@@ -1,476 +0,0 @@
-/* Licensing information can be found at the end of the file. */
-#pragma once
-#ifdef __EMSCRIPTEN__
-#include <emscripten.h>
-#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef TZR_SOLOUD
-#include "soloud_c.h"
-#endif
-#include <limits.h>
-#include <SDL2/SDL_gamecontroller.h>
-#include <SDL2/SDL_main.h>
-#include <SDL2/SDL_mixer.h>
-#include <SDL2/SDL_mouse.h>
-#include <SDL2/SDL_render.h>
-#include <SDL2/SDL_scancode.h>
-#include <stdbool.h>
-#include <stddef.h>
-
-/* headers/TZR_types.h */
-
-enum TZR_ResourceType {
- TZR_RES_RAW,
- TZR_RES_IMAGE,
- TZR_RES_SOUND,
- ___TZR_RES_COUNT
-};
-
-enum TZR_EventType {
- TZR_EV_QUIT,
- TZR_EV_KEYDOWN,
- TZR_EV_KEYUP
-};
-
-enum TZR_KeyState {
- TZR_KEYSTATE_UP,
- TZR_KEYSTATE_DOWN,
- TZR_KEYSTATE_RELEASE,
- TZR_KEYSTATE_PRESS
-};
-
-enum TZR_MixerFlags {
- TZR_MIXER_OFF,
- TZR_MIXER_ON,
- TZR_MIXER_FLAC
-};
-
-typedef unsigned int TZR_Uint;
-typedef struct TZR_Config TZR_Config;
-typedef struct TZR_Point TZR_Point;
-typedef struct TZR_Color TZR_Color;
-typedef struct TZR_Rect TZR_Rect;
-typedef enum TZR_ResourceType TZR_ResourceType;
-typedef struct TZR_Raw TZR_Raw;
-typedef struct TZR_Image TZR_Image;
-typedef struct TZR_Sound TZR_Sound;
-typedef struct TZR_Resource TZR_Resource;
-typedef enum TZR_EventType TZR_EventType;
-typedef struct TZR_Event TZR_Event;
-typedef struct TZR_Music TZR_Music;
-typedef struct TZR_DrawImageArgs TZR_DrawImageArgs;
-typedef struct TZR_DrawRectangleArgs TZR_DrawRectangleArgs;
-typedef struct TZR_PlaySoundArgs TZR_PlaySoundArgs;
-typedef enum TZR_KeyState TZR_KeyState;
-typedef struct TZR_Joystick TZR_Joystick;
-
-struct TZR_Config {
- int _;
- int width;
- int height;
- float scale;
- int target_fps;
- bool pixel_perfect;
- bool hd_render;
- bool scale_linear;
- bool show_cursor;
- unsigned int mixer;
- const char *basepath;
- const char *title;
-};
-
-struct TZR_Point {
- int x;
- int y;
-};
-
-struct TZR_Color {
- int _;
- float r;
- float g;
- float b;
- float a;
-};
-
-struct TZR_Rect {
- TZR_Point from;
- TZR_Point to;
-};
-
-struct TZR_Raw {
- void *data;
- size_t size;
-};
-
-struct TZR_Image {
- int width;
- int height;
- SDL_Texture *ptr;
-};
-
-#ifdef TZR_SOLOUD
-struct TZR_Sound {
- Wav *ptr;
-};
-#else
-struct TZR_Sound {
- Mix_Chunk *ptr;
-};
-#endif
-
-struct TZR_Resource {
- TZR_ResourceType type;
- char *path; /* allocated and freed by TZR; can be NULL */
- long mtime;
- union {
- TZR_Raw raw; /* raw file data */
- TZR_Image image;
- TZR_Sound sound;
- };
-};
-
-struct TZR_Event {
- TZR_EventType type;
- int button;
-};
-
-struct TZR_DrawImageArgs {
- int _;
- TZR_Uint id;
- int x;
- int y;
- int ix;
- int iy;
- int w;
- int h;
- float r;
- float sx;
- float sy;
- bool center;
- bool flip_x;
- bool flip_y;
-};
-
-struct TZR_DrawRectangleArgs {
- int _;
- int x;
- int y;
- int w;
- int h;
- bool fill;
- bool center;
-};
-
-struct TZR_PlaySoundArgs {
- int _;
- TZR_Uint id;
- int loop;
- float volume;
-};
-
-struct TZR_Joystick
-{
- SDL_GameController *ptr;
- float leftx;
- float lefty;
- float rightx;
- float righty;
-};
-/* headers/TZR_globals.h */
-
-extern TZR_Config ___tzr_config;
-extern TZR_Color ___tzr_color;
-extern TZR_Resource *___tzr_resources;
-extern size_t ___tzr_resources_capacity;
-extern size_t ___tzr_resources_size;
-extern SDL_Window *___tzr_window;
-extern SDL_Renderer *___tzr_renderer;
-extern SDL_Texture *___tzr_target;
-extern unsigned long ___tzr_tick;
-extern unsigned long ___tzr_next_time;
-extern unsigned long ___tzr_min_dt;
-extern int ___tzr_should_quit;
-extern int ___tzr_mouse_x;
-extern int ___tzr_mouse_y;
-extern TZR_KeyState ___tzr_keystates[SDL_NUM_SCANCODES];
-extern TZR_KeyState ___tzr_mousestates[256];
-extern TZR_KeyState ___tzr_joystates[SDL_CONTROLLER_BUTTON_MAX];
-extern float ___tzr_scale;
-extern int ___tzr_off_x;
-extern int ___tzr_off_y;
-extern Mix_Music *___tzr_music;
-extern TZR_Joystick *___tzr_joysticks;
-extern size_t ___tzr_joysticks_capacity;
-extern size_t ___tzr_joysticks_size;
-extern SDL_BlendMode ___tzr_blendmode;
-
-#ifdef TZR_SOLOUD
-extern Soloud ___tzr_soloud;
-#endif
-/* headers/TZR_resource.h */
-
-#define TZR_RES TZR_LoadResource
-
-/* Return 0 on error. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-TZR_Uint TZR_LoadResourceFromMemory(TZR_ResourceType type, const void *data, int size);
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-TZR_Uint TZR_LoadResourceTyped(TZR_ResourceType type, const char *path);
-
-/* Return 0 on error; try to autodetect resource type from file extension. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-TZR_Uint TZR_LoadResource(const char *path);
-
-/* Doesn't handle invalid ID. Pointer might get invalidated by resource
- * creation calls, use with caution. */
-TZR_Resource *TZR_GetResourcePointer(TZR_Uint id);
-
-/* Doesn't handle invalid ID. Pointer might get invalidated by resource
- * creation calls, use with caution. */
-TZR_Raw *TZR_GetRawResource(TZR_Uint id);
-
-/* Doesn't handle invalid ID. */
-TZR_ResourceType TZR_GetResourceType(TZR_Uint id);
-
-/* Doesn't handle invalid ID. */
-const char *TZR_GetResourcePath(TZR_Uint id);
-
-/* Doesn't handle invalid ID. */
-int TZR_GetImageWidth(TZR_Uint id);
-
-/* Doesn't handle invalid ID. */
-int TZR_GetImageHeight(TZR_Uint id);
-
-/* Reload ressource. Returns -1 on error and doesn't apply changes. */
-int TZR_ReloadResource(TZR_Uint id);
-
-/* Watch for changes on managed resources and hotreload if appropriate. */
-void TZR_ResourcesWatch(void);
-
-/* Used internaly. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-int TZR_DirectResourceLoad(TZR_Resource *res, const void *data, int size);
-void TZR_DestroyResource(TZR_Resource *res, int free_path);
-/* headers/TZR_sound.h */
-
-#define TZR_PlaySound(...) ({ const TZR_PlaySoundArgs ____arg = { \
- .id=0, .loop=0, .volume=1.0f, ._=0, __VA_ARGS__ }; \
- _TZR_PlaySound(&____arg); })
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int _TZR_PlaySound(const TZR_PlaySoundArgs *args);
-
-/* Return -1 on error. */
-int TZR_PlayMusic(const char *path, int loop);
-
-void TZR_StopMusic(void);
-/* headers/TZR_events.h */
-
-/* Write event data to `e`. Return 0 when event queue is empty. */
-int TZR_PollEvent(TZR_Event *e);
-
-/* Drain queued events with TZR_PollEvent and call TZR_ResourcesWatch. */
-void TZR_CycleEvents(void);
-/* headers/TZR_render.h */
-
-/* All draw calls should happen between TZR_DrawBegin and TZR_DrawEnd.
- * Return -1 on error. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-int TZR_DrawBegin(void);
-
-/* Return -1 on error. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-int TZR_DrawEnd(void);
-
-/* Return -1 on error. */
-#define TZR_DrawSetColor(...) ({ const TZR_Color ____arg = { \
- .r=-1.0f, .g=-1.0f, .b=-1.0f, .a=-1.0f, ._=0, __VA_ARGS__ }; \
- _TZR_DrawSetColor(&____arg); })
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int _TZR_DrawSetColor(const TZR_Color *color);
-
-/* Return -1 on error. */
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int TZR_DrawSetColor8(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
-
-/* Return -1 on error. */
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int TZR_DrawClear(void);
-
-/* Return -1 on error. Draw point on `x`;`y` in the framebuffer. */
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int TZR_DrawPoint(int x, int y);
-
-/* Return -1 on error. Draw line between `x0`;`y0` and `x1`;`y1` in the
- * framebuffer. */
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int TZR_DrawLine(int x0, int y0, int x1, int y1);
-
-/* Return -1 on error. Draw rectangle at `x`;`y` position of size `w`x`h` in the
- * framebuffer. */
-#define TZR_DrawRectangle(...) ({ const TZR_DrawRectangleArgs ____arg = { \
- .x=0, .y=0, .w=0, .h=0, .fill=false, .center=false, ._=0, __VA_ARGS__ }; \
- _TZR_DrawRectangle(&____arg); })
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int _TZR_DrawRectangle(const TZR_DrawRectangleArgs *args);
-
-/* Return -1 on error. Draw texture ressource `id` at `x`;`y` position of
- * the framebuffer. */
-#define TZR_DrawImage(...) ({ const TZR_DrawImageArgs ____arg = { \
- .x=0, .y=0, .ix=0, .iy=0, .w=INT_MIN, .h=INT_MIN, .r=0.0f, .sx=1.0f, \
- .sy=1.0f, .center=false, .flip_x=false, .flip_y=false, ._=0, \
- __VA_ARGS__ }; \
- _TZR_DrawImage(&____arg); })
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int _TZR_DrawImage(const TZR_DrawImageArgs *args);
-
-void TZR_ScreenTransform(int *x, int *y);
-
-#ifdef TZR_PARANOID
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-#endif
-int TZR_BlendMode(SDL_BlendMode mode);
-/* headers/TZR_keystate.h */
-
-TZR_KeyState TZR_GetKeyState(int scancode);
-bool TZR_IsKeyDown(int scancode);
-bool TZR_IsKeyUp(int scancode);
-bool TZR_IsKeyReleased(int scancode);
-bool TZR_IsKeyPressed(int scancode);
-/* headers/TZR_mouse.h */
-
-/* `x` and `y` are out values and nullable. */
-void TZR_MouseGetPosition(int *x, int *y);
-
-TZR_KeyState TZR_MouseGetState(uint8_t button);
-bool TZR_MouseDown(uint8_t button);
-bool TZR_MouseUp(uint8_t button);
-bool TZR_MouseReleased(uint8_t button);
-bool TZR_MousePressed(uint8_t button);
-/* headers/TZR_joystick.h */
-
-TZR_KeyState TZR_JoystickGetState(uint8_t button);
-bool TZR_JoystickDown(uint8_t button);
-bool TZR_JoystickUp(uint8_t button);
-bool TZR_JoystickReleased(uint8_t button);
-bool TZR_JoystickPressed(uint8_t button);
-float TZR_JoystickLeftX(void);
-float TZR_JoystickLeftY(void);
-float TZR_JoystickRightX(void);
-float TZR_JoystickRightY(void);
-/* headers/TZR.h */
-
-/* TZR manages all loaded resources internally and tries to avoid duplicate.
- * A resource can be loaded multiple times if asked, identification doesn't rely
- * on filepath. In doubt, use TZR_LoadResource ONCE per asset and store the ID.
- * Resources are exposed as ID instead of pointer, as a future proof measure in
- * case TZR needs to rearrange memory at runtime in the future. */
-
-#define TZR_Init(...) ({ const TZR_Config ____arg = { \
- .width=256, \
- .height=224, \
- .scale=1.0f, \
- .target_fps=60, \
- .pixel_perfect=true, \
- .hd_render=false, \
- .scale_linear=false, \
- .show_cursor=false, \
- .mixer=TZR_MIXER_ON, \
- .basepath=NULL, \
- .title="TZR", \
- ._=0, __VA_ARGS__ }; \
- _TZR_Init(&____arg); })
-
-/* Should be called only once before usage of any other function unless
- * otherwise specified. On error this calls TZR_Quit and returns -1.
- * `config` will be duplicated internally and can be safely discarded. */
-#if __STDC_VERSION__ > 201710L
-[[nodiscard]]
-#endif
-int _TZR_Init(const TZR_Config *config);
-
-/* Destroy and free everything created by TZR. */
-void TZR_Quit(void);
-
-/* Return non-zero value when a quit event has been received. */
-int TZR_ShouldQuit(void);
-
-int TZR_MainLoop(int (*main_loop)(void *udata), void *udata);
-
-unsigned long TZR_GetTick(void);
-
-void TZR_ToggleFullscreen(void);
-
-#ifdef __cplusplus
-}
-#endif
-/*
-** Copyright (c) 2023 kdx
-**
-** Permission is hereby granted, free of charge, to any person obtaining a copy
-** of this software and associated documentation files (the "Software"), to
-** deal in the Software without restriction, including without limitation the
-** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-** sell copies of the Software, and to permit persons to whom the Software is
-** furnished to do so, subject to the following conditions:
-**
-** The above copyright notice and this permission notice shall be included in
-** all copies or substantial portions of the Software.
-**
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-** IN THE SOFTWARE.
-*/
-/* commit hash: 7bac5474e14d7e95fbc6be096e14a9b37f363749 */
diff --git a/_.h b/_.h
new file mode 100644
index 0000000..4a82eb8
--- /dev/null
+++ b/_.h
@@ -0,0 +1,11 @@
+#pragma once
+#include <stdio.h>
+#include <stdlib.h>
+
+#define defer(x) do { if (atexit(X)) { X(); panic("defer"); } } while (0);
+#define auto __auto_type
+#define foreach(E, L) for (auto E = (L); E != NULL; E = E->next)
+#define forloop(I, F, T) for (auto I = (F); I < (T); I++)
+#define with(I, T) auto I = (T); if (I)
+#define plog(...) printf("\x1b[94mLOG %s:%s:%d\x1b[0m \t", __FILE_NAME__, __FUNCTION__, __LINE__), printf(__VA_ARGS__), putchar('\n')
+#define panic(...) plog("\x1b[31m"__VA_ARGS__), printf("\x1b[0m"), exit(EXIT_FAILURE)
diff --git a/build.sh b/build.sh
index 2eab4df..6650119 100755
--- a/build.sh
+++ b/build.sh
@@ -1,5 +1,6 @@
#!/bin/sh
gcc -std=c99 -Wall -Wextra \
-Wno-override-init -Wno-unused-parameter \
+ -include_.h \
*.c \
-lSDL2 -lSDL2_mixer
diff --git a/compile_flags.txt b/compile_flags.txt
index e06b34d..d6c6b1e 100644
--- a/compile_flags.txt
+++ b/compile_flags.txt
@@ -4,3 +4,4 @@
-Wno-unused-parameter
-std=c99
-Iheaders
+-include_.h
diff --git a/main.c b/main.c
index 8a9bbed..7c8bfdc 100644
--- a/main.c
+++ b/main.c
@@ -1,41 +1,6 @@
-#include "TZR.h"
-
-static void colorismerelyaconcept(void);
-static int main_loop(void *udata);
-
int
main(int argc, char **argv)
{
- if (argc != 3) {
- fprintf(stderr, "usage: %s width height\n", argv[0]);
- return 1;
- }
-
- const int w = atoi(argv[1]);
- const int h = atoi(argv[2]);
- if (TZR_Init(.width=w, .height=h))
- return 1;
- if (atexit(TZR_Quit)) {
- TZR_Quit();
- return 1;
- }
-
- TZR_MainLoop(main_loop, NULL);
- return 0;
-}
-
-static void
-colorismerelyaconcept(void)
-{
- TZR_DrawSetColor(rand() % 2, rand() % 2, rand() % 2);
-}
-
-static int
-main_loop(void *udata)
-{
- TZR_DrawBegin();
- colorismerelyaconcept();
- TZR_DrawClear();
- TZR_DrawEnd();
+ panic("skill issue");
return 0;
}