From 01c11518cc67678f3e77815a0151b1fb96dde47a Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 22 Feb 2025 08:33:48 -0600 Subject: [PATCH] Fix scaled text offset in fullscreen modes. Fix #651 --- src/gfx/render_image.cpp | 10 +++++++--- src/gfx/render_text.cpp | 21 ++++++++++++++++++--- src/gfx/render_text.hpp | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/gfx/render_image.cpp b/src/gfx/render_image.cpp index 52e7cd4c..1fbfa476 100644 --- a/src/gfx/render_image.cpp +++ b/src/gfx/render_image.cpp @@ -14,6 +14,7 @@ #include "fileio/fileio.hpp" #include "gfx/render_shapes.hpp" +#include "gfx/render_text.hpp" #include "winutil.hpp" sf::Shader maskShader; @@ -127,7 +128,8 @@ std::map store_clip_rects; static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderTarget& dest_window, rectangle targ_rect) { // Temporarily switch target window to its unscaled view to draw scale-aware text - sf::View view = dest_window.getView(); + sf::View scaled_view = dest_window.getView(); + sf::Vector2f scaled_top_left = scaled_view_top_left(dest_window, scaled_view); dest_window.setView(dest_window.getDefaultView()); std::vector stored_text = store_scale_aware_text[&texture]; for(ScaleAwareText text : stored_text){ @@ -139,6 +141,7 @@ static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderT rect.left *= get_ui_scale(); rect.bottom *= get_ui_scale(); rect.right *= get_ui_scale(); + rect.offset(scaled_top_left.x, scaled_top_left.y); // For debugging: if(false) frame_rect(dest_window, rect, Colours::RED); @@ -146,12 +149,13 @@ static void draw_stored_scale_aware_text(sf::RenderTexture& texture, sf::RenderT } sf::Vector2f position = str_to_draw.getPosition(); position = position + sf::Vector2f {0.0f+targ_rect.left, 0.0f+targ_rect.top}; - str_to_draw.setPosition(position * (float)get_ui_scale()); + position *= (float)get_ui_scale(); + str_to_draw.setPosition(position + scaled_top_left); dest_window.draw(str_to_draw); if(!text.clip_rect.empty()) undo_clip(dest_window); } - dest_window.setView(view); + dest_window.setView(scaled_view); } void rect_draw_some_item(sf::RenderTexture& src_render_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode) { diff --git a/src/gfx/render_text.cpp b/src/gfx/render_text.cpp index 1e4d7cef..748fa799 100644 --- a/src/gfx/render_text.cpp +++ b/src/gfx/render_text.cpp @@ -143,16 +143,31 @@ void clear_scale_aware_text(sf::RenderTexture& texture) { store_scale_aware_text.erase(&texture); } +// Offset the scale-aware text by the viewport top-left corner of the current +// window mode: +sf::Vector2f scaled_view_top_left(sf::RenderTarget& dest_window, sf::View& scaled_view) { + sf::FloatRect viewport = scaled_view.getViewport(); + rectangle windRect { dest_window }; + sf::Vector2f top_left(viewport.left * windRect.width(), viewport.top * windRect.height()); + return top_left; +} + void draw_scale_aware_text(sf::RenderTarget& dest_window, sf::Text str_to_draw) { str_to_draw.setCharacterSize(str_to_draw.getCharacterSize() * get_ui_scale()); if(dynamic_cast(&dest_window) != nullptr){ - str_to_draw.setPosition(str_to_draw.getPosition() * (float)get_ui_scale()); // Temporarily switch window to its unscaled view to draw scale-aware text - sf::View view = dest_window.getView(); + sf::View scaled_view = dest_window.getView(); dest_window.setView(dest_window.getDefaultView()); + + sf::Vector2f text_position = str_to_draw.getPosition() * (float)get_ui_scale(); + str_to_draw.setPosition(text_position + scaled_view_top_left(dest_window, scaled_view)); + + // Draw the text immediately dest_window.draw(str_to_draw); - dest_window.setView(view); + + // Restore the scaled view + dest_window.setView(scaled_view); }else if(dynamic_cast(&dest_window) != nullptr){ sf::RenderTexture* p = dynamic_cast(&dest_window); // Onto a RenderTexture is trickier because the texture is locked at the smaller size. diff --git a/src/gfx/render_text.hpp b/src/gfx/render_text.hpp index 412f3211..b518cfa4 100644 --- a/src/gfx/render_text.hpp +++ b/src/gfx/render_text.hpp @@ -57,6 +57,7 @@ enum class eTextMode { std::vector draw_string_hilite(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector hilites,sf::Color hiliteClr); std::vector draw_string_sel(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector hilites,sf::Color hiliteClr); +sf::Vector2f scaled_view_top_left(sf::RenderTarget& dest_window, sf::View& scaled_view); void draw_scale_aware_text(sf::RenderTarget& dest_window, sf::Text str_to_draw); void clear_scale_aware_text(sf::RenderTexture& texture); void win_draw_string(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,eTextMode mode,TextStyle style,bool right_align = false);