From fb217b8b3f75486ad72e76e2daa8c40ecef75f93 Mon Sep 17 00:00:00 2001 From: kdx Date: Thu, 18 May 2023 08:48:19 +0200 Subject: update tzr --- Tupfile | 2 +- src/TZR.c | 155 ++++++++++++++++++++++++++++++++++++-------------------------- src/TZR.h | 22 ++------- 3 files changed, 95 insertions(+), 84 deletions(-) diff --git a/Tupfile b/Tupfile index b79ebff..357f2ba 100644 --- a/Tupfile +++ b/Tupfile @@ -1,7 +1,7 @@ CC = zig cc LD = $(CC) -fuse-ld=mold CFLAGS = -std=c99 -Wall -Wextra -Wno-override-init -LDFLAGS = -lm -lSDL2 -lSDL2_image -lSDL2_mixer +LDFLAGS = -lm -lSDL2 -lSDL2_mixer # codebase #: map/*.tmj |> tiled2c %f embed_%B_tmj >%o |> build/embed_%B_tmj.c diff --git a/src/TZR.c b/src/TZR.c index 386e765..dd3c56c 100644 --- a/src/TZR.c +++ b/src/TZR.c @@ -1,9 +1,14 @@ /* 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 #include #include #include #include -#include #include #include #include @@ -69,7 +74,6 @@ size_t ___tzr_resources_size = 0; SDL_Window *___tzr_window = NULL; SDL_Renderer *___tzr_renderer = NULL; SDL_Texture *___tzr_target = NULL; -SDL_Texture *___tzr_target_light = NULL; unsigned long ___tzr_tick = 0; unsigned long ___tzr_next_time = 0; unsigned long ___tzr_min_dt = 0; @@ -141,6 +145,52 @@ TZR_DestroyResource(TZR_Resource *res, int free_path) /* 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) { @@ -155,18 +205,18 @@ TZR_DirectResourceLoad(TZR_Resource *res, const void *data, int size) 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 *surf = IMG_Load_RW(rw, 1); - if (surf == NULL) { - SDL_RWops *const rw = SDL_RWFromConstMem(data, size); - if (rw == NULL) - return sdl_error(-1); - surf = SDL_LoadBMP_RW(rw, 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); @@ -208,6 +258,8 @@ TZR_DirectResourceLoad(TZR_Resource *res, const void *data, int size) int TZR_DrawBegin(void) { + if (___tzr_config.hd_render) + return 0; if (SDL_SetRenderTarget(___tzr_renderer, ___tzr_target) < 0) return sdl_error(-1); if (SDL_SetRenderDrawBlendMode(___tzr_renderer, SDL_BLENDMODE_BLEND)) @@ -225,8 +277,8 @@ TZR_DrawClear(void) } /* sources/TZR_DrawEnd.c */ -int -TZR_DrawEnd(void) +static int +pixel_draw_end(void) { if (SDL_SetRenderTarget(___tzr_renderer, NULL) < 0) return sdl_error(-1); @@ -256,14 +308,15 @@ TZR_DrawEnd(void) if (SDL_RenderCopy(___tzr_renderer, ___tzr_target, NULL, &dest) < 0) return sdl_error(-1); - if (___tzr_config.light_system) { - if (SDL_SetTextureBlendMode(___tzr_target_light, - SDL_BLENDMODE_MOD) < 0) - return sdl_error(-1); - if (SDL_RenderCopy(___tzr_renderer, ___tzr_target_light, 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; @@ -500,8 +553,6 @@ _TZR_Init(const TZR_Config *config) if (SDL_Init(SDL_INIT_VIDEO) < 0) return _sdl_error(); - if (IMG_Init(IMG_INIT_PNG * ___tzr_config.png_loading) < 0) - return _sdl_error(); if (___tzr_config.mixer == TZR_MIXER_FLAC && Mix_Init(MIX_INIT_FLAC) != MIX_INIT_FLAC) { @@ -518,7 +569,7 @@ _TZR_Init(const TZR_Config *config) return perror("TZR_Init"), -1; ___tzr_window = - SDL_CreateWindow("TZR", + SDL_CreateWindow(config->title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ___tzr_config.width * ___tzr_config.scale, @@ -537,25 +588,23 @@ _TZR_Init(const TZR_Config *config) if (___tzr_renderer == NULL) return _sdl_error(); - ___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(); - - if (___tzr_config.light_system) { - ___tzr_target_light = SDL_CreateTexture(___tzr_renderer, - SDL_PIXELFORMAT_RGB888, - SDL_TEXTUREACCESS_TARGET, - ___tzr_config.width, - ___tzr_config.height); - if (___tzr_target_light == NULL) + 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, 0); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, + ___tzr_config.scale_linear ? "1" : "0"); ___tzr_tick = 0; if (___tzr_config.target_fps > 0) { @@ -610,28 +659,6 @@ TZR_IsKeyUp(int scancode) const TZR_KeyState state = TZR_GetKeyState(scancode); return (state == TZR_KEYSTATE_UP || state == TZR_KEYSTATE_RELEASE); } -/* sources/TZR_LightBegin.c */ - -int -TZR_LightBegin(void) -{ - if (!___tzr_config.light_system) { - fprintf(stderr, "light system disabled\n"); - return -1; - } - if (SDL_SetRenderDrawBlendMode(___tzr_renderer, SDL_BLENDMODE_ADD) < 0) - return sdl_error(-1); - if (SDL_SetRenderTarget(___tzr_renderer, ___tzr_target_light) < 0) - return sdl_error(-1); - return 0; -} -/* sources/TZR_LightEnd.c */ - -int -TZR_LightEnd(void) -{ - return ___tzr_config.light_system ? 0 : -1; -} /* sources/TZR_LoadResource.c */ static TZR_ResourceType @@ -642,6 +669,7 @@ deduce_type(const char *path) 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) @@ -860,10 +888,6 @@ TZR_Quit(void) ___tzr_resources = NULL; ___tzr_resources_size = 0; ___tzr_resources_capacity = 0; - if (___tzr_target_light != NULL) { - SDL_DestroyTexture(___tzr_target_light); - ___tzr_target_light = NULL; - } if (___tzr_target != NULL) { SDL_DestroyTexture(___tzr_target); ___tzr_target = NULL; @@ -880,7 +904,6 @@ TZR_Quit(void) Mix_CloseAudio(); Mix_Quit(); } - IMG_Quit(); SDL_Quit(); } /* sources/TZR_ReloadResource.c */ @@ -989,4 +1012,4 @@ TZR_StopMusic(void) ** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ** IN THE SOFTWARE. */ -/* commit hash: a4112e4311eb226c4f43cb697aa7f6c34bd7b9a5 */ +/* commit hash: e23ea946042ebc30965fd9a162e3871aab18b35e */ diff --git a/src/TZR.h b/src/TZR.h index 9fcf126..a2217fc 100644 --- a/src/TZR.h +++ b/src/TZR.h @@ -64,10 +64,10 @@ struct TZR_Config { int scale; int target_fps; bool pixel_perfect; + bool hd_render; + bool scale_linear; bool show_cursor; unsigned int mixer; - bool png_loading; - bool light_system; const char *title; }; @@ -163,7 +163,6 @@ extern size_t ___tzr_resources_size; extern SDL_Window *___tzr_window; extern SDL_Renderer *___tzr_renderer; extern SDL_Texture *___tzr_target; -extern SDL_Texture *___tzr_target_light; extern unsigned long ___tzr_tick; extern unsigned long ___tzr_next_time; extern unsigned long ___tzr_min_dt; @@ -336,17 +335,6 @@ int _TZR_DrawRectangle(const TZR_DrawRectangleArgs *args); int _TZR_DrawImage(const TZR_DrawImageArgs *args); void TZR_ScreenTransform(int *x, int *y); -/* headers/TZR_light.h */ - -#if __STDC_VERSION__ > 201710L -[[nodiscard]] -#endif -int TZR_LightBegin(void); - -#if __STDC_VERSION__ > 201710L -[[nodiscard]] -#endif -int TZR_LightEnd(void); /* headers/TZR_keystate.h */ TZR_KeyState TZR_GetKeyState(int scancode); @@ -368,10 +356,10 @@ bool TZR_IsKeyPressed(int scancode); .scale=2, \ .target_fps=60, \ .pixel_perfect=true, \ + .hd_render=false, \ + .scale_linear=false, \ .show_cursor=false, \ .mixer=TZR_MIXER_ON, \ - .png_loading=true, \ - .light_system=false, \ .title="TZR", \ ._=0, __VA_ARGS__ }) @@ -414,4 +402,4 @@ unsigned long TZR_GetTick(void); ** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ** IN THE SOFTWARE. */ -/* commit hash: a4112e4311eb226c4f43cb697aa7f6c34bd7b9a5 */ +/* commit hash: e23ea946042ebc30965fd9a162e3871aab18b35e */ -- cgit v1.2.3