132001f49Smrg/*
232001f49Smrg * Copyright © 2008 Intel Corporation
332001f49Smrg *
432001f49Smrg * Permission is hereby granted, free of charge, to any person obtaining a
532001f49Smrg * copy of this software and associated documentation files (the "Software"),
632001f49Smrg * to deal in the Software without restriction, including without limitation
732001f49Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
832001f49Smrg * and/or sell copies of the Software, and to permit persons to whom the
932001f49Smrg * Software is furnished to do so, subject to the following conditions:
1032001f49Smrg *
1132001f49Smrg * The above copyright notice and this permission notice (including the next
1232001f49Smrg * paragraph) shall be included in all copies or substantial portions of the
1332001f49Smrg * Software.
1432001f49Smrg *
1532001f49Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1632001f49Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1732001f49Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1832001f49Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1932001f49Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2032001f49Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2132001f49Smrg * IN THE SOFTWARE.
2232001f49Smrg *
2332001f49Smrg * Authors:
2432001f49Smrg *    Eric Anholt <eric@anholt.net>
2532001f49Smrg *
2632001f49Smrg */
2732001f49Smrg
2832001f49Smrg#include <stdlib.h>
2932001f49Smrg#include <GL/glew.h>
3032001f49Smrg#include "glut_wrap.h"
3132001f49Smrg
3232001f49Smrgstatic int win_width, win_height;
3332001f49Smrg
3432001f49Smrgstatic void
3532001f49Smrgline(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
3632001f49Smrg{
3732001f49Smrg	glBegin(GL_LINES);
3832001f49Smrg	glVertex2f(x1, y1);
3932001f49Smrg	glVertex2f(x2, y2);
4032001f49Smrg	glEnd();
4132001f49Smrg}
4232001f49Smrg
4332001f49Smrgstatic void
4432001f49Smrgline3(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2)
4532001f49Smrg{
4632001f49Smrg	glBegin(GL_LINES);
4732001f49Smrg	glVertex3f(x1, y1, z1);
4832001f49Smrg	glVertex3f(x2, y2, z2);
4932001f49Smrg	glEnd();
5032001f49Smrg}
5132001f49Smrg
5232001f49Smrgstatic void
5332001f49Smrgdisplay(void)
5432001f49Smrg{
5532001f49Smrg	glClearColor(0.0, 0.0, 0.0, 0.0);
5632001f49Smrg	glClear(GL_COLOR_BUFFER_BIT);
5732001f49Smrg
5832001f49Smrg	glColor3f(1.0, 0.0, 0.0);
5932001f49Smrg	/* 2 lines clipped along xmin */
6032001f49Smrg	line(-20, win_height / 2 - 20,
6132001f49Smrg	      20, win_height / 2 - 20);
6232001f49Smrg	line( 20, win_height / 2 + 20,
6332001f49Smrg	     -20, win_height / 2 + 20);
6432001f49Smrg
6532001f49Smrg	glColor3f(0.0, 1.0, 0.0);
6632001f49Smrg	/* 2 lines clipped along ymax */
6732001f49Smrg	line(win_width / 2 - 20, win_height + 20,
6832001f49Smrg	     win_width / 2 - 20, win_height - 20);
6932001f49Smrg	line(win_width / 2 + 20, win_height - 20,
7032001f49Smrg	     win_width / 2 + 20, win_height + 20);
7132001f49Smrg
7232001f49Smrg	glColor3f(0.0, 0.0, 1.0);
7332001f49Smrg	/* 2 lines clipped along xmax */
7432001f49Smrg	line(win_width - 20, win_height / 2 - 20,
7532001f49Smrg	     win_width + 20, win_height / 2 - 20);
7632001f49Smrg	line(win_width + 20, win_height / 2 + 20,
7732001f49Smrg	     win_width - 20, win_height / 2 + 20);
7832001f49Smrg
7932001f49Smrg	glColor3f(1.0, 1.0, 1.0);
8032001f49Smrg	/* 2 lines clipped along ymin */
8132001f49Smrg	line(win_width / 2 - 20,  20,
8232001f49Smrg	     win_width / 2 - 20, -20);
8332001f49Smrg	line(win_width / 2 + 20, -20,
8432001f49Smrg	     win_width / 2 + 20,  20);
8532001f49Smrg
8632001f49Smrg	/* 2 lines clipped along near */
8732001f49Smrg	glColor3f(1.0, 0.0, 1.0);
8832001f49Smrg	line3(win_width / 2 - 20 - 20, win_height / 2,       0.5,
8932001f49Smrg	      win_width / 2 - 20 + 20, win_height / 2,      -0.5);
9032001f49Smrg	line3(win_width / 2 - 20,      win_height / 2 - 20, -0.5,
9132001f49Smrg	      win_width / 2 - 20,      win_height / 2 + 20,  0.5);
9232001f49Smrg
9332001f49Smrg	/* 2 lines clipped along far */
9432001f49Smrg	glColor3f(0.0, 1.0, 1.0);
9532001f49Smrg	line3(win_width / 2 + 20 - 20, win_height / 2,      1.5,
9632001f49Smrg	      win_width / 2 + 20 + 20, win_height / 2,      0.5);
9732001f49Smrg	line3(win_width / 2 + 20,      win_height / 2 - 20, 0.5,
9832001f49Smrg	      win_width / 2 + 20,      win_height / 2 + 20, 1.5);
9932001f49Smrg
10032001f49Smrg	/* entirely clipped along near/far */
10132001f49Smrg	glColor3f(.5, .5, .5);
10232001f49Smrg	line3(win_width / 2, win_height / 2 - 20, -0.5,
10332001f49Smrg	      win_width / 2, win_height / 2 + 20, -0.5);
10432001f49Smrg	glColor3f(.5, .5, .5);
10532001f49Smrg	line3(win_width / 2, win_height / 2 - 20, 1.5,
10632001f49Smrg	      win_width / 2, win_height / 2 + 20, 1.5);
10732001f49Smrg
10832001f49Smrg	glColor3f(1.0, 1.0, 0.0);
10932001f49Smrg	/* lines clipped along both x and y limits */
11032001f49Smrg	line(-5, 20,
11132001f49Smrg	     20, -5); /* xmin, ymin */
11232001f49Smrg	line(-5, win_height - 20,
11332001f49Smrg	     20, win_height + 5); /* xmin, ymax */
11432001f49Smrg	line(win_width - 20, -5,
11532001f49Smrg	     win_width + 5,  20); /* xmax, ymin */
11632001f49Smrg	line(win_width - 20, win_height + 5,
11732001f49Smrg	     win_width + 5,  win_height - 20); /* xmax, ymax */
11832001f49Smrg
11932001f49Smrg	glutSwapBuffers();
12032001f49Smrg}
12132001f49Smrg
12232001f49Smrgstatic void
12332001f49Smrgreshape(int width, int height)
12432001f49Smrg{
12532001f49Smrg	win_width = width;
12632001f49Smrg	win_height = height;
12732001f49Smrg	glViewport(0, 0, width, height);
12832001f49Smrg
12932001f49Smrg	glMatrixMode(GL_PROJECTION);
13032001f49Smrg	glLoadIdentity();
13132001f49Smrg	glOrtho(0, win_width, 0, win_height, 0.0, -1.0);
13232001f49Smrg
13332001f49Smrg	glMatrixMode(GL_MODELVIEW);
13432001f49Smrg	glLoadIdentity();
13532001f49Smrg	glTranslatef(.25, .25, 0);
13632001f49Smrg}
13732001f49Smrg
13832001f49Smrgstatic void key( unsigned char key, int x, int y )
13932001f49Smrg{
14032001f49Smrg	(void) x;
14132001f49Smrg	(void) y;
14232001f49Smrg
14332001f49Smrg	switch (key) {
14432001f49Smrg	case 27: /* esc */
14532001f49Smrg		exit(0);
14632001f49Smrg		break;
14732001f49Smrg	}
14832001f49Smrg
14932001f49Smrg	glutPostRedisplay();
15032001f49Smrg}
15132001f49Smrg
15232001f49Smrgstatic void
15332001f49Smrginit(void)
15432001f49Smrg{
15532001f49Smrg}
15632001f49Smrg
15732001f49Smrgint
15832001f49Smrgmain(int argc, char *argv[])
15932001f49Smrg{
16032001f49Smrg	win_width = 200;
16132001f49Smrg	win_height = 200;
16232001f49Smrg
16332001f49Smrg	glutInit(&argc, argv);
16432001f49Smrg	glutInitWindowPosition(0, 0);
16532001f49Smrg	glutInitWindowSize(win_width, win_height);
16632001f49Smrg	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
16732001f49Smrg	glutCreateWindow(argv[0]);
16832001f49Smrg        glewInit();
16932001f49Smrg	glutReshapeFunc(reshape);
17032001f49Smrg	glutKeyboardFunc(key);
17132001f49Smrg	glutDisplayFunc(display);
17232001f49Smrg
17332001f49Smrg	init();
17432001f49Smrg
17532001f49Smrg	glutMainLoop();
17632001f49Smrg	return 0;
17732001f49Smrg}
178