#include #include #include #include #include using namespace std; #define WIDTH 500 #define HEIGHT 500 #define FONT_SIZE 20 static FTFont * font; void init(void) { glViewport(0, 0, WIDTH, HEIGHT); glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, WIDTH, 0, HEIGHT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); font = new FTTextureFont("/usr/share/fonts/truetype/freefont/FreeMono.ttf"); if (font->Error()) { cerr << "Could not create font" << endl; } font->FaceSize(FONT_SIZE); } void display(SDL_Window * window) { float line_height = font->LineHeight(); float advance = font->Advance("M"); float low = font->BBox("g").Lower().Y(); float high = font->BBox("M").Upper().X(); float shift = (high + low) / 2.0 - line_height / 2.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glColor4f(1.0, 1.0, 0.0, 1.0); glVertex3f(10 + advance * ('J' - 'A'), HEIGHT - line_height * 3 + shift, 0.0); glVertex3f(10 + advance * ('J' - 'A'), HEIGHT - line_height * 2 + shift, 0.0); glVertex3f(10 + advance * ('J' - 'A' + 1), HEIGHT - line_height * 2 + shift, 0.0); glVertex3f(10 + advance * ('J' - 'A' + 1), HEIGHT - line_height * 3 + shift, 0.0); glEnd(); glColor4f(1, 1, 1, 1); font->Render("abcdefghijklmnopqrstuvwxyz_", -1, FTPoint(10, HEIGHT - line_height, 0)); font->Render("ABCDEFGHIJKLMNOPQRSTUVWXYZ_", -1, FTPoint(10, HEIGHT - line_height * 2, 0)); for (int i = 0; i < 26; i++) { char s[2]; s[0] = 'A' + i; s[1] = '\0'; if (i == 'J' - 'A') glColor4f(0, 0, 0, 1); else glColor4f(1, 1, 1, 1); font->Render(s, -1, FTPoint(10 + advance * i, HEIGHT - line_height * 3, 0)); } font->Render("0123456789", -1, FTPoint(10, HEIGHT - line_height * 4, 0)); SDL_GL_SwapWindow(window); } int main(int argc, char *argv[]) { if (SDL_Init(SDL_INIT_VIDEO)) { printf("Failed to initialize SDL!\n"); return 1; } atexit(SDL_Quit); SDL_Window * window = SDL_CreateWindow(argv[0], SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_OPENGL); if (!window) { printf("Failed to create window!\n"); SDL_Quit(); return 2; } SDL_GLContext gl_context = SDL_GL_CreateContext(window); init(); display(window); SDL_Event event; while (SDL_WaitEvent(&event)) { if (event.type == SDL_QUIT) break; else if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) break; if (event.key.keysym.sym == SDLK_RETURN) display(window); } } }