test26.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1997. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. /* Test for glutPostWindowRedisplay and
  6.    glutPostWindowOverlayRedisplay introduced with GLUT 4 API. */
  7. #include <GL/glut.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. int window1, window2, win1displayed = 0, win2displayed = 0;
  11. int win1vis = 0, win2vis = 0;
  12. int overlaySupported, transP, opaqueP, over1displayed = 0;
  13. void
  14. checkifdone(void)
  15. {
  16.   if ((win1displayed > 15) && (win2displayed > 15) && (!overlaySupported || over1displayed>15)) {
  17.     printf("PASS: test26n");
  18.     exit(0);
  19.   }
  20. }
  21. void
  22. window1display(void)
  23. {
  24.   if (glutGetWindow() != window1) {
  25.     printf("FAIL: window1displayn");
  26.     exit(1);
  27.   }
  28.   glClearColor(0, 1, 0, 0);
  29.   glClear(GL_COLOR_BUFFER_BIT);
  30.   glFlush();
  31.   win1displayed++;
  32.   checkifdone();
  33. }
  34. void
  35. overDisplay(void)
  36. {
  37.   glClear(GL_COLOR_BUFFER_BIT);
  38.   glRectf(-0.5, -0.5, 0.5, 0.5);
  39.   glFlush();
  40.   over1displayed++;
  41.   checkifdone();
  42. }
  43. void
  44. window2display(void)
  45. {
  46.   if (glutGetWindow() != window2) {
  47.     printf("FAIL: window2displayn");
  48.     exit(1);
  49.   }
  50.   glClearColor(0, 0, 1, 0);
  51.   glClear(GL_COLOR_BUFFER_BIT);
  52.   glutSwapBuffers();
  53.   win2displayed++;
  54.   checkifdone();
  55. }
  56. /* ARGSUSED */
  57. void
  58. timefunc(int value)
  59. {
  60.   printf("FAIL: test26n");
  61.   exit(1);
  62. }
  63. void
  64. idle(void)
  65. {
  66.   static int count = 0;
  67.   if (count % 2) {
  68.     glutPostWindowRedisplay(window1);
  69.     glutPostWindowRedisplay(window2);
  70.   } else {
  71.     glutPostWindowRedisplay(window2);
  72.     glutPostWindowRedisplay(window1);
  73.   }
  74.   if (overlaySupported) {
  75.     glutPostWindowOverlayRedisplay(window1);
  76.   }
  77.   count++;
  78. }
  79. void
  80. window1vis(int vis)
  81. {
  82.   win1vis = vis;
  83.   if (win1vis && win2vis) {
  84.     glutIdleFunc(idle);
  85.   }
  86. }
  87. void
  88. window2status(int status)
  89. {
  90.   win2vis = (status == GLUT_FULLY_RETAINED) || (status == GLUT_PARTIALLY_RETAINED);
  91.   if (win1vis && win2vis) {
  92.     glutIdleFunc(idle);
  93.   }
  94. }
  95. int
  96. main(int argc, char **argv)
  97. {
  98.   glutInit(&argc, argv);
  99.   glutInitWindowSize(100, 100);
  100.   glutInitWindowPosition(50, 100);
  101.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  102.   window1 = glutCreateWindow("1");
  103.   glutDisplayFunc(window1display);
  104.   glutVisibilityFunc(window1vis);
  105.   glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
  106.   overlaySupported = glutLayerGet(GLUT_OVERLAY_POSSIBLE);
  107.   if (overlaySupported) {
  108.     printf("testing glutPostWindowOverlayRedisplay since overlay supportedn");
  109.     glutEstablishOverlay();
  110.     glutOverlayDisplayFunc(overDisplay);
  111.     transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  112.     glClearIndex(glutLayerGet(GLUT_TRANSPARENT_INDEX));
  113.     opaqueP = (transP + 1) % glutGet(GLUT_WINDOW_COLORMAP_SIZE);
  114.     glutSetColor(opaqueP, 1.0, 0.0, 0.0);
  115.   }
  116.   glutInitWindowPosition(250, 100);
  117.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  118.   window2 = glutCreateWindow("2");
  119.   glutDisplayFunc(window2display);
  120.   glutWindowStatusFunc(window2status);
  121.   glutTimerFunc(9000, timefunc, 1);
  122.   glutMainLoop();
  123.   return 0;             /* ANSI C requires main to return int. */
  124. }