Fix scaled text offset in fullscreen modes. Fix #651

This commit is contained in:
2025-02-22 08:33:48 -06:00
committed by Celtic Minstrel
parent 99f3cdc1c4
commit 01c11518cc
3 changed files with 26 additions and 6 deletions

View File

@@ -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<sf::RenderTexture*,rectangle> 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<ScaleAwareText> 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) {

View File

@@ -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<sf::RenderWindow*>(&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<sf::RenderTexture*>(&dest_window) != nullptr){
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&dest_window);
// Onto a RenderTexture is trickier because the texture is locked at the smaller size.

View File

@@ -57,6 +57,7 @@ enum class eTextMode {
std::vector<rectangle> draw_string_hilite(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr);
std::vector<snippet_t> draw_string_sel(sf::RenderTarget& dest_window,rectangle dest_rect,std::string str,TextStyle style,std::vector<hilite_t> 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);