X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fvideo%2Ffont.cpp;h=e01cedc4b03f77c5a9b7b07d5ef8ee04aa419a38;hb=8e0bad9f82ccbc811a18edd7ce6c6f69c5bca082;hp=0ab700a48615ece6b02ccafd9bb35814c9c741f4;hpb=c7c3342e1e192d13ba1062823fd08f08d39ad262;p=supertux.git diff --git a/lib/video/font.cpp b/lib/video/font.cpp index 0ab700a48..e01cedc4b 100644 --- a/lib/video/font.cpp +++ b/lib/video/font.cpp @@ -18,14 +18,18 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. +#include + #include #include +#include -#include "../app/globals.h" -#include "../video/screen.h" -#include "../video/font.h" -#include "../video/drawing_context.h" -#include "../utils/lispreader.h" +#include "app/globals.h" +#include "lisp/parser.h" +#include "lisp/lisp.h" +#include "screen.h" +#include "font.h" +#include "drawing_context.h" using namespace SuperTux; @@ -74,15 +78,16 @@ float Font::get_text_width(const std::string& text) const { /** Let's calculate the size of the biggest paragraph */ - std::string::size_type l, hl; - hl = 0; l = -1; + std::string::size_type l, hl, ol; + hl = 0; l = 0; while(true) { + ol = l; l = text.find("\n", l+1); if(l == std::string::npos) break; - if(hl < l) - hl = l; + if(hl < l-ol) + hl = l-ol; } if(hl == 0) hl = text.size(); @@ -95,11 +100,11 @@ Font::get_text_height(const std::string& text) const { /** Let's calculate height of the text */ std::string::size_type l, hh; - hh = h; l = -1; + hh = h; l = 0; while(true) { l = text.find("\n", l+1); - if(l == (int)std::string::npos) + if(l == std::string::npos) break; hh += h + 2; } @@ -114,33 +119,36 @@ Font::get_height() const } void -Font::draw(const std::string& text, const Vector& pos_, int allignment, Uint32 drawing_effect, int alpha) +Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, + uint32_t drawing_effect, uint8_t alpha) const { - // calculate X positions based on the allignment type - Vector pos = Vector(pos_); - if(allignment == CENTER_ALLIGN) - pos.x -= get_text_width(text) / 2; - else if(allignment == RIGHT_ALLIGN) - pos.x -= get_text_width(text); - /* Cut lines changes into seperate strings, needed to support center/right text - allignments with break lines. + alignments with break lines. Feel free to replace this hack with a more elegant solution */ char temp[1024]; std::string::size_type l, i, y; + bool done = false; i = y = 0; - while(true) + while(!done) { l = text.find("\n", i); if(l == std::string::npos) { - temp[text.copy(temp, text.size() - i, i)] = '\0'; - draw_text(temp, pos + Vector(0,y), drawing_effect, alpha); - break; + l = text.size(); + done = true; } + temp[text.copy(temp, l - i, i)] = '\0'; + + // calculate X positions based on the alignment type + Vector pos = Vector(pos_); + if(alignment == CENTER_ALLIGN) + pos.x -= get_text_width(temp) / 2; + else if(alignment == RIGHT_ALLIGN) + pos.x -= get_text_width(temp); + draw_text(temp, pos + Vector(0,y), drawing_effect, alpha); i = l+1; @@ -149,7 +157,8 @@ Font::draw(const std::string& text, const Vector& pos_, int allignment, Uint32 d } void -Font::draw_text(const std::string& text, const Vector& pos, Uint32 drawing_effect, int alpha) +Font::draw_text(const std::string& text, const Vector& pos, + uint32_t drawing_effect, uint8_t alpha) const { if(shadowsize > 0) draw_chars(shadow_chars, text, pos + Vector(shadowsize, shadowsize), @@ -160,7 +169,7 @@ Font::draw_text(const std::string& text, const Vector& pos, Uint32 drawing_effec void Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, - Uint32 drawing_effect, int alpha) + uint32_t drawing_effect, uint8_t alpha) const { SurfaceImpl* impl = pchars->impl; @@ -190,146 +199,3 @@ Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, } } -/* --- SCROLL TEXT FUNCTION --- */ - -#define MAX_VEL 10 -#define SPEED_INC 0.01 -#define SCROLL 60 -#define ITEMS_SPACE 4 - -void SuperTux::display_text_file(const std::string& file, float scroll_speed, Font* heading_font, Font* normal_font, Font* small_font, Font* reference_font ) -{ - std::string text; - std::vector names; - - LispReader* reader = LispReader::load(datadir + "/" + file, "supertux-text"); - - if(!reader) - { - std::cerr << "Error: Could not open text. Ignoring...\n"; - return; - } - - reader->read_string("text", text, true); - std::string background_file; - reader->read_string("background", background_file, true); - delete reader; - - // Split text string lines into a vector - names.clear(); - unsigned int i, l; - i = 0; - while(true) - { - l = text.find("\n", i); - - if(l == std::string::npos) - { - char temp[1024]; - temp[text.copy(temp, text.size() - i, i)] = '\0'; - names.push_back(temp); - break; - } - - char temp[1024]; - temp[text.copy(temp, l-i, i)] = '\0'; - names.push_back(temp); - - i = l+1; - } - - // load background image - Surface* background = new Surface(datadir + "/images/background/" + background_file, false); - - int done = 0; - float scroll = 0; - float speed = scroll_speed / 50; - - DrawingContext context; - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - - Uint32 lastticks = SDL_GetTicks(); - while(!done) - { - /* in case of input, exit */ - SDL_Event event; - while(SDL_PollEvent(&event)) - switch(event.type) - { - case SDL_KEYDOWN: - switch(event.key.keysym.sym) - { - case SDLK_UP: - speed -= SPEED_INC; - break; - case SDLK_DOWN: - speed += SPEED_INC; - break; - case SDLK_SPACE: - case SDLK_RETURN: - if(speed >= 0) - scroll += SCROLL; - break; - case SDLK_ESCAPE: - done = 1; - break; - default: - break; - } - break; - case SDL_QUIT: - done = 1; - break; - default: - break; - } - - if(speed > MAX_VEL) - speed = MAX_VEL; - else if(speed < -MAX_VEL) - speed = -MAX_VEL; - - /* draw the credits */ - context.draw_surface(background, Vector(0,0), 0); - - float y = 0; - for(size_t i = 0; i < names.size(); i++) { - if(names[i].size() == 0) { - y += normal_font->get_height() + ITEMS_SPACE; - continue; - } - - Font* font = 0; - switch(names[i][0]) - { - case ' ': font = small_font; break; - case '\t': font = normal_font; break; - case '-': font = heading_font; break; - case '*': font = reference_font; break; - default: font = reference_font; break; - } - - context.draw_text(font, - names[i].substr(1, names[i].size()-1), - Vector(screen->w/2, screen->h + y - scroll), CENTER_ALLIGN, LAYER_FOREGROUND1); - y += font->get_height() + ITEMS_SPACE; - } - - context.do_drawing(); - - if(screen->h+y-scroll < 0 && 20+screen->h+y-scroll < 0) - done = 1; - - Uint32 ticks = SDL_GetTicks(); - scroll += speed * (ticks - lastticks); - lastticks = ticks; - if(scroll < 0) - scroll = 0; - - SDL_Delay(10); - } - - SDL_EnableKeyRepeat(0, 0); // disables key repeating - delete background; -} -