Improve the string drawing routine to make better use of STL and SFML
This commit is contained in:
@@ -177,13 +177,11 @@ void TextStyle::applyTo(sf::Text& text) {
|
|||||||
// str is a c string, 256 characters
|
// str is a c string, 256 characters
|
||||||
// uses current font
|
// uses current font
|
||||||
// TODO: Make an enum for the mode parameter
|
// TODO: Make an enum for the mode parameter
|
||||||
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* str,short mode,short line_height,location offset){
|
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,short mode,short line_height,location offset){
|
||||||
char c_str[256];
|
|
||||||
sf::Text str_to_draw;
|
sf::Text str_to_draw;
|
||||||
TEXT.applyTo(str_to_draw);
|
TEXT.applyTo(str_to_draw);
|
||||||
short str_len,i;
|
short str_len,i;
|
||||||
short last_line_break = 0,last_word_break = 0;
|
short last_line_break = 0,last_word_break = 0;
|
||||||
short text_len[257];
|
|
||||||
short total_width = 0;
|
short total_width = 0;
|
||||||
//bool /*end_loop,*/force_skip = false;
|
//bool /*end_loop,*/force_skip = false;
|
||||||
//KeyMap key_state;
|
//KeyMap key_state;
|
||||||
@@ -195,17 +193,8 @@ void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* st
|
|||||||
str_to_draw.setString("fj"); // Something that has both an ascender and a descender
|
str_to_draw.setString("fj"); // Something that has both an ascender and a descender
|
||||||
adjust_y -= str_to_draw.getLocalBounds().height;
|
adjust_y -= str_to_draw.getLocalBounds().height;
|
||||||
|
|
||||||
// TODO: The contents of this array can be obtained by str_to_draw.findCharacterPos(i)
|
str_to_draw.setString(str);
|
||||||
strcpy((char *) c_str,(char *) str);
|
str_len = str.length();
|
||||||
for (i = 0; i < 257; i++) {
|
|
||||||
text_len[i] = 0;
|
|
||||||
char c = c_str[i];
|
|
||||||
c_str[i] = 0;
|
|
||||||
str_to_draw.setString(c_str);
|
|
||||||
text_len[i] = str_to_draw.getLocalBounds().width;
|
|
||||||
c_str[i] = c;
|
|
||||||
}
|
|
||||||
str_len = (short) strlen((char *)str);
|
|
||||||
if (str_len == 0) {
|
if (str_len == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -213,14 +202,15 @@ void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* st
|
|||||||
//current_clip = NewRgn();
|
//current_clip = NewRgn();
|
||||||
//GetClip(current_clip);
|
//GetClip(current_clip);
|
||||||
|
|
||||||
for (i = 0; i < 257; i++)
|
total_width = str_to_draw.getLocalBounds().width;
|
||||||
if ((text_len[i] > total_width) && (i <= str_len))
|
|
||||||
total_width = text_len[i];
|
|
||||||
if ((mode == 0) && (total_width < dest_rect.width()))
|
if ((mode == 0) && (total_width < dest_rect.width()))
|
||||||
mode = 2;
|
mode = 2;
|
||||||
for (i = 0; i < 257; i++)
|
if(mode == 2 && str.find('|') != std::string::npos)
|
||||||
if ((i <= str_len) && (c_str[i] == '|') && (mode == 2))
|
mode = 0;
|
||||||
mode = 0;
|
|
||||||
|
auto text_len = [&str_to_draw](size_t i) -> int {
|
||||||
|
return str_to_draw.findCharacterPos(i).x;
|
||||||
|
};
|
||||||
|
|
||||||
location moveTo;
|
location moveTo;
|
||||||
line_height -= 2;
|
line_height -= 2;
|
||||||
@@ -228,25 +218,22 @@ void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* st
|
|||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 0: // Wrapped
|
case 0: // Wrapped
|
||||||
moveTo = location(dest_rect.left + 1 + adjust_x, dest_rect.top + 1 + adjust_y + 9);
|
moveTo = location(dest_rect.left + 1 + adjust_x, dest_rect.top + 1 + adjust_y + 9);
|
||||||
for (i = 0;text_len[i] != text_len[i + 1] && i < str_len;i++) {
|
for(i = 0; text_len(i) != text_len(i + 1) && i < str_len;i++) {
|
||||||
if (((text_len[i] - text_len[last_line_break] > (dest_rect.width() - 6))
|
if(((text_len(i) - text_len(last_line_break) > (dest_rect.width() - 6))
|
||||||
&& (last_word_break > last_line_break)) || (c_str[i] == '|')) {
|
&& (last_word_break > last_line_break)) || (str[i] == '|')) {
|
||||||
if (c_str[i] == '|') {
|
if(str[i] == '|') {
|
||||||
c_str[i] = ' ';
|
str[i] = ' ';
|
||||||
//force_skip = true;
|
//force_skip = true;
|
||||||
last_word_break = i + 1;
|
last_word_break = i + 1;
|
||||||
}
|
}
|
||||||
size_t amount = last_word_break - last_line_break - 1;
|
size_t amount = last_word_break - last_line_break - 1;
|
||||||
size_t end = amount + last_line_break + 1;
|
sf::Text line_to_draw(str_to_draw);
|
||||||
char c = c_str[end];
|
line_to_draw.setString(str.substr(last_line_break,amount));
|
||||||
c_str[end] = 0;
|
|
||||||
str_to_draw.setString(c_str + last_line_break);
|
|
||||||
c_str[end] = c;
|
|
||||||
//sprintf((char *)str_to_draw2," %s",str_to_draw);
|
//sprintf((char *)str_to_draw2," %s",str_to_draw);
|
||||||
//str_to_draw2[0] = (char) strlen((char *)str_to_draw);
|
//str_to_draw2[0] = (char) strlen((char *)str_to_draw);
|
||||||
//DrawString(str_to_draw2);
|
//DrawString(str_to_draw2);
|
||||||
str_to_draw.setPosition(moveTo);
|
line_to_draw.setPosition(moveTo);
|
||||||
dest_window.draw(str_to_draw);
|
dest_window.draw(line_to_draw);
|
||||||
moveTo.y += line_height;
|
moveTo.y += line_height;
|
||||||
last_line_break = last_word_break;
|
last_line_break = last_word_break;
|
||||||
//if (force_skip) {
|
//if (force_skip) {
|
||||||
@@ -256,17 +243,15 @@ void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* st
|
|||||||
//last_word_break++;
|
//last_word_break++;
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
if (c_str[i] == ' ')
|
if(str[i] == ' ')
|
||||||
last_word_break = i + 1;
|
last_word_break = i + 1;
|
||||||
// if (on_what_line == LINES_IN_TEXT_WIN - 1)
|
// if (on_what_line == LINES_IN_TEXT_WIN - 1)
|
||||||
// i = 10000;
|
// i = 10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i - last_line_break > 1) {
|
if (i - last_line_break > 1) {
|
||||||
size_t amount = i - last_line_break - 1;
|
|
||||||
size_t end = amount + last_line_break + 1;
|
|
||||||
str_to_draw.setPosition(moveTo);
|
str_to_draw.setPosition(moveTo);
|
||||||
str_to_draw.setString(c_str + last_line_break);
|
str_to_draw.setString(str.substr(last_line_break));
|
||||||
//sprintf((char *)str_to_draw2," %s",str_to_draw);
|
//sprintf((char *)str_to_draw2," %s",str_to_draw);
|
||||||
//if (strlen((char *) str_to_draw2) > 3) {
|
//if (strlen((char *) str_to_draw2) > 3) {
|
||||||
// str_to_draw2[0] = (char) strlen((char *)str_to_draw);
|
// str_to_draw2[0] = (char) strlen((char *)str_to_draw);
|
||||||
@@ -299,7 +284,7 @@ void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* st
|
|||||||
//printf("String drawn.\n");
|
//printf("String drawn.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
short string_length(const char *str){ // Why not just use strlen?
|
short string_length(std::string str){
|
||||||
short total_width = 0;
|
short total_width = 0;
|
||||||
|
|
||||||
sf::Text text;
|
sf::Text text;
|
||||||
|
@@ -101,8 +101,8 @@ void restore_cursor();
|
|||||||
void rect_draw_some_item(sf::RenderTarget& targ_gworld,RECT targ_rect);
|
void rect_draw_some_item(sf::RenderTarget& targ_gworld,RECT targ_rect);
|
||||||
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::BlendMode mode = sf::BlendNone);
|
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::BlendMode mode = sf::BlendNone);
|
||||||
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,RECT targ_rect,location offset,sf::BlendMode mode = sf::BlendNone);
|
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,RECT targ_rect,location offset,sf::BlendMode mode = sf::BlendNone);
|
||||||
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,const char* str,short mode,short line_height,location offset = {0,0});
|
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,short mode,short line_height,location offset = {0,0});
|
||||||
short string_length(const char *str);
|
short string_length(std::string str);
|
||||||
//OSStatus flip_pict(OSType domain, OSType type, short id, void *ptr, UInt32 size, bool isNative, void *refcon);
|
//OSStatus flip_pict(OSType domain, OSType type, short id, void *ptr, UInt32 size, bool isNative, void *refcon);
|
||||||
//void draw_terrain();
|
//void draw_terrain();
|
||||||
RECT calc_rect(short i, short j);
|
RECT calc_rect(short i, short j);
|
||||||
|
Reference in New Issue
Block a user