libdrawtext

annotate examples/unicode/unicode.c @ 44:35675c3e16b4

improvements in font2glyphmap
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 07 Aug 2014 07:02:41 +0300
parents 10cfb642d0b8
children
rev   line source
nuclear@3 1 /* Unicode libdrawtext example.
nuclear@3 2 *
nuclear@3 3 * Important parts are marked with XXX comments.
nuclear@3 4 */
nuclear@3 5 #include <stdio.h>
nuclear@3 6 #include <stdlib.h>
nuclear@3 7
nuclear@3 8 #ifndef __APPLE__
nuclear@3 9 #include <GL/glut.h>
nuclear@3 10 #else
nuclear@3 11 #include <GLUT/glut.h>
nuclear@3 12 #endif
nuclear@3 13
nuclear@3 14 #include "drawtext.h"
nuclear@3 15
nuclear@3 16 void disp(void);
nuclear@3 17 void reshape(int x, int y);
nuclear@3 18 void keyb(unsigned char key, int x, int y);
nuclear@3 19
nuclear@3 20 /* XXX fonts are represented by the opaque struct dtx_font type, so you
nuclear@3 21 * need to create at least one with dtx_open_font (see main).
nuclear@3 22 */
nuclear@4 23 struct dtx_font *fntmain, *fntcjk, *fntklingon;
nuclear@3 24
nuclear@4 25 #define FONT_SZ 24
nuclear@3 26
nuclear@3 27 int main(int argc, char **argv)
nuclear@3 28 {
nuclear@3 29 glutInit(&argc, argv);
nuclear@3 30 glutInitWindowSize(512, 384);
nuclear@3 31 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
nuclear@4 32 glutCreateWindow("libdrawtext example: unicode");
nuclear@3 33
nuclear@3 34 glutDisplayFunc(disp);
nuclear@3 35 glutReshapeFunc(reshape);
nuclear@3 36 glutKeyboardFunc(keyb);
nuclear@3 37
nuclear@3 38 /* XXX dtx_open_font opens a font file and returns a pointer to dtx_font */
nuclear@4 39 if(!(fntmain = dtx_open_font("serif.ttf", 0))) {
nuclear@3 40 return 1;
nuclear@3 41 }
nuclear@4 42 dtx_prepare_range(fntmain, FONT_SZ, 0, 256); /* ASCII */
nuclear@4 43 dtx_prepare_range(fntmain, FONT_SZ, 0x370, 0x400); /* greek */
nuclear@4 44 dtx_prepare_range(fntmain, FONT_SZ, 0x400, 0x500); /* cyrilic */
nuclear@3 45
nuclear@4 46 if(!(fntcjk = dtx_open_font("cjk.ttf", 0))) {
nuclear@3 47 return 1;
nuclear@3 48 }
nuclear@4 49 dtx_prepare_range(fntcjk, FONT_SZ, 0x4e00, 0x9fc0); /* kanji */
nuclear@4 50
nuclear@4 51 if(!(fntklingon = dtx_open_font("klingon.ttf", 0))) {
nuclear@4 52 return 1;
nuclear@4 53 }
nuclear@4 54 dtx_prepare_range(fntklingon, FONT_SZ, 0xf8d0, 0xf900); /* klingon */
nuclear@3 55
nuclear@3 56 glutMainLoop();
nuclear@3 57 return 0;
nuclear@3 58 }
nuclear@3 59
nuclear@4 60 /* various UTF-8 strings */
nuclear@8 61 const char *english_text = "Hello world!";
nuclear@3 62 const char *greek_text = "\xce\x9a\xce\xbf\xcf\x8d\xcf\x81\xce\xb1\xcf\x83\xce\xb7";
nuclear@4 63 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 64 const char *kanji_text = "\xe4\xb9\x97\xe4\xba\xac";
nuclear@3 65 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 66
nuclear@7 67 void draw_box(struct dtx_box *box)
nuclear@7 68 {
nuclear@7 69 glBegin(GL_LINE_LOOP);
nuclear@7 70 glColor3f(0, 1, 0);
nuclear@7 71 glVertex2f(box->x, box->y);
nuclear@7 72 glVertex2f(box->x + box->width, box->y);
nuclear@7 73 glVertex2f(box->x + box->width, box->y + box->height);
nuclear@7 74 glVertex2f(box->x, box->y + box->height);
nuclear@7 75 glEnd();
nuclear@7 76 glColor3f(1, 1, 1);
nuclear@7 77 }
nuclear@3 78
nuclear@3 79 void disp(void)
nuclear@3 80 {
nuclear@3 81 glClear(GL_COLOR_BUFFER_BIT);
nuclear@3 82
nuclear@3 83 glMatrixMode(GL_MODELVIEW);
nuclear@3 84 glLoadIdentity();
nuclear@3 85
nuclear@4 86 dtx_use_font(fntmain, FONT_SZ);
nuclear@3 87
nuclear@3 88 glTranslatef(-200, 150, 0);
nuclear@3 89 /* XXX call dtx_string to draw utf-8 text.
nuclear@3 90 * any transformations and the current color apply
nuclear@3 91 */
nuclear@4 92 dtx_string(english_text);
nuclear@3 93
nuclear@3 94 glTranslatef(0, -40, 0);
nuclear@3 95 dtx_string(greek_text);
nuclear@3 96
nuclear@3 97 glTranslatef(0, -40, 0);
nuclear@4 98 dtx_string(russian_text);
nuclear@4 99
nuclear@4 100 dtx_use_font(fntcjk, FONT_SZ);
nuclear@4 101
nuclear@4 102 glTranslatef(0, -40, 0);
nuclear@3 103 dtx_string(kanji_text);
nuclear@3 104
nuclear@4 105 dtx_use_font(fntklingon, FONT_SZ);
nuclear@3 106
nuclear@3 107 glTranslatef(0, -40, 0);
nuclear@3 108 dtx_string(klingon_text);
nuclear@3 109
nuclear@3 110 glutSwapBuffers();
nuclear@3 111 }
nuclear@3 112
nuclear@3 113 void reshape(int x, int y)
nuclear@3 114 {
nuclear@3 115 glViewport(0, 0, x, y);
nuclear@3 116
nuclear@3 117 glMatrixMode(GL_PROJECTION);
nuclear@3 118 glLoadIdentity();
nuclear@3 119 glOrtho(-x/2, x/2, -y/2, y/2, -1, 1);
nuclear@3 120 }
nuclear@3 121
nuclear@3 122 void keyb(unsigned char key, int x, int y)
nuclear@3 123 {
nuclear@3 124 if(key == 27) {
nuclear@3 125 exit(0);
nuclear@3 126 }
nuclear@3 127 }