diff options
Diffstat (limited to 'progs')
| -rw-r--r-- | progs/fp/SConscript | 19 | ||||
| -rw-r--r-- | progs/fp/fp-tri.c | 2 | ||||
| -rw-r--r-- | progs/fp/point-position.c | 7 | ||||
| -rw-r--r-- | progs/fp/tri-depth.c | 9 | ||||
| -rw-r--r-- | progs/fp/tri-depth2.c | 7 | ||||
| -rw-r--r-- | progs/fp/tri-depthwrite.c | 6 | ||||
| -rw-r--r-- | progs/fp/tri-depthwrite2.c | 6 | ||||
| -rw-r--r-- | progs/fp/tri-inv.c | 6 | ||||
| -rw-r--r-- | progs/fp/tri-param.c | 8 | ||||
| -rw-r--r-- | progs/fp/tri-tex.c | 6 | ||||
| -rw-r--r-- | progs/tests/.gitignore | 2 | ||||
| -rw-r--r-- | progs/tests/Makefile | 5 | ||||
| -rw-r--r-- | progs/tests/SConscript | 2 | ||||
| -rw-r--r-- | progs/tests/getteximage.c | 217 | ||||
| -rw-r--r-- | progs/tests/scissor-viewport.c | 138 | ||||
| -rw-r--r-- | progs/tests/scissor.c | 168 | 
16 files changed, 581 insertions, 27 deletions
| diff --git a/progs/fp/SConscript b/progs/fp/SConscript index 553799758b..a78318542c 100644 --- a/progs/fp/SConscript +++ b/progs/fp/SConscript @@ -11,7 +11,20 @@ env.Prepend(CPPPATH = [  env.Prepend(LIBS = ['$GLUT_LIB']) -env.Program( -        target = 'fp-tri', -        source = ['fp-tri.c'], +progs = [ +    'fp-tri', +    'tri-depth', +    'tri-depth2', +    'tri-depthwrite', +    'tri-depthwrite2', +    'tri-inv', +    'tri-param', +    'tri-tex', +    'point-position', +] + +for prog in progs: +    env.Program( +        target = prog, +        source = [prog + '.c'],      ) diff --git a/progs/fp/fp-tri.c b/progs/fp/fp-tri.c index 6c15540d38..52a8fcfc22 100644 --- a/progs/fp/fp-tri.c +++ b/progs/fp/fp-tri.c @@ -89,7 +89,7 @@ static void Init( void )     }     fprintf(stderr, "%.*s\n", sz, buf); -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } diff --git a/progs/fp/point-position.c b/progs/fp/point-position.c index c352a939cb..c0963d7a0b 100644 --- a/progs/fp/point-position.c +++ b/progs/fp/point-position.c @@ -2,9 +2,8 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> -#include "GL/gl.h" @@ -17,7 +16,7 @@ static void Init( void )        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -109,6 +108,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-depth.c b/progs/fp/tri-depth.c index a1f0579c8e..5488469e80 100644 --- a/progs/fp/tri-depth.c +++ b/progs/fp/tri-depth.c @@ -2,9 +2,8 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> -#include "GL/gl.h" @@ -19,7 +18,7 @@ static void Init( void )        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -89,8 +88,6 @@ int main(int argc, char **argv)      glutInit(&argc, argv); - -      glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250);      type = GLUT_RGB; @@ -101,6 +98,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-depth2.c b/progs/fp/tri-depth2.c index f309628283..6ed2307115 100644 --- a/progs/fp/tri-depth2.c +++ b/progs/fp/tri-depth2.c @@ -2,9 +2,8 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> -#include "GL/gl.h" @@ -21,7 +20,7 @@ static void Init( void )        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -106,6 +105,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-depthwrite.c b/progs/fp/tri-depthwrite.c index fedeec4577..8e4f3e6245 100644 --- a/progs/fp/tri-depthwrite.c +++ b/progs/fp/tri-depthwrite.c @@ -2,7 +2,7 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> @@ -16,7 +16,7 @@ static void Init(void)        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -97,6 +97,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-depthwrite2.c b/progs/fp/tri-depthwrite2.c index 5547092ec9..3c0b4d30c9 100644 --- a/progs/fp/tri-depthwrite2.c +++ b/progs/fp/tri-depthwrite2.c @@ -2,7 +2,7 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> @@ -16,7 +16,7 @@ static void Init(void)        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -97,6 +97,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-inv.c b/progs/fp/tri-inv.c index e902332386..7e8d8c5ce2 100644 --- a/progs/fp/tri-inv.c +++ b/progs/fp/tri-inv.c @@ -2,7 +2,7 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> @@ -17,7 +17,7 @@ static void Init( void )        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -99,6 +99,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-param.c b/progs/fp/tri-param.c index f3e55af3f1..57443d71bd 100644 --- a/progs/fp/tri-param.c +++ b/progs/fp/tri-param.c @@ -2,9 +2,9 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h> -#include "GL/gl.h" +  static void Init( void )  { @@ -15,7 +15,7 @@ static void Init( void )        ;     GLuint modulateProg; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -104,6 +104,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/fp/tri-tex.c b/progs/fp/tri-tex.c index 87f63894ce..1dbbb201ce 100644 --- a/progs/fp/tri-tex.c +++ b/progs/fp/tri-tex.c @@ -3,7 +3,7 @@  #include <stdio.h>  #include <string.h>  #include <stdlib.h> -#define GL_GLEXT_PROTOTYPES +#include <GL/glew.h>  #include <GL/glut.h>  #include "readtex.c" @@ -23,7 +23,7 @@ static void Init( void )     GLuint modulateProg;     GLuint Texture; -   if (!glutExtensionSupported("GL_ARB_fragment_program")) { +   if (!GLEW_ARB_fragment_program) {        printf("Error: GL_ARB_fragment_program not supported!\n");        exit(1);     } @@ -120,6 +120,8 @@ int main(int argc, char **argv)  	exit(1);      } +    glewInit(); +      Init();      glutReshapeFunc(Reshape); diff --git a/progs/tests/.gitignore b/progs/tests/.gitignore index 959ddcc51f..d6a8538767 100644 --- a/progs/tests/.gitignore +++ b/progs/tests/.gitignore @@ -62,6 +62,8 @@ readrate  readtex.c  readtex.h  rubberband +scissor +scissor-viewport  seccolor  shader_api  shaderutil.c diff --git a/progs/tests/Makefile b/progs/tests/Makefile index 628ca41535..5069817be3 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -48,7 +48,8 @@ SOURCES = \  	fptest1.c \  	fptexture.c \  	getprocaddress.c \ -	glutfx \ +	getteximage.c \ +	glutfx.c \  	interleave.c \  	invert.c \  	jkrahntest.c \ @@ -70,6 +71,8 @@ SOURCES = \  	random.c \  	readrate.c \  	rubberband.c \ +	scissor.c \ +	scissor-viewport.c \  	seccolor.c \  	shader_api.c \  	sharedtex.c \ diff --git a/progs/tests/SConscript b/progs/tests/SConscript index 453fcecd9c..9d89ff6a0d 100644 --- a/progs/tests/SConscript +++ b/progs/tests/SConscript @@ -95,6 +95,8 @@ progs = [      'random',      'readrate',      'rubberband', +    'scissor', +    'scissor-viewport',      'seccolor',      'shader_api',      'stencil_twoside', diff --git a/progs/tests/getteximage.c b/progs/tests/getteximage.c new file mode 100644 index 0000000000..e4818a8fab --- /dev/null +++ b/progs/tests/getteximage.c @@ -0,0 +1,217 @@ +/** + * Test glGetTexImage() + * Brian Paul + * 9 June 2009 + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glew.h> +#include <GL/glut.h> + +static int Win; + + +static void +TestGetTexImage(void) +{ +   GLuint iter; +   GLubyte *data = (GLubyte *) malloc(1024 * 1024 * 4); +   GLubyte *data2 = (GLubyte *) malloc(1024 * 1024 * 4); + +   glEnable(GL_TEXTURE_2D); + +   printf("glTexImage2D + glGetTexImage:\n"); + +   for (iter = 0; iter < 8; iter++) { +      GLint p = (iter % 8) + 3; +      GLint w = (1 << p); +      GLint h = (1 << p); +      GLuint i; +      GLint level = 0; + +      printf("  Testing %d x %d tex image\n", w, h); + +      /* fill data */ +      for (i = 0; i < w * h * 4; i++) { +         data[i] = i & 0xff; +         data2[i] = 0; +      } + +      glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w, h, 0, +                   GL_RGBA, GL_UNSIGNED_BYTE, data); + +      glBegin(GL_POINTS); +      glVertex2f(0, 0); +      glEnd(); + +      /* get */ +      glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2); + +      /* compare */ +      for (i = 0; i < w * h * 4; i++) { +         if (data2[i] != data[i]) { +            printf("glTexImage + glGetTexImage failure!\n"); +            printf("Expected value %d, found %d\n", data[i], data2[i]); +            abort(); +         } +      } +   } + +   printf("Passed\n"); +   glDisable(GL_TEXTURE_2D); +   free(data); +   free(data2); +} + + +static GLboolean +ColorsEqual(const GLubyte ref[4], const GLubyte act[4]) +{ +   if (abs((int) ref[0] - (int) act[0]) > 1 || +       abs((int) ref[1] - (int) act[1]) > 1 || +       abs((int) ref[2] - (int) act[2]) > 1 || +       abs((int) ref[3] - (int) act[3]) > 1) { +      printf("expected %d %d %d %d\n", ref[0], ref[1], ref[2], ref[3]); +      printf("found    %d %d %d %d\n", act[0], act[1], act[2], act[3]); +      return GL_FALSE; +   } +   return GL_TRUE; +} + + +static void +TestGetTexImageRTT(void) +{ +   GLuint iter; +   GLuint fb, tex; +   GLint w = 512; +   GLint h = 256; +   GLint level = 0; +    +   glGenTextures(1, &tex); +   glGenFramebuffersEXT(1, &fb); + +   glBindTexture(GL_TEXTURE_2D, tex); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); +   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, +                GL_RGBA, GL_UNSIGNED_BYTE, NULL); + +   glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb); +   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, +                             GL_TEXTURE_2D, tex, level); + +   printf("Render to texture + glGetTexImage:\n"); +   printf("  Testing %d x %d tex image\n", w, h); +   for (iter = 0; iter < 8; iter++) { +      GLubyte color[4]; +      GLubyte *data2 = (GLubyte *) malloc(w * h * 4); +      GLuint i; + +      /* random clear color */ +      for (i = 0; i < 4; i++) { +         color[i] = rand() % 256; +      } + +      glClearColor(color[0] / 255.0, +                   color[1] / 255.0, +                   color[2] / 255.0, +                   color[3] / 255.0); + +      glClear(GL_COLOR_BUFFER_BIT); + +      /* get */ +      glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2); + +      /* compare */ +      for (i = 0; i < w * h; i += 4) { +         if (!ColorsEqual(color, data2 + i * 4)) { +            printf("Render to texture failure!\n"); +            abort(); +         } +      } + +      free(data2); +   } + +   glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); +   glDeleteFramebuffersEXT(1, &fb); +   glDeleteTextures(1, &tex); + +   printf("Passed\n"); +} + + + + +static void +Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +   TestGetTexImage(); + +   if (glutExtensionSupported("GL_EXT_framebuffer_object") || +       glutExtensionSupported("GL_ARB_framebuffer_object")) +      TestGetTexImageRTT(); + +   glutDestroyWindow(Win); +   exit(0); + +   glutSwapBuffers(); +} + + +static void +Reshape(int width, int height) +{ +   glViewport(0, 0, width, height); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0.0, 0.0, -15.0); +} + + +static void +Key(unsigned char key, int x, int y) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 27: +         glutDestroyWindow(Win); +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void +Init(void) +{ +} + + +int +main(int argc, char *argv[]) +{ +   glutInit(&argc, argv); +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(400, 400); +   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); +   Win = glutCreateWindow(argv[0]); +   glewInit(); +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutDisplayFunc(Draw); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/scissor-viewport.c b/progs/tests/scissor-viewport.c new file mode 100644 index 0000000000..582e65fb72 --- /dev/null +++ b/progs/tests/scissor-viewport.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * Copyright (c) 2009 VMware, 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 <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + +struct program +{ +   unsigned width; +   unsigned height; +   int i; +}; + +struct program prog; + +static void init(void) +{ +   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)); +   fflush(stderr); + +   prog.i = 0; +} + +static void reshape(int width, int height) +{ +   glViewport(0, 0, 100, 100); + +   prog.width = width; +   prog.height = height; + +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +   glMatrixMode(GL_MODELVIEW); +} + +static void key(unsigned char key, int x, int y) +{ + +   switch (key) { +   case 27: +      exit(1); +   default: +      glutPostRedisplay(); +      return; +   } +} + +static void drawQuad(void) +{ +   glBegin(GL_QUADS); +   glVertex2d(-1.0, -1.0); +   glVertex2d( 1.0, -1.0); +   glVertex2d( 1.0,  1.0); +   glVertex2d(-1.0,  1.0); +   glEnd(); +} + +static void draw(void) +{ +   int i; + +   glClearColor(0.0, 0.0, 1.0, 0.0); +   glClear(GL_COLOR_BUFFER_BIT); + +   i = prog.i++; +   if (prog.i >= 3) +      prog.i = 0; + +   glEnable(GL_SCISSOR_TEST); + +   { +      glColor4d(1.0, 0.0, 0.0, 1.0); + +      glScissor(i, i, 10 - 2*i, 10 - 2*i); +      drawQuad(); +   } + +   glDisable(GL_SCISSOR_TEST); + +   //glutSwapBuffers(); +   glFlush(); +} + +int main(int argc, char **argv) +{ +   GLenum type; + +   glutInit(&argc, argv); + +   prog.width = 200; +   prog.height = 200; + +   glutInitWindowPosition(100, 0); +   glutInitWindowSize(prog.width, prog.height); + +   //type = GLUT_RGB | GLUT_DOUBLE; +   type = GLUT_RGB | GLUT_SINGLE; +   glutInitDisplayMode(type); + +   if (glutCreateWindow(*argv) == GL_FALSE) { +      exit(1); +   } + +   init(); + +   glutReshapeFunc(reshape); +   glutKeyboardFunc(key); +   glutDisplayFunc(draw); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/scissor.c b/progs/tests/scissor.c new file mode 100644 index 0000000000..2dfd2174e8 --- /dev/null +++ b/progs/tests/scissor.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * Copyright (c) 2009 VMware, 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 <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + +struct program +{ +   unsigned width; +   unsigned height; +   unsigned quads; +}; + +struct program prog; + +static void init(void) +{ +   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)); +   fflush(stderr); +} + +static void reshape(int width, int height) +{ + +   glViewport(0, 0, (GLint)width, (GLint)height); + +   prog.width = width; +   prog.height = height; + +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +   glMatrixMode(GL_MODELVIEW); +} + +static void key(unsigned char key, int x, int y) +{ + +   switch (key) { +   case 27: +      exit(1); +   default: +      prog.quads = !prog.quads; +      glutPostRedisplay(); +      return; +   } +} + +static void drawQuad(void) +{ + +   if (prog.quads) { +      glBegin(GL_QUADS); +      glVertex2d(-1.0, -1.0); +      glVertex2d( 1.0, -1.0); +      glVertex2d( 1.0,  1.0); +      glVertex2d(-1.0,  1.0); +      glEnd(); +   } else { +      glClear(GL_COLOR_BUFFER_BIT); +   } +} + +static void draw(void) +{ +   glClearColor(0.0, 0.0, 1.0, 0.0); +   glClear(GL_COLOR_BUFFER_BIT); + +   printf("drawing with %s\n", prog.quads ? "quads" : "clears"); + +   glEnable(GL_SCISSOR_TEST); + +   { +      glClearColor(1.0, 0.0, 0.0, 1.0); +      glColor4d(1.0, 0.0, 0.0, 1.0); + +      glScissor(1, 1, 10, 10); +      drawQuad(); +      glScissor(1, prog.height -  11, 10, 10); +      drawQuad(); +      glScissor(prog.width - 11, prog.height -  11, 10, 10); +      drawQuad(); +   } + +   { +      glClearColor(0.0, 1.0, 0.0, 1.0); +      glColor4d(0.0, 1.0, 0.0, 1.0); + +      glScissor(12, 1, 10, 10); +      drawQuad(); +      glScissor(12, prog.height -  11, 10, 10); +      drawQuad(); +      glScissor(prog.width - 22, prog.height -  11, 10, 10); +      drawQuad(); +   } + +   { +      glClearColor(1.0, 1.0, 0.0, 1.0); +      glColor4d(1.0, 1.0, 0.0, 1.0); + +      glScissor(1, 12, 10, 10); +      drawQuad(); +      glScissor(1, prog.height -  22, 10, 10); +      drawQuad(); +      glScissor(prog.width - 11, prog.height -  22, 10, 10); +      drawQuad(); +   } + +   glDisable(GL_SCISSOR_TEST); + +   //glutSwapBuffers(); +   glFlush(); +} + +int main(int argc, char **argv) +{ +   GLenum type; + +   glutInit(&argc, argv); + +   prog.width = 200; +   prog.height = 200; + +   glutInitWindowPosition(100, 0); +   glutInitWindowSize(prog.width, prog.height); + +   //type = GLUT_RGB | GLUT_DOUBLE; +   type = GLUT_RGB | GLUT_SINGLE; +   glutInitDisplayMode(type); + +   if (glutCreateWindow(*argv) == GL_FALSE) { +      exit(1); +   } + +   init(); + +   glutReshapeFunc(reshape); +   glutKeyboardFunc(key); +   glutDisplayFunc(draw); +   glutMainLoop(); +   return 0; +} | 
