Fix scaled text offset in fullscreen modes. Fix #651
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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.
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user