draw scale-aware text clipped to the adjusted clip_rect

This commit is contained in:
2025-02-17 13:03:55 -06:00
parent d78793c979
commit 32a532b7eb
3 changed files with 30 additions and 6 deletions

View File

@@ -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<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
std::map<sf::RenderTexture*,std::vector<ScaleAwareText>> store_scale_aware_text;
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();
dest_window.setView(dest_window.getDefaultView());
std::vector<sf::Text> stored_text = store_scale_aware_text[&texture];
for(sf::Text str_to_draw : stored_text){
std::vector<ScaleAwareText> 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);
}

View File

@@ -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);

View File

@@ -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<sf::RenderTexture*,std::vector<sf::Text>> store_scale_aware_text;
extern std::map<sf::RenderTexture*,std::vector<ScaleAwareText>> store_scale_aware_text;
extern std::map<sf::RenderTexture*,rectangle> 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<sf::Text> {};
store_scale_aware_text[p] = std::vector<ScaleAwareText> {};
}
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);
}
}