91 lines
1.7 KiB
C++
91 lines
1.7 KiB
C++
#include "Font.h"
|
|
#include "Texture.h"
|
|
#include "Batch2D.h"
|
|
|
|
Font::Font(std::vector<Texture*> pages) : pages(pages) {
|
|
}
|
|
|
|
Font::~Font(){
|
|
for (Texture* texture : pages)
|
|
delete texture;
|
|
}
|
|
|
|
int Font::getGlyphWidth(char c) {
|
|
switch (c){
|
|
case 'l':
|
|
case 'i':
|
|
case 'j':
|
|
case '|':
|
|
case '.':
|
|
case ',':
|
|
case ':':
|
|
case ';': return 3;
|
|
case 't': return 5;
|
|
case ' ': return 3;
|
|
}
|
|
return 7;
|
|
}
|
|
|
|
|
|
bool Font::isPrintableChar(int c) {
|
|
switch (c){
|
|
case ' ':
|
|
case '\t':
|
|
case '\n':
|
|
case '\f':
|
|
case '\r':
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#define RES 16
|
|
|
|
void Font::draw(Batch2D* batch, std::wstring text, int x, int y) {
|
|
draw(batch, text, x, y, STYLE_NONE);
|
|
}
|
|
|
|
void Font::draw(Batch2D* batch, std::wstring text, int x, int y, int style) {
|
|
int page = 0;
|
|
int next = 10000;
|
|
int init_x = x;
|
|
do {
|
|
for (unsigned c : text){
|
|
if (isPrintableChar(c)){
|
|
int charpage = c >> 8;
|
|
if (charpage == page){
|
|
Texture* texture = pages[charpage];
|
|
if (texture == nullptr){
|
|
texture = pages[0];
|
|
}
|
|
batch->texture(pages[charpage]);
|
|
|
|
switch (style){
|
|
case STYLE_SHADOW:
|
|
batch->sprite(x+1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
break;
|
|
case STYLE_OUTLINE:
|
|
for (int oy = -1; oy <= 1; oy++){
|
|
for (int ox = -1; ox <= 1; ox++){
|
|
if (ox || oy)
|
|
batch->sprite(x+ox, y+oy, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
batch->sprite(x, y, RES, RES, 16, c, vec4(1.0f));
|
|
}
|
|
else if (charpage > page && charpage < next){
|
|
next = charpage;
|
|
}
|
|
}
|
|
x += getGlyphWidth(c);
|
|
}
|
|
page = next;
|
|
next = 10000;
|
|
x = init_x;
|
|
} while (page < 10000);
|
|
}
|