diff --git a/src/gfx/render_image.cpp b/src/gfx/render_image.cpp index 57a5244b..52e7cd4c 100644 --- a/src/gfx/render_image.cpp +++ b/src/gfx/render_image.cpp @@ -122,19 +122,34 @@ void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const rect_draw_some_item(src.getTexture(), dest_rect, targ_gworld, targ_rect, &maskShader); } -std::map> store_scale_aware_text; +std::map> store_scale_aware_text; 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(); dest_window.setView(dest_window.getDefaultView()); - std::vector stored_text = store_scale_aware_text[&texture]; - for(sf::Text str_to_draw : stored_text){ + std::vector stored_text = store_scale_aware_text[&texture]; + for(ScaleAwareText text : stored_text){ + sf::Text str_to_draw = text.text; + if(!text.clip_rect.empty()){ + rectangle rect = text.clip_rect; + rect.offset(targ_rect.left, targ_rect.top); + rect.top *= get_ui_scale(); + rect.left *= get_ui_scale(); + rect.bottom *= get_ui_scale(); + rect.right *= get_ui_scale(); + // For debugging: + if(false) + frame_rect(dest_window, rect, Colours::RED); + clip_rect(dest_window, rect); + } 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()); dest_window.draw(str_to_draw); + if(!text.clip_rect.empty()) + undo_clip(dest_window); } dest_window.setView(view); } diff --git a/src/gfx/render_shapes.hpp b/src/gfx/render_shapes.hpp index d56610ae..b9e03924 100644 --- a/src/gfx/render_shapes.hpp +++ b/src/gfx/render_shapes.hpp @@ -29,6 +29,11 @@ public: rectangle getEnclosingRect(); }; +struct ScaleAwareText { + sf::Text text; + rectangle clip_rect; +}; + void fill_rect(sf::RenderTarget& target, rectangle rect, sf::Color colour); void fill_circle(sf::RenderTarget& target, rectangle rect, sf::Color colour); void fill_roundrect(sf::RenderTarget& target, rectangle rect, int rad, sf::Color colour); diff --git a/src/gfx/render_text.cpp b/src/gfx/render_text.cpp index 5cfd973f..1e4d7cef 100644 --- a/src/gfx/render_text.cpp +++ b/src/gfx/render_text.cpp @@ -136,7 +136,7 @@ break_info_t calculate_line_wrapping(rectangle dest_rect, std::string str, TextS } // I don't know of a better way to do this than using pointers as keys. -extern std::map> store_scale_aware_text; +extern std::map> store_scale_aware_text; extern std::map store_clip_rects; void clear_scale_aware_text(sf::RenderTexture& texture) { @@ -159,9 +159,13 @@ void draw_scale_aware_text(sf::RenderTarget& dest_window, sf::Text str_to_draw) // What we can do is save the sf::Text with its relative position and render // it onto the RenderWindow that eventually draws the RenderTexture. if(store_scale_aware_text.find(p) == store_scale_aware_text.end()){ - store_scale_aware_text[p] = std::vector {}; + store_scale_aware_text[p] = std::vector {}; } - store_scale_aware_text[p].push_back(str_to_draw); + ScaleAwareText text = { str_to_draw, {}}; + if(store_clip_rects.find(p) != store_clip_rects.end()){ + text.clip_rect = store_clip_rects[p]; + } + store_scale_aware_text[p].push_back(text); } }