#include <GL/glut.h>                                  /* OpenGl utility toolkit    */
#include <stdlib.h>                                   /* fuer C-Library            */

GLuint listName;                                      /* Handle fuer Display-Liste */

void init (void) {
   listName = glGenLists (1);                         /* trage Namen ein           */
   glNewList (listName, GL_COMPILE);                  /* erzeuge Display-Liste     */
      glColor3f (1.0, 0.0, 0.0);                      /* Farbe rot                 */
      glBegin (GL_TRIANGLES);                         /* Beginn Dreiecks-Punkte    */
        glVertex2f (0.0, 0.0);                        /* Knoten links unten        */
        glVertex2f (1.0, 0.0);                        /* Knoten rechts unten       */
        glVertex2f (0.0, 1.0);                        /* Knoten links oben         */
      glEnd ();                                       /* Ende der Dreiecksliste    */
      glTranslatef (1.5, 0.0, 0.0);                   /* Verschiebe nach rechts    */
   glEndList ();                                      /* Ende der Display-Liste    */
   glShadeModel (GL_FLAT);                            /* verwende Flat-Shading     */
}

void reshape(int w, int h) {                          /* Reshape-Routine           */
   GLfloat p = (GLfloat) w / (GLfloat) h;             /* Fensterverhaeltnis        */
   glViewport(0, 0, w, h);                            /* setze Viewport            */
   glMatrixMode(GL_PROJECTION); glLoadIdentity();     /* ab jetzt Projektion       */
   if (p > 1 ) gluOrtho2D (0.0, 2.0*p, -0.5, 1.5);    /* links,rechts, unten, oben */
         else  gluOrtho2D (0.0, 2.0, -0.5/p, 1.5/p);  /* links,rechts, unten, oben */ 
   glMatrixMode(GL_MODELVIEW); glLoadIdentity();      /* ab jetzt Modelview-Matrix */
}

void display(void) {                                  /* Anzeige-Routine           */
   GLuint i;                                          /* Integer-Variable          */
   glClear (GL_COLOR_BUFFER_BIT);                     /* reset Farb-Puffer         */
   for (i=0; i<10; i++) glCallList(listName);         /* rufe Display-Liste auf    */
   glBegin (GL_LINES);                                /* Beginn Linien-Punkte      */
     glVertex2f (0.0,0.5);                            /* ein Knoten                */
     glVertex2f(15.0,0.5);                            /* noch ein Knoten           */
   glEnd ();                                          /* Ende Linen-Punkte         */
   glFlush ();                                        /* direkt ausgeben           */
}

int main (int argc, char ** argv) {                   /* Hauptprogramm             */
  glutInit(&argc, argv);                              /* initialisiere GLUT        */
  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);          /* single buffer, true color */
  glutInitWindowSize(800, 100);                       /* initiale Fenstergroesse   */
  glutInitWindowPosition(0,0);                        /* initiale Fensterposition  */
  glutCreateWindow("list");                           /* Fenster mit Aufschrift    */
  init();                                             /* rufe init auf             */
  glutDisplayFunc(display);                           /* registriere display       */
  glutReshapeFunc(reshape);                           /* registriere reshape       */
  glutMainLoop(); return 0;                           /* beginne Event-Schleife    */
}