test26.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
- /* Copyright (c) Mark J. Kilgard, 1997. */
- /* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
- /* Test for glutPostWindowRedisplay and
- glutPostWindowOverlayRedisplay introduced with GLUT 4 API. */
- #include <GL/glut.h>
- #include <stdio.h>
- #include <stdlib.h>
- int window1, window2, win1displayed = 0, win2displayed = 0;
- int win1vis = 0, win2vis = 0;
- int overlaySupported, transP, opaqueP, over1displayed = 0;
- void
- checkifdone(void)
- {
- if ((win1displayed > 15) && (win2displayed > 15) && (!overlaySupported || over1displayed>15)) {
- printf("PASS: test26n");
- exit(0);
- }
- }
- void
- window1display(void)
- {
- if (glutGetWindow() != window1) {
- printf("FAIL: window1displayn");
- exit(1);
- }
- glClearColor(0, 1, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
- win1displayed++;
- checkifdone();
- }
- void
- overDisplay(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glRectf(-0.5, -0.5, 0.5, 0.5);
- glFlush();
- over1displayed++;
- checkifdone();
- }
- void
- window2display(void)
- {
- if (glutGetWindow() != window2) {
- printf("FAIL: window2displayn");
- exit(1);
- }
- glClearColor(0, 0, 1, 0);
- glClear(GL_COLOR_BUFFER_BIT);
- glutSwapBuffers();
- win2displayed++;
- checkifdone();
- }
- /* ARGSUSED */
- void
- timefunc(int value)
- {
- printf("FAIL: test26n");
- exit(1);
- }
- void
- idle(void)
- {
- static int count = 0;
- if (count % 2) {
- glutPostWindowRedisplay(window1);
- glutPostWindowRedisplay(window2);
- } else {
- glutPostWindowRedisplay(window2);
- glutPostWindowRedisplay(window1);
- }
- if (overlaySupported) {
- glutPostWindowOverlayRedisplay(window1);
- }
- count++;
- }
- void
- window1vis(int vis)
- {
- win1vis = vis;
- if (win1vis && win2vis) {
- glutIdleFunc(idle);
- }
- }
- void
- window2status(int status)
- {
- win2vis = (status == GLUT_FULLY_RETAINED) || (status == GLUT_PARTIALLY_RETAINED);
- if (win1vis && win2vis) {
- glutIdleFunc(idle);
- }
- }
- int
- main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitWindowSize(100, 100);
- glutInitWindowPosition(50, 100);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- window1 = glutCreateWindow("1");
- glutDisplayFunc(window1display);
- glutVisibilityFunc(window1vis);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
- overlaySupported = glutLayerGet(GLUT_OVERLAY_POSSIBLE);
- if (overlaySupported) {
- printf("testing glutPostWindowOverlayRedisplay since overlay supportedn");
- glutEstablishOverlay();
- glutOverlayDisplayFunc(overDisplay);
- transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
- glClearIndex(glutLayerGet(GLUT_TRANSPARENT_INDEX));
- opaqueP = (transP + 1) % glutGet(GLUT_WINDOW_COLORMAP_SIZE);
- glutSetColor(opaqueP, 1.0, 0.0, 0.0);
- }
- glutInitWindowPosition(250, 100);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- window2 = glutCreateWindow("2");
- glutDisplayFunc(window2display);
- glutWindowStatusFunc(window2status);
- glutTimerFunc(9000, timefunc, 1);
- glutMainLoop();
- return 0; /* ANSI C requires main to return int. */
- }