06477c1d0f3817425e7d37ddbc959444513bd9b8
[censuslogo] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <GL/glut.h>
5 #include "logo.h"
6
7 #define BEZ_SEG 16
8
9 int init(void);
10 void display(void);
11 void reshape(int x, int y);
12 void keyb(unsigned char key, int x, int y);
13
14 void draw_bezier(float *cp, int sub);
15
16 int main(int argc, char **argv)
17 {
18         glutInit(&argc, argv);
19         glutInitWindowSize(800, 600);
20         glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
21         glutCreateWindow("census");
22
23         glutDisplayFunc(display);
24         glutReshapeFunc(reshape);
25         glutKeyboardFunc(keyb);
26
27         if(init() == -1) {
28                 return 1;
29         }
30
31         glutMainLoop();
32         return 0;
33 }
34
35 int init(void)
36 {
37         glEnable(GL_LINE_SMOOTH);
38         return 0;
39 }
40
41 void display(void)
42 {
43         int i, nseg;
44
45         glClear(GL_COLOR_BUFFER_BIT);
46
47         glEnable(GL_BLEND);
48         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
49         glLineWidth(2.0);
50
51         glColor3f(1, 1, 1);
52         nseg = LOGOCP_SIZE / 4;
53         for(i=0; i<nseg; i++) {
54                 draw_bezier((float*)(logocp + i * 4), BEZ_SEG);
55         }
56
57         glDisable(GL_BLEND);
58
59         glutSwapBuffers();
60         assert(glGetError() == GL_NO_ERROR);
61 }
62
63 void reshape(int x, int y)
64 {
65         float aspect = (float)x / (float)y;
66
67         glViewport(0, 0, x, y);
68         glMatrixMode(GL_PROJECTION);
69         glLoadIdentity();
70         glScalef(1.0f / aspect, 1.0f, 1.0f);
71 }
72
73 void keyb(unsigned char key, int x, int y)
74 {
75         switch(key) {
76         case 27:
77                 exit(0);
78         }
79 }
80
81 #define LERP(a, b, t)   ((a) + ((b) - (a)) * (t))
82
83 void draw_bezier(float *cp, int sub)
84 {
85         int i;
86         float cx[4], cy[4], mx[3], my[3], mmx[2], mmy[2], x, y;
87
88         if(sub < 1) sub = 1;
89
90         for(i=0; i<4; i++) {
91                 cx[i] = cp[i * 2] / LOGO_W - 0.5f;
92                 cy[i] = 0.5f - cp[i * 2 + 1] / LOGO_H;
93         }
94
95         glBegin(GL_LINE_STRIP);
96         for(i=0; i<BEZ_SEG; i++) {
97                 float t = (float)i / (float)(BEZ_SEG - 1);
98
99                 mx[0] = LERP(cx[0], cx[1], t);
100                 my[0] = LERP(cy[0], cy[1], t);
101
102                 mx[1] = LERP(cx[1], cx[2], t);
103                 my[1] = LERP(cy[1], cy[2], t);
104
105                 mx[2] = LERP(cx[2], cx[3], t);
106                 my[2] = LERP(cy[2], cy[3], t);
107
108                 mmx[0] = LERP(mx[0], mx[1], t);
109                 mmy[0] = LERP(my[0], my[1], t);
110
111                 mmx[1] = LERP(mx[1], mx[2], t);
112                 mmy[1] = LERP(my[1], my[2], t);
113
114                 x = LERP(mmx[0], mmx[1], t);
115                 y = LERP(mmy[0], mmy[1], t);
116
117                 glVertex2f(x, y);
118         }
119         glEnd();
120 }