nuclear@3: /* Unicode libdrawtext example. nuclear@3: * nuclear@3: * Important parts are marked with XXX comments. nuclear@3: */ nuclear@3: #include nuclear@3: #include nuclear@3: nuclear@3: #ifndef __APPLE__ nuclear@3: #include nuclear@3: #else nuclear@3: #include nuclear@3: #endif nuclear@3: nuclear@3: #include "drawtext.h" nuclear@3: nuclear@3: void disp(void); nuclear@3: void reshape(int x, int y); nuclear@3: void keyb(unsigned char key, int x, int y); nuclear@3: nuclear@3: /* XXX fonts are represented by the opaque struct dtx_font type, so you nuclear@3: * need to create at least one with dtx_open_font (see main). nuclear@3: */ nuclear@4: struct dtx_font *fntmain, *fntcjk, *fntklingon; nuclear@3: nuclear@4: #define FONT_SZ 24 nuclear@3: nuclear@3: int main(int argc, char **argv) nuclear@3: { nuclear@3: glutInit(&argc, argv); nuclear@3: glutInitWindowSize(512, 384); nuclear@3: glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); nuclear@4: glutCreateWindow("libdrawtext example: unicode"); nuclear@3: nuclear@3: glutDisplayFunc(disp); nuclear@3: glutReshapeFunc(reshape); nuclear@3: glutKeyboardFunc(keyb); nuclear@3: nuclear@3: /* XXX dtx_open_font opens a font file and returns a pointer to dtx_font */ nuclear@4: if(!(fntmain = dtx_open_font("serif.ttf", 0))) { nuclear@3: return 1; nuclear@3: } nuclear@4: dtx_prepare_range(fntmain, FONT_SZ, 0, 256); /* ASCII */ nuclear@4: dtx_prepare_range(fntmain, FONT_SZ, 0x370, 0x400); /* greek */ nuclear@4: dtx_prepare_range(fntmain, FONT_SZ, 0x400, 0x500); /* cyrilic */ nuclear@3: nuclear@4: if(!(fntcjk = dtx_open_font("cjk.ttf", 0))) { nuclear@3: return 1; nuclear@3: } nuclear@4: dtx_prepare_range(fntcjk, FONT_SZ, 0x4e00, 0x9fc0); /* kanji */ nuclear@4: nuclear@4: if(!(fntklingon = dtx_open_font("klingon.ttf", 0))) { nuclear@4: return 1; nuclear@4: } nuclear@4: dtx_prepare_range(fntklingon, FONT_SZ, 0xf8d0, 0xf900); /* klingon */ nuclear@3: nuclear@3: glutMainLoop(); nuclear@3: return 0; nuclear@3: } nuclear@3: nuclear@4: /* various UTF-8 strings */ nuclear@4: const char *english_text = "Hello world!"; nuclear@3: const char *greek_text = "\xce\x9a\xce\xbf\xcf\x8d\xcf\x81\xce\xb1\xcf\x83\xce\xb7"; nuclear@4: const char *russian_text = "\xd0\xa0\xd0\xb0\xd1\x81\xd1\x86\xd0\xb2\xd0\xb5\xd1\x82\xd0\xb0\xd0\xbb\xd0\xb8 \xd1\x8f\xd0\xb1\xd0\xbb\xd0\xbe\xd0\xbd\xd0\xb8 \xd0\xb8 \xd0\xb3\xd1\x80\xd1\x83\xd1\x88\xd0\xb8"; nuclear@3: const char *kanji_text = "\xe4\xb9\x97\xe4\xba\xac"; nuclear@3: const char *klingon_text = "\xef\xa3\xa3\xef\xa3\x9d\xef\xa3\x93\xef\xa3\x98\xef\xa3\x9d\xef\xa3\xa2\xef\xa3\xa1\xef\xa3\x9d\xef\xa3\x99"; nuclear@3: nuclear@3: nuclear@3: void disp(void) nuclear@3: { nuclear@3: glClear(GL_COLOR_BUFFER_BIT); nuclear@3: nuclear@3: glMatrixMode(GL_MODELVIEW); nuclear@3: glLoadIdentity(); nuclear@3: nuclear@4: dtx_use_font(fntmain, FONT_SZ); nuclear@3: nuclear@3: glTranslatef(-200, 150, 0); nuclear@3: /* XXX call dtx_string to draw utf-8 text. nuclear@3: * any transformations and the current color apply nuclear@3: */ nuclear@4: dtx_string(english_text); nuclear@3: nuclear@3: glTranslatef(0, -40, 0); nuclear@3: dtx_string(greek_text); nuclear@3: nuclear@3: glTranslatef(0, -40, 0); nuclear@4: dtx_string(russian_text); nuclear@4: nuclear@4: dtx_use_font(fntcjk, FONT_SZ); nuclear@4: nuclear@4: glTranslatef(0, -40, 0); nuclear@3: dtx_string(kanji_text); nuclear@3: nuclear@4: dtx_use_font(fntklingon, FONT_SZ); nuclear@3: nuclear@3: glTranslatef(0, -40, 0); nuclear@3: dtx_string(klingon_text); nuclear@3: nuclear@3: glutSwapBuffers(); nuclear@3: } nuclear@3: nuclear@3: void reshape(int x, int y) nuclear@3: { nuclear@3: glViewport(0, 0, x, y); nuclear@3: nuclear@3: glMatrixMode(GL_PROJECTION); nuclear@3: glLoadIdentity(); nuclear@3: glOrtho(-x/2, x/2, -y/2, y/2, -1, 1); nuclear@3: } nuclear@3: nuclear@3: void keyb(unsigned char key, int x, int y) nuclear@3: { nuclear@3: if(key == 27) { nuclear@3: exit(0); nuclear@3: } nuclear@3: }