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

GIS编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6. #include "texture.h"
  7. static char defaultFile[] = "../data/mandrill.rgb";
  8. GLuint *img;
  9. GLsizei w, h;
  10. GLint comp;
  11. GLfloat scale[] = {1, 1, 1}, bias[] = {0, 0, 0};
  12. GLboolean changeScale = 1, changeBias = 1;
  13. GLboolean changeR = 1, changeG = 1, changeB = 1;
  14. void init(void)
  15. {
  16.   glDrawBuffer(GL_FRONT);
  17.   glReadBuffer(GL_BACK);
  18. }
  19. void load_img(const char *fname)
  20. {
  21.   img = read_texture(fname, &w, &h, &comp);
  22.   if (!img) {
  23.     fprintf(stderr, "Could not open %sn", fname);
  24.     exit(1);
  25.   }
  26. }
  27. void reshape(GLsizei winW, GLsizei winH) 
  28. {
  29.     glViewport(0, 0, w, h);
  30.     glLoadIdentity();
  31.     glOrtho(0, winW, 0, winH, 0, 5);
  32. }
  33. void draw(void)
  34. {
  35.     GLenum err;
  36.     glPixelTransferf(GL_RED_SCALE, 1);
  37.     glPixelTransferf(GL_GREEN_SCALE, 1);
  38.     glPixelTransferf(GL_BLUE_SCALE, 1);
  39.     glPixelTransferf(GL_RED_BIAS, 0);
  40.     glPixelTransferf(GL_GREEN_BIAS, 0);
  41.     glPixelTransferf(GL_BLUE_BIAS, 0);
  42.     glClear(GL_COLOR_BUFFER_BIT);
  43.     glDrawBuffer(GL_BACK);
  44.     glRasterPos2i(0, 0);
  45.     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, img);
  46.     glPixelTransferf(GL_RED_SCALE, scale[0]);
  47.     glPixelTransferf(GL_GREEN_SCALE, scale[1]);
  48.     glPixelTransferf(GL_BLUE_SCALE, scale[2]);
  49.     glPixelTransferf(GL_RED_BIAS, bias[0]);
  50.     glPixelTransferf(GL_GREEN_BIAS, bias[1]);
  51.     glPixelTransferf(GL_BLUE_BIAS, bias[2]);
  52.     glDrawBuffer(GL_FRONT);
  53.     glCopyPixels(0, 0, w, h, GL_COLOR);
  54.     err = glGetError();
  55.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  56. }
  57. /* ARGSUSED1 */
  58. void key(unsigned char key, int x, int y)
  59. {
  60.   char change[][30] = {"Not changing", "Changing"};
  61.   switch(key) {
  62.   case 27:
  63.     exit(0);
  64.   case 's':  case 'S':
  65.     changeScale = (changeScale == 0);
  66.     printf("%s scalen", change[changeScale]);
  67.     break;
  68.   case 'i':  case 'I':
  69.     changeBias = (changeBias == 0);
  70.     printf("%s biasn", change[changeBias]);
  71.     break;    
  72.   case 'r':  case 'R':
  73.     changeR = (changeR == 0);
  74.     printf("%s red channeln", change[changeR]);
  75.     break;
  76.   case 'g':  case 'G':
  77.     changeG = (changeG == 0);
  78.     printf("%s green channeln", change[changeG]);
  79.     break;
  80.   case 'b':  case 'B':
  81.     changeB = (changeB == 0);
  82.     printf("%s blue channeln", change[changeB]);
  83.     break;
  84.   case ' ':
  85.     changeScale = changeBias = changeR = changeG = changeB = 1;
  86.     scale[0] = scale[1] = scale[2] = 1;
  87.     bias[0] = bias[1] = bias[2] = 0;
  88.     printf("Resetting alln");
  89.     draw();
  90.     break;
  91.   case '?':
  92.     printf("Scale:n");
  93.     printf("tR:  %fn", scale[0]);
  94.     printf("tG:  %fn", scale[1]);
  95.     printf("tB:  %fn", scale[2]);
  96.     printf("Bias:n");
  97.     printf("tR:  %fn", bias[0]);
  98.     printf("tG:  %fn", bias[1]);
  99.     printf("tB:  %fnn", bias[2]);
  100.   }
  101. }
  102. int lastX, lastY, curX, curY;
  103. void idle(void)
  104. {
  105.   float dScale, dBias;
  106.   if (lastX != curX || lastY != curY) {
  107.     if (changeScale) {
  108.       dScale = (curX - lastX) / (float)w;
  109.       if (changeR) scale[0] += dScale;
  110.       if (changeG) scale[1] += dScale;
  111.       if (changeB) scale[2] += dScale;
  112.     }
  113.     if (changeBias) {
  114.       dBias = (curY - lastY) / (float)h;
  115.       if (changeR) bias[0] += dBias;
  116.       if (changeG) bias[1] += dBias;
  117.       if (changeB) bias[2] += dBias;
  118.     }      
  119.     glPixelTransferf(GL_RED_SCALE, scale[0]);
  120.     glPixelTransferf(GL_GREEN_SCALE, scale[1]);
  121.     glPixelTransferf(GL_BLUE_SCALE, scale[2]);
  122.     glPixelTransferf(GL_RED_BIAS, bias[0]);
  123.     glPixelTransferf(GL_GREEN_BIAS, bias[1]);
  124.     glPixelTransferf(GL_BLUE_BIAS, bias[2]);
  125.     glRasterPos2i(0, 0);
  126.     glCopyPixels(0, 0, w, h, GL_COLOR);
  127.     lastX = curX;
  128.     lastY = curY;
  129.   }
  130. }
  131. void motion(int xpos, int ypos)
  132. {
  133.   curX = xpos;
  134.   curY = (h - ypos);
  135. }
  136. /* ARGSUSED */
  137. void button(int button, int state, int xpos, int ypos)
  138. {
  139.   if (state == GLUT_DOWN) {
  140.     glutIdleFunc(idle); 
  141.     curX = lastX = xpos;
  142.     curY = lastY = (h - ypos);
  143.     return;
  144.   } else {
  145.     glutIdleFunc(0);
  146.   }
  147. }
  148. main(int argc, char *argv[])
  149. {
  150.     glutInit(&argc, argv);
  151.     if (argc > 1) {
  152.       load_img(argv[1]);
  153.     } else {
  154.       load_img(defaultFile);
  155.     }
  156.     glutInitWindowSize(w, h);
  157.     glutInitWindowPosition(0, 0);
  158.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  159.     glutCreateWindow(argv[0]);
  160.     glutDisplayFunc(draw);
  161.     glutKeyboardFunc(key);
  162.     glutReshapeFunc(reshape);
  163.     glutMouseFunc(button);
  164.     glutMotionFunc(motion);
  165.     init();
  166.     glutMainLoop();
  167.     return 0;
  168. }