splatlogo.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. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <GL/glut.h>
  8. #define MAX_SPLATS 100
  9. extern int logo_width;
  10. extern int logo_height;
  11. extern unsigned char logo_image[];
  12. typedef struct _SplatInfo {
  13.   int x, y;
  14.   GLboolean alphaTest;
  15.   GLfloat xScale, yScale;
  16.   GLfloat scale[3];
  17.   GLfloat bias[3];
  18. } SplatInfo;
  19. int winHeight;
  20. int numSplats = 0;
  21. SplatInfo splatConfig;
  22. SplatInfo splatList[MAX_SPLATS];
  23. SplatInfo splatDefault = {
  24.   0, 0,
  25.   GL_TRUE,
  26.   1.0, 1.0,
  27.   { 1.0, 1.0, 1.0 },
  28.   { 0.0, 0.0, 0.0 }
  29. };
  30. void
  31. reshape(int w, int h)
  32. {
  33.   glViewport(0, 0, w, h);
  34.   glMatrixMode(GL_PROJECTION);
  35.   glLoadIdentity();
  36.   gluOrtho2D(0, w, 0, h);
  37.   glMatrixMode(GL_MODELVIEW);
  38.   winHeight = h;
  39. }
  40. void
  41. renderSplat(SplatInfo *splat)
  42. {
  43.     glRasterPos2i(splat->x, splat->y);
  44.     if(splat->yScale >= 0)
  45.       glBitmap(0, 0, 0, 0, 0, -logo_height * splat->yScale, 0);
  46.     if(splat->xScale < 0)
  47.       glBitmap(0, 0, 0, 0, logo_width * -splat->xScale, 0, 0);
  48.     glPixelZoom(splat->xScale, splat->yScale);
  49.     glPixelTransferf(GL_RED_SCALE, splat->scale[0]);
  50.     glPixelTransferf(GL_GREEN_SCALE, splat->scale[1]);
  51.     glPixelTransferf(GL_BLUE_SCALE, splat->scale[2]);
  52.     glPixelTransferf(GL_RED_BIAS, splat->bias[0]);
  53.     glPixelTransferf(GL_GREEN_BIAS, splat->bias[1]);
  54.     glPixelTransferf(GL_BLUE_BIAS, splat->bias[2]);
  55.     if (splat->alphaTest) 
  56.       glEnable(GL_ALPHA_TEST);
  57.     else
  58.       glDisable(GL_ALPHA_TEST);
  59.     glDrawPixels(logo_width, logo_height, GL_RGBA,
  60.       GL_UNSIGNED_BYTE, logo_image);
  61. }
  62. void
  63. display(void)
  64. {
  65.   int i;
  66.   glClear(GL_COLOR_BUFFER_BIT);
  67.   for (i = 0; i < numSplats; i++) {
  68.     renderSplat(&splatList[i]);
  69.   }
  70.   glFlush();
  71. }
  72. void
  73. mouse(int button, int state, int x, int y)
  74. {
  75.   if (button == GLUT_LEFT_BUTTON) {
  76.     if (state == GLUT_DOWN) {
  77.       if (numSplats < MAX_SPLATS) {
  78.         splatConfig.x = x;
  79.         splatConfig.y = winHeight - y;
  80. renderSplat(&splatConfig);
  81.         splatList[numSplats] = splatConfig;
  82.         numSplats++;
  83.       } else {
  84.         printf("out of splats!n");
  85.       }
  86.     }
  87.   }
  88. }
  89. void
  90. mainSelect(int value)
  91. {
  92.   GLfloat rpos[4];
  93.   GLboolean valid;
  94.   switch(value) {
  95.   case 0:
  96.     numSplats = 0;
  97.     glutPostRedisplay();
  98.     break;
  99.   case 1:
  100.     splatConfig = splatDefault;
  101.     break;
  102.   case 2:
  103.     splatConfig.xScale *= 1.25;
  104.     splatConfig.yScale *= 1.25;
  105.     break;
  106.   case 3:
  107.     splatConfig.xScale *= 0.75;
  108.     splatConfig.yScale *= 0.75;
  109.     break;
  110.   case 4:
  111.     splatConfig.xScale *= -1.0;
  112.     break;
  113.   case 5:
  114.     splatConfig.yScale *= -1.0;
  115.     break;
  116.   case 6:
  117.     splatConfig.alphaTest = GL_TRUE;
  118.     break;
  119.   case 7:
  120.     splatConfig.alphaTest = GL_FALSE;
  121.     break;
  122.   case 411:
  123.     glGetFloatv(GL_CURRENT_RASTER_POSITION, rpos);
  124.     glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid);
  125.     printf("Raster position (%g,%g) is %sn",
  126.       rpos[0], rpos[1], valid ? "valid" : "INVALID");
  127.     break;
  128.   case 666:
  129.     exit(0);
  130.     break;
  131.   }
  132. }
  133. void
  134. scaleBiasSelect(int value)
  135. {
  136.   int color = value >> 4;
  137.   int option = value & 0xf;
  138.   switch(option) {
  139.   case 1:
  140.     splatConfig.bias[color] += 0.25;
  141.     break;
  142.   case 2:
  143.     splatConfig.bias[color] -= 0.25;
  144.     break;
  145.   case 3:
  146.     splatConfig.scale[color] *= 2.0;
  147.     break;
  148.   case 4:
  149.     splatConfig.scale[color] *= 0.75;
  150.     break;
  151.   }
  152. }
  153. int
  154. glutScaleBiasMenu(int mask)
  155. {
  156.   int menu;
  157.   menu = glutCreateMenu(scaleBiasSelect);
  158.   glutAddMenuEntry("+25% bias", mask | 1);
  159.   glutAddMenuEntry("-25% bias", mask | 2);
  160.   glutAddMenuEntry("+25% scale", mask | 3);
  161.   glutAddMenuEntry("-25% scale", mask | 4);
  162.   return menu;
  163. }
  164. int
  165. main(int argc, char *argv[])
  166. {
  167.   int mainMenu, redMenu, greenMenu, blueMenu;
  168.   glutInitWindowSize(680, 440);
  169.   glutInit(&argc, argv);
  170.   splatConfig = splatDefault;
  171.   glutCreateWindow("splatlogo");
  172.   glutReshapeFunc(reshape);
  173.   glutDisplayFunc(display);
  174.   glutMouseFunc(mouse);
  175.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  176.   glAlphaFunc(GL_GEQUAL, 0.5);
  177.   glDisable(GL_ALPHA_TEST);
  178.   glEnable(GL_DITHER);
  179.   glClearColor(1.0, 1.0, 1.0, 0.0);
  180.   redMenu = glutScaleBiasMenu(0 << 4);
  181.   greenMenu = glutScaleBiasMenu(1 << 4);
  182.   blueMenu = glutScaleBiasMenu(2 << 4);
  183.   mainMenu = glutCreateMenu(mainSelect);
  184.   glutAddMenuEntry("Reset splays", 0);
  185.   glutAddMenuEntry("Reset splat config", 1);
  186.   glutAddSubMenu("Red control", redMenu);
  187.   glutAddSubMenu("Green control", greenMenu);
  188.   glutAddSubMenu("Blue control", blueMenu);
  189.   glutAddMenuEntry("+25% zoom", 2);
  190.   glutAddMenuEntry("-25% zoom", 3);
  191.   glutAddMenuEntry("X flip", 4);
  192.   glutAddMenuEntry("Y flip", 5);
  193.   glutAddMenuEntry("Enable alpha test", 6);
  194.   glutAddMenuEntry("Disable alpha test", 7);
  195.   glutSetMenu(mainMenu);
  196.   glutAddMenuEntry("Query raster position", 411);
  197.   glutAddMenuEntry("Quit", 666);
  198.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  199.   glutMainLoop();
  200.   return 0; /* Never reached; make ANSI C happy. */
  201. }