diff options
author | Tuomas Virtanen <katajakasa@gmail.com> | 2018-06-23 23:24:02 +0300 |
---|---|---|
committer | Tuomas Virtanen <katajakasa@gmail.com> | 2018-06-23 23:24:02 +0300 |
commit | 33311c1fae634f1c1530d019aebecc08edebdb5d (patch) | |
tree | 7fd265afa100a311a6306d0fe54cce7449adb303 /examples | |
parent | dd449f2c7d32d5c7d909fabed5875e195784e794 (diff) |
Properly scale window contents in examples
Diffstat (limited to 'examples')
-rw-r--r-- | examples/example_cust_video.c | 25 | ||||
-rw-r--r-- | examples/example_video.c | 30 |
2 files changed, 32 insertions, 23 deletions
diff --git a/examples/example_cust_video.c b/examples/example_cust_video.c index c764989..09f8e23 100644 --- a/examples/example_cust_video.c +++ b/examples/example_cust_video.c @@ -61,6 +61,14 @@ int64_t seek_callback(void *userdata, int64_t offset, int whence) { return ftell(fd); } +void find_viewport_size(int sw, int sh, int vw, int vh, int *rw, int *rh) { + float r_x = (float)sw / (float)vw; + float r_y = (float)sh / (float)vh; + float r_t = r_x < r_y ? r_x : r_y; + *rw = vw * r_t; + *rh = vh * r_t; +} + int main(int argc, char *argv[]) { int err = 0, ret = 0; const char* filename = NULL; @@ -243,9 +251,10 @@ int main(int argc, char *argv[]) { int size_h = 0; int screen_w = 0; int screen_h = 0; - SDL_RenderGetLogicalSize(renderer, &size_w, &size_h); SDL_GetWindowSize(window, &screen_w, &screen_h); - bool gui_enabled = false; + find_viewport_size(screen_w, screen_h, pinfo.video.width, pinfo.video.height, &size_w, &size_h); + SDL_RenderSetLogicalSize(renderer, size_w, size_h); + Kit_SetPlayerScreenSize(player, size_w, size_h); bool fullscreen = false; while(run) { if(Kit_GetPlayerState(player) == KIT_STOPPED) { @@ -285,7 +294,9 @@ int main(int argc, char *argv[]) { switch(event.window.event) { case SDL_WINDOWEVENT_SIZE_CHANGED: SDL_GetWindowSize(window, &screen_w, &screen_h); - Kit_SetPlayerScreenSize(player, screen_w, screen_h); + find_viewport_size(screen_w, screen_h, pinfo.video.width, pinfo.video.height, &size_w, &size_h); + SDL_RenderSetLogicalSize(renderer, size_w, size_h); + Kit_SetPlayerScreenSize(player, size_w, size_h); break; } break; @@ -315,10 +326,6 @@ int main(int argc, char *argv[]) { } } - // Enable GUI if mouse is hovering over the bottom third of the screen - int limit = (pinfo.video.height / 3) * 2; - gui_enabled = (mouse_y >= limit); - // Refresh audio int queued = SDL_GetQueuedAudioSize(audio_dev); if(queued < AUDIOBUFFER_SIZE) { @@ -361,8 +368,8 @@ int main(int argc, char *argv[]) { } SDL_RenderSetLogicalSize(renderer, pinfo.video.width, pinfo.video.height); - // Render GUI - if(gui_enabled) { + // Enable GUI if mouse is hovering over the bottom third of the screen + if(mouse_y >= ((size_h / 3) * 2)) { double percent = Kit_GetPlayerPosition(player) / Kit_GetPlayerDuration(player); render_gui(renderer, percent); } diff --git a/examples/example_video.c b/examples/example_video.c index 03d13f2..1487173 100644 --- a/examples/example_video.c +++ b/examples/example_video.c @@ -45,6 +45,14 @@ void render_gui(SDL_Renderer *renderer, double percent) { SDL_RenderFillRect(renderer, &progress_top); } +void find_viewport_size(int sw, int sh, int vw, int vh, int *rw, int *rh) { + float r_x = (float)sw / (float)vw; + float r_y = (float)sh / (float)vh; + float r_t = r_x < r_y ? r_x : r_y; + *rw = vw * r_t; + *rh = vh * r_t; +} + int main(int argc, char *argv[]) { int err = 0, ret = 0; const char* filename = NULL; @@ -207,9 +215,6 @@ int main(int argc, char *argv[]) { // Make sure subtitle texture is in correct blendmode SDL_SetTextureBlendMode(subtitle_tex, SDL_BLENDMODE_BLEND); - // Set logical size for the renderer. This way when we scale, we keep aspect ratio. - SDL_RenderSetLogicalSize(renderer, pinfo.video.width, pinfo.video.height); - // Start playback Kit_PlayerPlay(player); @@ -220,9 +225,10 @@ int main(int argc, char *argv[]) { int size_h = 0; int screen_w = 0; int screen_h = 0; - SDL_RenderGetLogicalSize(renderer, &size_w, &size_h); SDL_GetWindowSize(window, &screen_w, &screen_h); - bool gui_enabled = false; + find_viewport_size(screen_w, screen_h, pinfo.video.width, pinfo.video.height, &size_w, &size_h); + SDL_RenderSetLogicalSize(renderer, size_w, size_h); + Kit_SetPlayerScreenSize(player, size_w, size_h); bool fullscreen = false; while(run) { if(Kit_GetPlayerState(player) == KIT_STOPPED) { @@ -262,7 +268,9 @@ int main(int argc, char *argv[]) { switch(event.window.event) { case SDL_WINDOWEVENT_SIZE_CHANGED: SDL_GetWindowSize(window, &screen_w, &screen_h); - Kit_SetPlayerScreenSize(player, screen_w, screen_h); + find_viewport_size(screen_w, screen_h, pinfo.video.width, pinfo.video.height, &size_w, &size_h); + SDL_RenderSetLogicalSize(renderer, size_w, size_h); + Kit_SetPlayerScreenSize(player, size_w, size_h); break; } break; @@ -292,10 +300,6 @@ int main(int argc, char *argv[]) { } } - // Enable GUI if mouse is hovering over the bottom third of the screen - int limit = (pinfo.video.height / 3) * 2; - gui_enabled = (mouse_y >= limit); - // Refresh audio int queued = SDL_GetQueuedAudioSize(audio_dev); if(queued < AUDIOBUFFER_SIZE) { @@ -329,17 +333,15 @@ int main(int argc, char *argv[]) { // Refresh subtitle texture atlas and render subtitle frames from it // For subtitles, use screen size instead of video size for best quality - SDL_RenderSetLogicalSize(renderer, screen_w, screen_h); SDL_Rect sources[ATLAS_MAX]; SDL_Rect targets[ATLAS_MAX]; int got = Kit_GetPlayerSubtitleData(player, subtitle_tex, sources, targets, ATLAS_MAX); for(int i = 0; i < got; i++) { SDL_RenderCopy(renderer, subtitle_tex, &sources[i], &targets[i]); } - SDL_RenderSetLogicalSize(renderer, pinfo.video.width, pinfo.video.height); - // Render GUI - if(gui_enabled) { + // Enable GUI if mouse is hovering over the bottom third of the screen + if(mouse_y >= ((size_h / 3) * 2)) { double percent = Kit_GetPlayerPosition(player) / Kit_GetPlayerDuration(player); render_gui(renderer, percent); } |