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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1996. */
  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 display callbacks are not called for non-viewable
  6.    windows and overlays. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. int transP, opaqueP;
  11. int main_win, sub_win;
  12. int overlaySupported;
  13. int subHidden, overlayHidden;
  14. int warnIfNormalDisplay = 0;
  15. int firstTime = 1;
  16. void
  17. time5_cb(int value)
  18. {
  19.   if (value != -3) {
  20.     printf("ERROR: test18n");
  21.     exit(1);
  22.   }
  23.   printf("PASS: test18n");
  24.   exit(0);
  25. }
  26. void
  27. time4_cb(int value)
  28. {
  29.   if (value != -6) {
  30.     printf("ERROR: test18n");
  31.     exit(1);
  32.   }
  33.   warnIfNormalDisplay = 0;
  34.   glutTimerFunc(750, time5_cb, -3);
  35.   glutSetWindow(sub_win);
  36.   glutPostRedisplay();
  37.   glutSetWindow(main_win);
  38.   if (overlaySupported) {
  39.     glutPostOverlayRedisplay();
  40.   }
  41. }
  42. void
  43. time3_cb(int value)
  44. {
  45.   if (value != 6) {
  46.     printf("ERROR: test18n");
  47.     exit(1);
  48.   }
  49.   glutSetWindow(main_win);
  50.   glutHideOverlay();
  51.   overlayHidden = 1;
  52.   warnIfNormalDisplay = 1;
  53.   glutTimerFunc(500, time4_cb, -6);
  54. }
  55. void
  56. time2_cb(int value)
  57. {
  58.   if (value != 56) {
  59.     printf("ERROR: test18n");
  60.     exit(1);
  61.   }
  62.   glutSetWindow(main_win);
  63.   if (overlaySupported) {
  64.     glutShowOverlay();
  65.     overlayHidden = 0;
  66.   }
  67.   glutSetWindow(sub_win);
  68.   glutHideWindow();
  69.   subHidden = 1;
  70.   glutTimerFunc(500, time3_cb, 6);
  71. }
  72. void
  73. time_cb(int value)
  74. {
  75.   if (value != 456) {
  76.     printf("ERROR: test18n");
  77.     exit(1);
  78.   }
  79.   glutSetWindow(sub_win);
  80.   subHidden = 0;
  81.   glutShowWindow();
  82.   glutTimerFunc(500, time2_cb, 56);
  83. }
  84. void
  85. display(void)
  86. {
  87.   if (warnIfNormalDisplay) {
  88.     printf("WARNING: hiding overlay should not generate normal plane expose!n");
  89.     printf("does overlay operation work correctly?n");
  90.   }
  91.   if (glutLayerGet(GLUT_LAYER_IN_USE) != GLUT_NORMAL) {
  92.     printf("ERROR: test18n");
  93.     exit(1);
  94.   }
  95.   glClear(GL_COLOR_BUFFER_BIT);
  96.   glFlush();
  97.   if (firstTime) {
  98.     glutTimerFunc(500, time_cb, 456);
  99.     firstTime = 0;
  100.   }
  101. }
  102. void
  103. subDisplay(void)
  104. {
  105.   if (glutLayerGet(GLUT_LAYER_IN_USE) != GLUT_NORMAL) {
  106.     printf("ERROR: test18n");
  107.     exit(1);
  108.   }
  109.   if (subHidden) {
  110.     printf("display callback generated when subwindow was hidden!n");
  111.     printf("ERROR: test18n");
  112.     exit(1);
  113.   }
  114.   glClear(GL_COLOR_BUFFER_BIT);
  115.   glFlush();
  116. }
  117. void
  118. overDisplay(void)
  119. {
  120.   if (glutLayerGet(GLUT_LAYER_IN_USE) != GLUT_OVERLAY) {
  121.     printf("ERROR: test18n");
  122.     exit(1);
  123.   }
  124.   if (overlayHidden) {
  125.     printf("display callback generated when overlay was hidden!n");
  126.     printf("ERROR: test18n");
  127.     exit(1);
  128.   }
  129.   glClear(GL_COLOR_BUFFER_BIT);
  130.   glFlush();
  131. }
  132. void
  133. subVis(int state)
  134. {
  135.   if (glutLayerGet(GLUT_LAYER_IN_USE) != GLUT_NORMAL) {
  136.     printf("ERROR: test18n");
  137.     exit(1);
  138.   }
  139.   if (subHidden && state == GLUT_VISIBLE) {
  140.     printf("visible callback generated when overlay was hidden!n");
  141.     printf("ERROR: test18n");
  142.     exit(1);
  143.   }
  144.   if (!subHidden && state == GLUT_NOT_VISIBLE) {
  145.     printf("non-visible callback generated when overlay was shown!n");
  146.     printf("ERROR: test18n");
  147.     exit(1);
  148.   }
  149. }
  150. int
  151. main(int argc, char **argv)
  152. {
  153.   glutInit(&argc, argv);
  154.   glutInitWindowSize(300, 300);
  155.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  156.   main_win = glutCreateWindow("test18");
  157.   if (glutGet(GLUT_WINDOW_COLORMAP_SIZE) != 0) {
  158.     printf("RGBA color model windows should report zero colormap entries.n");
  159.     printf("ERROR: test18n");
  160.     exit(1);
  161.   }
  162.   glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
  163.   glutDisplayFunc(display);
  164.   overlaySupported = glutLayerGet(GLUT_OVERLAY_POSSIBLE);
  165.   if (overlaySupported) {
  166.     glutEstablishOverlay();
  167.     glutHideOverlay();
  168.     overlayHidden = 1;
  169.     glutOverlayDisplayFunc(overDisplay);
  170.     transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  171.     glClearIndex(glutLayerGet(GLUT_TRANSPARENT_INDEX));
  172.     opaqueP = (transP + 1) % glutGet(GLUT_WINDOW_COLORMAP_SIZE);
  173.     glutSetColor(opaqueP, 1.0, 0.0, 1.0);
  174.     glClearIndex(opaqueP);
  175.   }
  176.   else
  177.   {
  178.       printf("UNRESOLVED: need overlays for this test (your window system lacks overlays)n");
  179.       return 0;
  180.   }
  181.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  182.   sub_win = glutCreateSubWindow(main_win, 10, 10, 20, 20);
  183.   glClearColor(0.0, 1.0, 0.0, 0.0);
  184.   glutDisplayFunc(subDisplay);
  185.   glutVisibilityFunc(subVis);
  186.   glutHideWindow();
  187.   subHidden = 1;
  188.   glutMainLoop();
  189.   return 0;             /* ANSI C requires main to return int. */
  190. }