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

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. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <GL/glut.h>
  8. int on = 0;
  9. int independent = 0;
  10. int main_w, hidden_w, s1, s2;
  11. float x = 0, y = 0;
  12. void
  13. overlay_display(void)
  14. {
  15.   printf("overlay_display: damaged=%dn", glutLayerGet(GLUT_OVERLAY_DAMAGED));
  16.   if (on) {
  17.     glutUseLayer(GLUT_OVERLAY);
  18.     glClear(GL_COLOR_BUFFER_BIT);
  19.     glBegin(GL_POLYGON);
  20.     glVertex2f(.2 + x, .2 + y);
  21.     glVertex2f(.5 + x, .5 + y);
  22.     glVertex2f(.2 + x, .5 + y);
  23.     glEnd();
  24.     glFlush();
  25.   }
  26. }
  27. void
  28. display(void)
  29. {
  30.   printf("normal_display: damaged=%dn", glutLayerGet(GLUT_NORMAL_DAMAGED));
  31.   glutUseLayer(GLUT_NORMAL);
  32.   glClear(GL_COLOR_BUFFER_BIT);
  33.   glColor3f(1.0, 0.0, 0.0);
  34.   glBegin(GL_POLYGON);
  35.   glVertex2f(.2, .28);
  36.   glVertex2f(.5, .58);
  37.   glVertex2f(.2, .58);
  38.   glEnd();
  39.   if (!independent) {
  40.     overlay_display();
  41.   } else {
  42.     printf("not calling overlay_displayn");
  43.   }
  44. }
  45. void
  46. hidden_display(void)
  47. {
  48.   printf("hidden_display: this should not be called evern");
  49. }
  50. void
  51. reshape(int w, int h)
  52. {
  53.   glutUseLayer(GLUT_NORMAL);
  54.   glViewport(0, 0, w, h);
  55.   if (on) {
  56.     glutUseLayer(GLUT_OVERLAY);
  57.     glViewport(0, 0, w, h);
  58.     printf("w=%d, h=%dn", w, h);
  59.   }
  60. }
  61. void
  62. special(int c, int w, int h)
  63. {
  64.   printf("special %d  w=%d h=%dn", c, w, h);
  65.   if (on) {
  66.     switch (c) {
  67.     case GLUT_KEY_LEFT:
  68.       x -= 0.1;
  69.       break;
  70.     case GLUT_KEY_RIGHT:
  71.       x += 0.1;
  72.       break;
  73.     case GLUT_KEY_UP:
  74.       y += 0.1;
  75.       break;
  76.     case GLUT_KEY_DOWN:
  77.       y -= 0.1;
  78.       break;
  79.     }
  80.     glutPostOverlayRedisplay();
  81.   }
  82. }
  83. void
  84. key(unsigned char c, int w, int h)
  85. {
  86.   int transP;
  87.   printf("c=%d  w=%d h=%dn", c, w, h);
  88.   switch (c) {
  89.   case 'e':
  90.     glutEstablishOverlay();
  91.     independent = 0;
  92.     transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  93.     glClearIndex(transP);
  94.     glutSetColor((transP + 1) % 2, 1.0, 1.0, 0.0);
  95.     glIndexi((transP + 1) % 2);
  96.     on = 1;
  97.     break;
  98.   case 'r':
  99.     glutRemoveOverlay();
  100.     on = 0;
  101.     break;
  102.   case 'm':
  103.     if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  104.       int pixel;
  105.       GLfloat red, green, blue;
  106.       transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  107.       pixel = (transP + 1) % 2;
  108.       red = glutGetColor(pixel, GLUT_RED) + 0.2;
  109.       if (red > 1.0)
  110.         red = red - 1.0;
  111.       green = glutGetColor(pixel, GLUT_GREEN) - 0.1;
  112.       if (green > 1.0)
  113.         green = green - 1.0;
  114.       blue = glutGetColor(pixel, GLUT_BLUE) + 0.1;
  115.       if (blue > 1.0)
  116.         blue = blue - 1.0;
  117.       glutSetColor(pixel, red, green, blue);
  118.     }
  119.     break;
  120.   case 'h':
  121.     glutSetWindow(hidden_w);
  122.     glutHideWindow();
  123.     glutSetWindow(s2);
  124.     glutHideWindow();
  125.     break;
  126.   case 's':
  127.     glutSetWindow(hidden_w);
  128.     glutShowWindow();
  129.     glutSetWindow(s2);
  130.     glutShowWindow();
  131.     break;
  132.   case 'H':
  133.     glutHideOverlay();
  134.     break;
  135.   case 'S':
  136.     glutShowOverlay();
  137.     break;
  138.   case 'D':
  139.     glutDestroyWindow(main_w);
  140.     exit(0);
  141.     break;
  142.   case ' ':
  143.     printf("overlay possible: %dn", glutLayerGet(GLUT_OVERLAY_POSSIBLE));
  144.     printf("layer in  use: %dn", glutLayerGet(GLUT_LAYER_IN_USE));
  145.     printf("has overlay: %dn", glutLayerGet(GLUT_HAS_OVERLAY));
  146.     printf("transparent index: %dn", glutLayerGet(GLUT_TRANSPARENT_INDEX));
  147.     break;
  148.   }
  149. }
  150. /* ARGSUSED1 */
  151. void
  152. key2(unsigned char c, int w, int h)
  153. {
  154.   int transP;
  155.   printf("c=%dn", c);
  156.   switch (c) {
  157.   case 'g':
  158.     glutReshapeWindow(
  159.       glutGet(GLUT_WINDOW_WIDTH) + 2, glutGet(GLUT_WINDOW_HEIGHT) + 2);
  160.     break;
  161.   case 's':
  162.     glutReshapeWindow(
  163.       glutGet(GLUT_WINDOW_WIDTH) - 2, glutGet(GLUT_WINDOW_HEIGHT) - 2);
  164.     break;
  165.   case 'u':
  166.     glutPopWindow();
  167.     break;
  168.   case 'd':
  169.     glutPushWindow();
  170.     break;
  171.   case 'e':
  172.     glutEstablishOverlay();
  173.     transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  174.     glClearIndex(transP);
  175.     glutSetColor((transP + 1) % 2, 0.0, 0.25, 0.0);
  176.     glIndexi((transP + 1) % 2);
  177.     break;
  178.   case 'c':
  179.     if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  180.       glutUseLayer(GLUT_OVERLAY);
  181.       glutCopyColormap(main_w);
  182.     }
  183.     break;
  184.   case 'r':
  185.     glutRemoveOverlay();
  186.     break;
  187.   case ' ':
  188.     printf("overlay possible: %dn", glutLayerGet(GLUT_OVERLAY_POSSIBLE));
  189.     printf("layer in  use: %dn", glutLayerGet(GLUT_LAYER_IN_USE));
  190.     printf("has overlay: %dn", glutLayerGet(GLUT_HAS_OVERLAY));
  191.     printf("transparent index: %dn", glutLayerGet(GLUT_TRANSPARENT_INDEX));
  192.     break;
  193.   }
  194. }
  195. void
  196. vis(int state)
  197. {
  198.   if (state == GLUT_VISIBLE)
  199.     printf("visible %dn", glutGetWindow());
  200.   else
  201.     printf("NOT visible %dn", glutGetWindow());
  202. }
  203. void
  204. entry(int state)
  205. {
  206.   if (state == GLUT_LEFT)
  207.     printf("LEFT %dn", glutGetWindow());
  208.   else
  209.     printf("entered %dn", glutGetWindow());
  210. }
  211. void
  212. motion(int x, int y)
  213. {
  214.   printf("motion x=%x y=%dn", x, y);
  215. }
  216. void
  217. mouse(int b, int s, int x, int y)
  218. {
  219.   printf("b=%d  s=%d  x=%d y=%dn", b, s, x, y);
  220. }
  221. void
  222. display2(void)
  223. {
  224.   glutUseLayer(GLUT_NORMAL);
  225.   glClear(GL_COLOR_BUFFER_BIT);
  226.   glFlush();
  227.   if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  228.     glutUseLayer(GLUT_OVERLAY);
  229.     glClear(GL_COLOR_BUFFER_BIT);
  230.     glBegin(GL_POLYGON);
  231.     glVertex2f(.2, .28);
  232.     glVertex2f(.5, .58);
  233.     glVertex2f(.2, .58);
  234.     glEnd();
  235.     glFlush();
  236.   }
  237. }
  238. void
  239. dial(int dial, int value)
  240. {
  241.   printf("dial %d %d (%d)n", dial, value, glutGetWindow());
  242. }
  243. void
  244. box(int button, int state)
  245. {
  246.   printf("box %d %d (%d)n", button, state, glutGetWindow());
  247. }
  248. void
  249. main_menu(int option)
  250. {
  251.   switch (option) {
  252.   case 1:
  253.     if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  254.       independent = 1;
  255.       glutOverlayDisplayFunc(overlay_display);
  256.     }
  257.     break;
  258.   case 2:
  259.     if (glutLayerGet(GLUT_HAS_OVERLAY)) {
  260.       independent = 0;
  261.       glutOverlayDisplayFunc(NULL);
  262.     }
  263.     break;
  264.   case 666:
  265.     exit(0);
  266.     break;
  267.   }
  268. }
  269. void
  270. s2_menu(int option)
  271. {
  272.   int transP;
  273.   switch (option) {
  274.   case 1:
  275.     glutRemoveOverlay();
  276.     break;
  277.   case 2:
  278.     glutEstablishOverlay();
  279.     transP = glutLayerGet(GLUT_TRANSPARENT_INDEX);
  280.     glClearIndex(transP);
  281.     glutSetColor((transP + 1) % 2, 0.0, 0.25, 0.0);
  282.     glIndexi((transP + 1) % 2);
  283.     break;
  284.   case 666:
  285.     exit(0);
  286.     break;
  287.   }
  288. }
  289. int
  290. main(int argc, char **argv)
  291. {
  292.   glutInit(&argc, argv);
  293.   glutInitDisplayMode(GLUT_RGB);
  294.   glutInitWindowSize(210, 210);
  295.   main_w = glutCreateWindow("overlay test");
  296.   glutDisplayFunc(display);
  297.   glutReshapeFunc(reshape);
  298.   glClearColor(1.0, 0.0, 1.0, 1.0);
  299.   glutKeyboardFunc(key);
  300.   glutVisibilityFunc(vis);
  301.   glutEntryFunc(entry);
  302.   glutSpecialFunc(special);
  303.   glutMotionFunc(motion);
  304.   glutMouseFunc(mouse);
  305.   glutCreateMenu(main_menu);
  306.   glutAddMenuEntry("Dual display callbacks", 1);
  307.   glutAddMenuEntry("Single display callbacks", 2);
  308.   glutAddMenuEntry("Quit", 666);
  309.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  310.   hidden_w = glutCreateSubWindow(main_w, 10, 10, 100, 90);
  311.   /* hidden_w is completely obscured by its own s1 subwindow.
  312.      While display, entry and visibility callbacks are 
  313.      registered, they will never be called. */
  314.   glutDisplayFunc(hidden_display);
  315.   glutEntryFunc(entry);
  316.   glutVisibilityFunc(vis);
  317.   s1 = glutCreateSubWindow(hidden_w, 0, 0, 100, 90);
  318.   glClearColor(0.0, 0.0, 1.0, 1.0);
  319.   glutDisplayFunc(display2);
  320. #if 0
  321.   glutKeyboardFunc(key2);
  322. #endif
  323.   glutVisibilityFunc(vis);
  324.   glutEntryFunc(entry);
  325.   s2 = glutCreateSubWindow(main_w, 35, 35, 100, 90);
  326.   glClearColor(0.5, 0.0, 0.5, 1.0);
  327.   glutDisplayFunc(display2);
  328. #if 1
  329.   glutKeyboardFunc(key2);
  330. #endif
  331.   glutVisibilityFunc(vis);
  332.   glutEntryFunc(entry);
  333. #if 1
  334.   glutCreateMenu(s2_menu);
  335.   glutAddMenuEntry("Remove overlay", 1);
  336.   glutAddMenuEntry("Establish overlay", 2);
  337.   glutAddMenuEntry("Quit", 666);
  338.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  339. #endif
  340.   glutInitDisplayMode(GLUT_INDEX);
  341. #if 1
  342.   glutSetWindow(main_w);
  343.   glutDialsFunc(dial);
  344.   glutButtonBoxFunc(box);
  345. #endif
  346.   glutMainLoop();
  347.   return 0;             /* ANSI C requires main to return int. */
  348. }