]> git.localhorst.tv Git - l2e.git/commitdiff
added string support in Font
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 8 Aug 2012 18:53:08 +0000 (20:53 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 8 Aug 2012 18:53:08 +0000 (20:53 +0200)
src/graphics/Font.cpp
src/graphics/Font.h

index 0ff3d9d4d90360b997277ee20226920d1e4d6bb2..135775c1412061224b1e9434acc2d7f19245e80c 100644 (file)
@@ -18,6 +18,20 @@ using std::pow;
 
 namespace graphics {
 
+void Font::DrawChar(char c, SDL_Surface *dest, Point<int> position) const {
+       if (!HasChar(c)) return;
+       const Mapping &m(map[(unsigned char)c]);
+       sprite->Draw(dest, position, m.col, m.row);
+}
+
+void Font::DrawString(const char *s, SDL_Surface *dest, Point<int> positionIn, int maxChars) const {
+       Point<int> position(positionIn);
+       Vector<int> step(CharWidth(), 0);
+       for (int i(0); s[i] && (maxChars <= 0 || i < maxChars); ++i, position += step) {
+               DrawChar(s[i], dest, position);
+       }
+}
+
 void Font::DrawDigit(int digit, SDL_Surface *dest, Point<int> position) const {
        sprite->Draw(dest, position, digitsCol + digit, digitsRow);
 }
index 0294d2539f0c47417ad45083d7a273b919eff4bb..082e4c01d56357c0ab3f07bfd7f004e45fc3d96b 100644 (file)
 #include "Sprite.h"
 #include "../geometry/Point.h"
 
+#include <map>
 #include <SDL.h>
 
 namespace graphics {
 
+// TODO: maybe fix fonts to use a 8x8 tile sprite for all chars
 class Font {
 
 public:
-       explicit Font(const Sprite *sprite, int digitsCol = 0, int digitsRow = 0) : sprite(sprite), digitsCol(digitsCol), digitsRow(digitsRow) { }
+       explicit Font(const Sprite *sprite, int digitsCol = 0, int digitsRow = 0)
+       : sprite(sprite), digitsCol(digitsCol), digitsRow(digitsRow) {
+               MapRange('0', '9', digitsCol, digitsRow);
+       }
 
 public:
        int CharWidth() const { return sprite->Width(); }
        int CharHeight() const { return sprite->Height(); }
-       void DrawDigit(int digit, SDL_Surface *dest, geometry::Point<int> position) const;
-       void DrawNumber(int number, SDL_Surface *dest, geometry::Point<int> position, int digits = 0) const;
+       void DrawChar(char c, SDL_Surface *dest, geometry::Point<int> position) const;
+       void DrawString(const char *s, SDL_Surface *dest, geometry::Point<int> position, int maxChars = 0) const;
+       void DrawDigit(int d, SDL_Surface *dest, geometry::Point<int> position) const;
+       void DrawNumber(int n, SDL_Surface *dest, geometry::Point<int> position, int digits = 0) const;
+
+public:
+       bool HasChar(char c) const { return map[(unsigned char)c].mapped; };
+       void MapChar(char c, int col, int row) { map[(unsigned char)c].mapped = true; map[(unsigned char)c].col = col; map[(unsigned char)c].row = row; };
+       void MapRange(char from, char to, int colStart, int row) {
+               int col(colStart);
+               for (unsigned char c(from); c <= to; ++c, ++col) {
+                       MapChar(c, col, row);
+               }
+       }
 
 private:
+       struct Mapping {
+               Mapping() : mapped(false), col(0), row(0) { }
+               bool mapped;
+               int col;
+               int row;
+       };
        const Sprite *sprite;
+       Mapping map[256];
        int digitsCol;
        int digitsRow;