From bbbe058cad671d87a2122dc75c15e52d420eb9e0 Mon Sep 17 00:00:00 2001 From: Themaister Date: Mon, 16 Sep 2013 22:27:15 +0200 Subject: [PATCH] Avoid OSD fonts appearing on screenshots. Clears message queue and renders a cached frame before taking screenshot when taking GPU screenshots. --- frontend/menu/rgui.c | 11 ----------- retroarch.c | 24 ++++++++++++++++++------ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 251ddaeac7..dc65c8928d 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -1003,18 +1003,7 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r #ifdef HAVE_SCREENSHOTS case RGUI_SETTINGS_SCREENSHOT: if (action == RGUI_ACTION_OK) - { - // Render a clean frame to avoid taking screnshot of RGUI. - if (g_settings.video.gpu_screenshot || - g_extern.system.hw_render_callback.context_type != RETRO_HW_CONTEXT_NONE) - { - if (driver.video_poke && driver.video_poke->set_texture_enable) - driver.video_poke->set_texture_enable(driver.video_data, false, false); - if (driver.video) - rarch_render_cached_frame(); - } rarch_take_screenshot(); - } break; #endif case RGUI_SETTINGS_RESTART_GAME: diff --git a/retroarch.c b/retroarch.c index db8231a93c..c152721fe2 100644 --- a/retroarch.c +++ b/retroarch.c @@ -122,10 +122,24 @@ void rarch_take_screenshot(void) bool ret = false; - if ((g_settings.video.gpu_screenshot || - g_extern.system.hw_render_callback.context_type != RETRO_HW_CONTEXT_NONE) && - driver.video->read_viewport && - driver.video->viewport_info) + bool viewport_read = (g_settings.video.gpu_screenshot || + g_extern.system.hw_render_callback.context_type != RETRO_HW_CONTEXT_NONE) && + driver.video->read_viewport && + driver.video->viewport_info; + + // Clear out message queue to avoid OSD fonts to appear on screenshot. + msg_queue_clear(g_extern.msg_queue); + + if (viewport_read) + { + // Avoid taking screenshot of GUI overlays. + if (driver.video_poke && driver.video_poke->set_texture_enable) + driver.video_poke->set_texture_enable(driver.video_data, false, false); + if (driver.video) + rarch_render_cached_frame(); + } + + if (viewport_read) ret = take_screenshot_viewport(); else if (g_extern.frame_cache.data && (g_extern.frame_cache.data != RETRO_HW_FRAME_BUFFER_VALID)) ret = take_screenshot_raw(); @@ -144,8 +158,6 @@ void rarch_take_screenshot(void) msg = "Failed to take screenshot."; } - msg_queue_clear(g_extern.msg_queue); - if (g_extern.is_paused) { msg_queue_push(g_extern.msg_queue, msg, 1, 1);