Fix scaled text offset in fullscreen modes. Fix #651
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "fileio/fileio.hpp"
|
#include "fileio/fileio.hpp"
|
||||||
#include "gfx/render_shapes.hpp"
|
#include "gfx/render_shapes.hpp"
|
||||||
|
#include "gfx/render_text.hpp"
|
||||||
#include "winutil.hpp"
|
#include "winutil.hpp"
|
||||||
|
|
||||||
sf::Shader maskShader;
|
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) {
|
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
|
// 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());
|
dest_window.setView(dest_window.getDefaultView());
|
||||||
std::vector<ScaleAwareText> stored_text = store_scale_aware_text[&texture];
|
std::vector<ScaleAwareText> stored_text = store_scale_aware_text[&texture];
|
||||||
for(ScaleAwareText text : stored_text){
|
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.left *= get_ui_scale();
|
||||||
rect.bottom *= get_ui_scale();
|
rect.bottom *= get_ui_scale();
|
||||||
rect.right *= get_ui_scale();
|
rect.right *= get_ui_scale();
|
||||||
|
rect.offset(scaled_top_left.x, scaled_top_left.y);
|
||||||
// For debugging:
|
// For debugging:
|
||||||
if(false)
|
if(false)
|
||||||
frame_rect(dest_window, rect, Colours::RED);
|
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();
|
sf::Vector2f position = str_to_draw.getPosition();
|
||||||
position = position + sf::Vector2f {0.0f+targ_rect.left, 0.0f+targ_rect.top};
|
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);
|
dest_window.draw(str_to_draw);
|
||||||
if(!text.clip_rect.empty())
|
if(!text.clip_rect.empty())
|
||||||
undo_clip(dest_window);
|
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) {
|
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);
|
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) {
|
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());
|
str_to_draw.setCharacterSize(str_to_draw.getCharacterSize() * get_ui_scale());
|
||||||
|
|
||||||
if(dynamic_cast<sf::RenderWindow*>(&dest_window) != nullptr){
|
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
|
// 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());
|
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.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){
|
}else if(dynamic_cast<sf::RenderTexture*>(&dest_window) != nullptr){
|
||||||
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&dest_window);
|
sf::RenderTexture* p = dynamic_cast<sf::RenderTexture*>(&dest_window);
|
||||||
// Onto a RenderTexture is trickier because the texture is locked at the smaller size.
|
// 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<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);
|
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 draw_scale_aware_text(sf::RenderTarget& dest_window, sf::Text str_to_draw);
|
||||||
void clear_scale_aware_text(sf::RenderTexture& texture);
|
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);
|
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