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

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 for GLUT 3.0's overlay functionality. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <GL/glut.h>
  9. static int transP;
  10. static int main_win;
  11. static float x = 0, y = 0;
  12. static void
  13. render_normal(void)
  14. {
  15.   glutUseLayer(GLUT_NORMAL);
  16.   glClear(GL_COLOR_BUFFER_BIT);
  17.   glColor3f(0.0, 0.0, 1.0);
  18.   glBegin(GL_POLYGON);
  19.   glVertex2f(.2, .28);
  20.   glVertex2f(.5, .58);
  21.   glVertex2f(.2, .58);
  22.   glEnd();
  23.   glFlush();
  24. }
  25. static void
  26. render_overlay(void)
  27. {
  28.   glClear(GL_COLOR_BUFFER_BIT);
  29.   glBegin(GL_POLYGON);
  30.   glVertex2f(.2 + x, .2 + y);
  31.   glVertex2f(.5 + x, .5 + y);
  32.   glVertex2f(.2 + x, .5 + y);
  33.   glEnd();
  34.   glFlush();
  35. }
  36. static void
  37. render(void)
  38. {
  39.   glutUseLayer(GLUT_NORMAL);
  40.   render_normal();
  41.   if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  42.     glutUseLayer(GLUT_OVERLAY);
  43.     render_overlay();
  44.   }
  45. }
  46. static void
  47. render_sub(void)
  48. {
  49.   printf("render_subn");
  50.   glutUseLayer(GLUT_NORMAL);
  51.   render_normal();
  52.   if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  53.     glutUseLayer(GLUT_OVERLAY);
  54.     render_overlay();
  55.   }
  56. }
  57. static int display_count = 0;
  58. static int damage_expectation;
  59. static void
  60. timer(int value)
  61. {
  62.   if (value != 777) {
  63.     printf("FAIL: unexpected timer valuen");
  64.     exit(1);
  65.   }
  66.   damage_expectation = 1;
  67.   glutShowWindow();
  68. }
  69. static void
  70. time2(int value)
  71. {
  72.   if (value == 666) {
  73.     printf("PASS: test17n");
  74.     exit(0);
  75.   }
  76.   if (value != 888) {
  77.     printf("FAIL: bad valuen");
  78.     exit(1);
  79.   }
  80.   glutDestroyWindow(main_win);
  81.   glutTimerFunc(500, time2, 666);
  82. }
  83. static void
  84. move_on(void)
  85. {
  86.   display_count++;
  87.   if (display_count == 2) {
  88.     damage_expectation = 1;
  89.     glutIconifyWindow();
  90.     glutTimerFunc(500, timer, 777);
  91.   }
  92.   if (display_count == 4) {
  93.     printf("display_count == 4n");
  94.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  95.     glutCreateSubWindow(main_win, 10, 10, 150, 150);
  96.     glClearColor(0.5, 0.5, 0.5, 0.0);
  97.     glutDisplayFunc(render_sub);
  98.     glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
  99.     glutEstablishOverlay();
  100.     glutCopyColormap(main_win);
  101.     glutSetColor((transP + 1) % 2, 0.0, 1.0, 1.0);
  102.     glutRemoveOverlay();
  103.     glutEstablishOverlay();
  104.     glutCopyColormap(main_win);
  105.     glutCopyColormap(main_win);
  106.     glutSetColor((transP + 1) % 2, 1.0, 1.0, 1.0);
  107.     glClearIndex(transP);
  108.     glIndexf((transP + 1) % 2);
  109.     glutSetWindow(main_win);
  110.     glutRemoveOverlay();
  111.     glutTimerFunc(500, time2, 888);
  112.   }
  113. }
  114. static void
  115. display_normal(void)
  116. {
  117.   if (glutLayerGet(GLUT_NORMAL_DAMAGED) != damage_expectation) {
  118.     printf("FAIL: normal damage not expectedn");
  119.     exit(1);
  120.   }
  121.   render_normal();
  122.   move_on();
  123. }
  124. static void
  125. display_overlay(void)
  126. {
  127.   if (glutLayerGet(GLUT_OVERLAY_DAMAGED) != damage_expectation) {
  128.     printf("FAIL: overlay damage not expectedn");
  129.     exit(1);
  130.   }
  131.   render_overlay();
  132.   move_on();
  133. }
  134. static void
  135. display2(void)
  136. {
  137.   static int been_here = 0;
  138.   if (glutLayerGet(GLUT_NORMAL_DAMAGED) != 0) {
  139.     printf("FAIL: normal damage not expectedn");
  140.     exit(1);
  141.   }
  142.   if (glutLayerGet(GLUT_OVERLAY_DAMAGED) != 0) {
  143.     printf("FAIL: overlay damage not expectedn");
  144.     exit(1);
  145.   }
  146.   if (been_here) {
  147.     glutPostOverlayRedisplay();
  148.   } else {
  149.     glutOverlayDisplayFunc(display_overlay);
  150.     glutDisplayFunc(display_normal);
  151.     damage_expectation = 0;
  152.     glutPostOverlayRedisplay();
  153.     glutPostRedisplay();
  154.   }
  155. }
  156. static void
  157. display(void)
  158. {
  159.   if (glutLayerGet(GLUT_NORMAL_DAMAGED) == 0) {
  160.     printf("FAIL: normal damage expectedn");
  161.     exit(1);
  162.   }
  163.   if (glutLayerGet(GLUT_OVERLAY_DAMAGED) == 0) {
  164.     printf("FAIL: overlay damage expectedn");
  165.     exit(1);
  166.   }
  167.   render();
  168.   glutDisplayFunc(display2);
  169.   glutPostRedisplay();
  170. }
  171. int
  172. main(int argc, char **argv)
  173. {
  174.   glutInit(&argc, argv);
  175.   glutInitWindowSize(300, 300);
  176.   glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
  177.   if (!glutLayerGet(GLUT_OVERLAY_POSSIBLE)) {
  178.     printf("UNRESOLVED: need overlays for this test (your window system lacks overlays)n");
  179.     exit(0);
  180.   }
  181.   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  182.   main_win = glutCreateWindow("test17");
  183.   if (glutLayerGet(GLUT_LAYER_IN_USE) == GLUT_OVERLAY) {
  184.     printf("FAIL: overlay should not be in usen");
  185.     exit(1);
  186.   }
  187.   if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  188.     printf("FAIL: overlay should not existn");
  189.     exit(1);
  190.   }
  191.   if (glutLayerGet(GLUT_TRANSPARENT_INDEX) != -1) {
  192.     printf("FAIL: transparent pixel of normal plane should be -1n");
  193.     exit(1);
  194.   }
  195.   if (glutLayerGet(GLUT_NORMAL_DAMAGED) != 0) {
  196.     printf("FAIL: no normal damage yetn");
  197.     exit(1);
  198.   }
  199.   if (glutLayerGet(GLUT_OVERLAY_DAMAGED) != -1) {
  200.     printf("FAIL: no overlay damage status yetn");
  201.     exit(1);
  202.   }
  203.   glClearColor(0.0, 1.0, 0.0, 0.0);
  204.   glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX);
  205.   /* Small torture test. */
  206.   glutEstablishOverlay();
  207.   glutRemoveOverlay();
  208.   glutEstablishOverlay();
  209.   glutEstablishOverlay();
  210.   glutShowOverlay();
  211.   glutHideOverlay();
  212.   glutShowOverlay();
  213.   glutRemoveOverlay();
  214.   glutRemoveOverlay();
  215.   glutEstablishOverlay();
  216.   if (glutGet(GLUT_WINDOW_RGBA)) {
  217.     printf("FAIL: overlay should not be RGBAn");
  218.     exit(1);
  219.   }
  220.   glutUseLayer(GLUT_NORMAL);
  221.   if (!glutGet(GLUT_WINDOW_RGBA)) {
  222.     printf("FAIL: normal should be RGBAn");
  223.     exit(1);
  224.   }
  225.   glutUseLayer(GLUT_OVERLAY);
  226.   if (glutGet(GLUT_WINDOW_RGBA)) {
  227.     printf("FAIL: overlay should not be RGBAn");
  228.     exit(1);
  229.   }
  230.   if (glutLayerGet(GLUT_LAYER_IN_USE) == GLUT_NORMAL) {
  231.     printf("FAIL: overlay should be in usen");
  232.     exit(1);
  233.   }
  234.   if (glutLayerGet(GLUT_HAS_OVERLAY) == 0) {
  235.     printf("FAIL: overlay should existn");
  236.     exit(1);
  237.   }
  238.   if (glutLayerGet(GLUT_TRANSPARENT_INDEX) == -1) {
  239.     printf("FAIL: transparent pixel should existn");
  240.     exit(1);
  241.   }
  242.   if (glutLayerGet(GLUT_NORMAL_DAMAGED) != 0) {
  243.     printf("FAIL: no normal damage yetn");
  244.     exit(1);
  245.   }
  246.   if (glutLayerGet(GLUT_OVERLAY_DAMAGED) != 0) {
  247.     printf("FAIL: no overlay damage yetn");
  248.     exit(1);
  249.   }
  250.   transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  251.   glClearIndex(glutLayerGet(GLUT_TRANSPARENT_INDEX));
  252.   glutSetColor((transP + 1) % 2, 1.0, 0.0, 1.0);
  253.   glIndexi((transP + 1) % 2);
  254.   glutUseLayer(GLUT_NORMAL);
  255.   if (glutLayerGet(GLUT_LAYER_IN_USE) == GLUT_OVERLAY) {
  256.     printf("FAIL: overlay should not be in usen");
  257.     exit(1);
  258.   }
  259.   glutDisplayFunc(display);
  260.   glutMainLoop();
  261.   return 0;             /* ANSI C requires main to return int. */
  262. }