summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-05-18 08:48:19 +0200
committerkdx <kikoodx@paranoici.org>2023-05-18 08:48:42 +0200
commitfb217b8b3f75486ad72e76e2daa8c40ecef75f93 (patch)
treeee19602d541a7db8a0111008bf08bb59c515299b
parent984c4f74d55cb1ce19916f22499055f0d577e6e6 (diff)
downloadpx-fb217b8b3f75486ad72e76e2daa8c40ecef75f93.tar.gz
update tzr
-rw-r--r--Tupfile2
-rw-r--r--src/TZR.c155
-rw-r--r--src/TZR.h22
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 <math.h>
#include <SDL2/SDL_error.h>
#include <SDL2/SDL_events.h>
#include <SDL2/SDL.h>
-#include <SDL2/SDL_image.h>
#include <SDL2/SDL_log.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_mouse.h>
@@ -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 */