test21.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. /* This tests GLUT's video resize API (currently only supported
  6.    on SGI's InfiniteReality hardware). */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <GL/glut.h>
  11. GLfloat light_diffuse[] =
  12. {1.0, 0.0, 0.0, 1.0};
  13. GLfloat light_position[] =
  14. {1.0, 1.0, 1.0, 0.0};
  15. int x, y, w, h, dx, dy, dw, dh;
  16. void
  17. display(void)
  18. {
  19.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  20.   glutSolidTeapot(1.0);
  21.   glutSwapBuffers();
  22. }
  23. void
  24. show_video_size(void)
  25. {
  26.   printf("GLUT_VIDEO_RESIZE_X = %dn",
  27.     glutVideoResizeGet(GLUT_VIDEO_RESIZE_X));
  28.   printf("GLUT_VIDEO_RESIZE_Y = %dn",
  29.     glutVideoResizeGet(GLUT_VIDEO_RESIZE_Y));
  30.   printf("GLUT_VIDEO_RESIZE_WIDTH = %dn",
  31.     glutVideoResizeGet(GLUT_VIDEO_RESIZE_WIDTH));
  32.   printf("GLUT_VIDEO_RESIZE_HEIGHT = %dn",
  33.     glutVideoResizeGet(GLUT_VIDEO_RESIZE_HEIGHT));
  34. }
  35. /* ARGSUSED1 */
  36. void
  37. key(unsigned char k, int x, int y)
  38. {
  39.   printf("c = %cn", k);
  40.   switch (k) {
  41.   case 27:
  42.     exit(0);
  43.     return;
  44.   case 'a':
  45.     glutVideoPan(0, 0, 1280, 1024);
  46.     break;
  47.   case 'b':
  48.     glutVideoPan(0, 0, 1600, 1024);
  49.     break;
  50.   case 'c':
  51.     glutVideoPan(640, 512, 640, 512);
  52.     break;
  53.   case 'q':
  54.     glutVideoPan(320, 256, 640, 512);
  55.     break;
  56.   case '1':
  57.     glutVideoResize(0, 0, 640, 512);
  58.     break;
  59.   case '2':
  60.     glutVideoResize(0, 512, 640, 512);
  61.     break;
  62.   case '3':
  63.     glutVideoResize(512, 512, 640, 512);
  64.     break;
  65.   case '4':
  66.     glutVideoResize(512, 0, 640, 512);
  67.     break;
  68.   case 's':
  69.     glutStopVideoResizing();
  70.     break;
  71.   case '=':
  72.     show_video_size();
  73.     break;
  74.   case ' ':
  75.     glutPostRedisplay();
  76.     break;
  77.   }
  78. }
  79. /* ARGSUSED */
  80. void
  81. time2(int value)
  82. {
  83.   glutVideoResize(x, y, w, h);
  84.   glutPostRedisplay();
  85.   x -= dx;
  86.   y -= dy;
  87.   w += (dx * 2);
  88.   h += (dy * 2);
  89.   if (x > 0) {
  90.     glutTimerFunc(100, time2, 0);
  91.   } else {
  92.     glutStopVideoResizing();
  93.     printf("PASS: test21 (with video resizing tested)n");
  94.     exit(0);
  95.   }
  96. }
  97. /* ARGSUSED */
  98. void
  99. time1(int value)
  100. {
  101.   glutVideoPan(x, y, w, h);
  102.   x += dx;
  103.   y += dy;
  104.   w -= (dx * 2);
  105.   h -= (dy * 2);
  106.   if (x < 200) {
  107.     glutTimerFunc(100, time1, 0);
  108.   } else {
  109.     glutTimerFunc(100, time2, 0);
  110.   }
  111. }
  112. int
  113. main(int argc, char **argv)
  114. {
  115.   int i, interact = 0;
  116.   glutInit(&argc, argv);
  117.   for (i = 1; i < argc; i++) {
  118.     if (!strcmp("-i", argv[i])) {
  119.       interact = 1;
  120.     }
  121.   }
  122.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  123.   glutCreateWindow("test21");
  124.   if (!glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
  125.     printf("video resizing not supportedn");
  126.     printf("PASS: test21n");
  127.     exit(0);
  128.   }
  129.   glutSetupVideoResizing();
  130.   printf("GLUT_VIDEO_RESIZE_X_DELTA = %dn",
  131.     dx = glutVideoResizeGet(GLUT_VIDEO_RESIZE_X_DELTA));
  132.   printf("GLUT_VIDEO_RESIZE_Y_DELTA = %dn",
  133.     dy = glutVideoResizeGet(GLUT_VIDEO_RESIZE_Y_DELTA));
  134.   printf("GLUT_VIDEO_RESIZE_WIDTH_DELTA = %dn",
  135.     dw = glutVideoResizeGet(GLUT_VIDEO_RESIZE_WIDTH_DELTA));
  136.   printf("GLUT_VIDEO_RESIZE_HEIGHT_DELTA = %dn",
  137.     dh = glutVideoResizeGet(GLUT_VIDEO_RESIZE_HEIGHT_DELTA));
  138.   printf("GLUT_VIDEO_RESIZE_X = %dn",
  139.     x = glutVideoResizeGet(GLUT_VIDEO_RESIZE_X));
  140.   printf("GLUT_VIDEO_RESIZE_Y = %dn",
  141.     y = glutVideoResizeGet(GLUT_VIDEO_RESIZE_Y));
  142.   printf("GLUT_VIDEO_RESIZE_WIDTH = %dn",
  143.     w = glutVideoResizeGet(GLUT_VIDEO_RESIZE_WIDTH));
  144.   printf("GLUT_VIDEO_RESIZE_HEIGHT = %dn",
  145.     h = glutVideoResizeGet(GLUT_VIDEO_RESIZE_HEIGHT));
  146.   glutStopVideoResizing();
  147.   glutSetupVideoResizing();
  148.   glutDisplayFunc(display);
  149.   glutFullScreen();
  150.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  151.   glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  152.   glEnable(GL_LIGHTING);
  153.   glEnable(GL_LIGHT0);
  154.   glEnable(GL_DEPTH_TEST);
  155.   glMatrixMode(GL_PROJECTION);
  156.   gluPerspective( /* field of view in degree */ 22.0,
  157.   /* aspect ratio */ 1.0,
  158.     /* Z near */ 1.0, /* Z far */ 10.0);
  159.   glMatrixMode(GL_MODELVIEW);
  160.   gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
  161.     0.0, 0.0, 0.0,      /* center is at (0,0,0) */
  162.     0.0, 1.0, 0.);      /* up is in postivie Y direction */
  163.   glTranslatef(0.0, 0.0, -1.0);
  164.   glutKeyboardFunc(key);
  165.   if (!interact) {
  166.     glutTimerFunc(100, time1, 0);
  167.   }
  168.   glutMainLoop();
  169.   return 0;             /* ANSI C requires main to return int. */
  170. }