diff options
| -rw-r--r-- | progs/trivial/Makefile | 1 | ||||
| -rw-r--r-- | progs/trivial/line-smooth.c | 172 | 
2 files changed, 173 insertions, 0 deletions
diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index d19abe7e86..8bc6ad4e38 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -25,6 +25,7 @@ SOURCES = \  	fs-tri.c \  	line-clip.c \  	line-cull.c \ +	line-smooth.c \  	line-stipple-wide.c \  	line-userclip-clip.c \  	line-userclip-nop-clip.c \ diff --git a/progs/trivial/line-smooth.c b/progs/trivial/line-smooth.c new file mode 100644 index 0000000000..f030de9b9f --- /dev/null +++ b/progs/trivial/line-smooth.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <math.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLboolean smooth = GL_TRUE; +GLfloat width = 1.0; + + +static void Init(void) +{ +   float range[2], aarange[2]; +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); +   glGetFloatv(GL_LINE_WIDTH_RANGE, aarange); +   glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range); +   printf("Non-AA line width range: %f .. %f\n", range[0], range[1]); +   printf("AA line width range: %f .. %f\n", aarange[0], aarange[1]); +} + + +static void Reshape(int width, int height) +{ +   glViewport(0, 0, (GLint)width, (GLint)height); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0, 0, -30); +} + +static void Key(unsigned char key, int x, int y) +{ +   switch (key) { +   case 'w': +      width -= 0.5; +      if (width < 0.5) +         width = 0.5; +      break; +   case 'W': +      width += 0.5; +      break; +   case 's': +      smooth = !smooth; +      break; +   case 27: +      exit(1); +   default: +      return; +   } +   printf("LineWidth: %g\n", width); +   glutPostRedisplay(); +} + + +static void Draw(void) +{ +   float a; + +   glClear(GL_COLOR_BUFFER_BIT);  + +   glLineWidth(width); + +   if (smooth) { +      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +      glEnable(GL_BLEND); +      glEnable(GL_LINE_SMOOTH); +   } + +   glColor3f(1, 1, 1); + +   glBegin(GL_LINES); +   for (a = 0; a < 3.14159; a += 0.2) { +      float x = .9 * cos(a); +      float y = .9 * sin(a); + +      glVertex2f(-x, -y); +      glVertex2f( x,  y); +   } +   glEnd(); + +   glDisable(GL_LINE_SMOOTH); +   glDisable(GL_BLEND); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +   GLint i; + +   doubleBuffer = GL_FALSE; + +   for (i = 1; i < argc; i++) { +      if (strcmp(argv[i], "-sb") == 0) { +         doubleBuffer = GL_FALSE; +      } else if (strcmp(argv[i], "-db") == 0) { +         doubleBuffer = GL_TRUE; +      } else { +         fprintf(stderr, "%s (Bad option).\n", argv[i]); +         return GL_FALSE; +      } +   } +   return GL_TRUE; +} + + +int main(int argc, char **argv) +{ +   GLenum type; + +   glutInit(&argc, argv); + +   if (Args(argc, argv) == GL_FALSE) { +      exit(1); +   } + +   glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +   type = GLUT_RGB; +   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +   glutInitDisplayMode(type); + +   if (glutCreateWindow(argv[0]) == GL_FALSE) { +      exit(1); +   } + +   Init(); + +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutDisplayFunc(Draw); +   glutMainLoop(); +   return 0; +}  | 
