+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <GL/glut.h>
+#include "logo.h"
+
+#define BEZ_SEG 16
+
+int init(void);
+void display(void);
+void reshape(int x, int y);
+void keyb(unsigned char key, int x, int y);
+
+void draw_bezier(float *cp, int sub);
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+ glutInitWindowSize(800, 600);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+ glutCreateWindow("census");
+
+ glutDisplayFunc(display);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(keyb);
+
+ if(init() == -1) {
+ return 1;
+ }
+
+ glutMainLoop();
+ return 0;
+}
+
+int init(void)
+{
+ glEnable(GL_LINE_SMOOTH);
+ return 0;
+}
+
+void display(void)
+{
+ int i, nseg;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glLineWidth(2.0);
+
+ glColor3f(1, 1, 1);
+ nseg = LOGOCP_SIZE / 4;
+ for(i=0; i<nseg; i++) {
+ draw_bezier((float*)(logocp + i * 4), BEZ_SEG);
+ }
+
+ glDisable(GL_BLEND);
+
+ glutSwapBuffers();
+ assert(glGetError() == GL_NO_ERROR);
+}
+
+void reshape(int x, int y)
+{
+ float aspect = (float)x / (float)y;
+
+ glViewport(0, 0, x, y);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glScalef(1.0f / aspect, 1.0f, 1.0f);
+}
+
+void keyb(unsigned char key, int x, int y)
+{
+ switch(key) {
+ case 27:
+ exit(0);
+ }
+}
+
+#define LERP(a, b, t) ((a) + ((b) - (a)) * (t))
+
+void draw_bezier(float *cp, int sub)
+{
+ int i;
+ float cx[4], cy[4], mx[3], my[3], mmx[2], mmy[2], x, y;
+
+ if(sub < 1) sub = 1;
+
+ for(i=0; i<4; i++) {
+ cx[i] = cp[i * 2] / LOGO_W - 0.5f;
+ cy[i] = 0.5f - cp[i * 2 + 1] / LOGO_H;
+ }
+
+ glBegin(GL_LINE_STRIP);
+ for(i=0; i<BEZ_SEG; i++) {
+ float t = (float)i / (float)(BEZ_SEG - 1);
+
+ mx[0] = LERP(cx[0], cx[1], t);
+ my[0] = LERP(cy[0], cy[1], t);
+
+ mx[1] = LERP(cx[1], cx[2], t);
+ my[1] = LERP(cy[1], cy[2], t);
+
+ mx[2] = LERP(cx[2], cx[3], t);
+ my[2] = LERP(cy[2], cy[3], t);
+
+ mmx[0] = LERP(mx[0], mx[1], t);
+ mmy[0] = LERP(my[0], my[1], t);
+
+ mmx[1] = LERP(mx[1], mx[2], t);
+ mmy[1] = LERP(my[1], my[2], t);
+
+ x = LERP(mmx[0], mmx[1], t);
+ y = LERP(mmy[0], mmy[1], t);
+
+ glVertex2f(x, y);
+ }
+ glEnd();
+}