wt_draw
[windtk] / example.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <GL/glut.h>
4 #include "windtk.h"
5
6 static void display(void);
7 static void reshape(int x, int y);
8 static void keypress(unsigned char key, int x, int y);
9 static void keyrelease(unsigned char key, int x, int y);
10 static void mouse(int bn, int st, int x, int y);
11 static void motion(int x, int y);
12
13 static int gfx_newcol(int r, int g, int b);
14 static void gfx_color(int c);
15 static void gfx_fillrect(struct wt_rect *r);
16 static void gfx_line(int x0, int y0, int x1, int y1);
17
18 static struct wt_graphics gfx = {
19         gfx_newcol, gfx_color,
20         gfx_fillrect,
21         gfx_line
22 };
23
24 int main(int argc, char **argv)
25 {
26         glutInit(&argc, argv);
27         glutInitWindowSize(800, 600);
28         glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
29         glutCreateWindow("windtk example");
30
31         glutDisplayFunc(display);
32         glutReshapeFunc(reshape);
33         glutKeyboardFunc(keypress);
34         glutKeyboardUpFunc(keyrelease);
35         glutMouseFunc(mouse);
36         glutMotionFunc(motion);
37         glutPassiveMotionFunc(motion);
38
39         if(wt_init(800, 600, &gfx)) {
40                 return 1;
41         }
42         wt_window(0, "foo", WT_WS_DEFAULT, 10, 10, 200, 200);
43
44         glutMainLoop();
45         return 0;
46 }
47
48 static void display(void)
49 {
50         glClear(GL_COLOR_BUFFER_BIT);
51
52         wt_draw();
53
54         glutSwapBuffers();
55 }
56
57 static void reshape(int x, int y)
58 {
59         glViewport(0, 0, x, y);
60         glMatrixMode(GL_PROJECTION);
61         glLoadIdentity();
62         glOrtho(0, x, y, 0, -1, 1);
63
64         wt_viewport(0, 0, x, y);
65 }
66
67 static void keypress(unsigned char key, int x, int y)
68 {
69         if(key == 27) exit(0);
70
71         wt_inp_key(key, 1);
72 }
73
74 static void keyrelease(unsigned char key, int x, int y)
75 {
76         wt_inp_key(key, 0);
77 }
78
79 static void mouse(int bn, int st, int x, int y)
80 {
81         wt_inp_mouse(bn - GLUT_LEFT_BUTTON, st == GLUT_DOWN, x, y);
82 }
83
84 static void motion(int x, int y)
85 {
86         wt_inp_motion(x, y);
87 }
88
89 /* ------ graphics callbacks -------- */
90 static float colors[32][3];
91 static int maxcol;
92
93 static int gfx_newcol(int r, int g, int b)
94 {
95         if(maxcol >= 32) return -1;
96         colors[maxcol][0] = r / 255.0f;
97         colors[maxcol][1] = g / 255.0f;
98         colors[maxcol][2] = b / 255.0f;
99         return maxcol++;
100 }
101
102 static void gfx_color(int c)
103 {
104         glColor3fv(colors[c]);
105 }
106
107 static void gfx_fillrect(struct wt_rect *r)
108 {
109         glBegin(GL_QUADS);
110         glVertex2f(r->x, r->y);
111         glVertex2f(r->x + r->width, r->y);
112         glVertex2f(r->x + r->width, r->y + r->height);
113         glVertex2f(r->x, r->y + r->height);
114         glEnd();
115 }
116
117 static void gfx_line(int x0, int y0, int x1, int y1)
118 {
119         glBegin(GL_LINES);
120         glVertex2f(x0, y0);
121         glVertex2f(x1, y1);
122         glEnd();
123 }