diff options
Diffstat (limited to 'src/TZR.c')
-rw-r--r-- | src/TZR.c | 155 |
1 files changed, 89 insertions, 66 deletions
@@ -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 */ |