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);
}
#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;