summaryrefslogtreecommitdiff
path: root/src/TZR.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/TZR.c')
-rw-r--r--src/TZR.c155
1 files changed, 89 insertions, 66 deletions
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 */