interp.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 <string.h>
  6. #include <GL/glut.h>
  7. #include "texture.h"
  8. static char defaultFile[] = "../data/mandrill.rgb";
  9. GLuint *img, *black, *avgLum, *lum;
  10. GLsizei w, h;
  11. GLint comp;
  12. GLboolean isIR;
  13. #define RW 0.3086
  14. #define GW 0.6094
  15. #define BW 0.0820
  16. GLuint *in0, *in1;
  17. GLfloat x = 1.;
  18. #define BRIGHTNESS 0
  19. #define CONTRAST 1
  20. #define SATURATION 2
  21. int nOperations = 3;
  22. int operation = 0;
  23. void set_img_pointers(void)
  24. {
  25.     switch(operation) {
  26.     case CONTRAST:
  27. in0 = avgLum;
  28. printf("modifying contrastn");
  29. break;
  30.     case SATURATION:
  31. in0 = lum;
  32. printf("modifying saturationn");
  33. break;
  34.     case BRIGHTNESS:
  35. in0 = black;
  36. printf("modifying brightnessn");
  37. break;
  38.     default:
  39. assert(0);
  40.     }
  41. }
  42. void init(void)
  43. {
  44.     const char *renderer;
  45.     set_img_pointers();
  46.     renderer = (char*) glGetString(GL_RENDERER);
  47.     isIR = (renderer[0] == 'I' && renderer[1] == 'R');
  48. }
  49. GLuint *alloc_image(void)
  50. {
  51.     GLuint *ptr;
  52.     ptr = (GLuint *)malloc(w * h * sizeof(GLuint));
  53.     if (!ptr) {
  54. fprintf(stderr, "malloc of %d bytes failed.n", w * h * sizeof(GLuint));
  55.     }
  56.     return ptr;
  57. }
  58. void load_img(const char *fname)
  59. {
  60.     int i;
  61.     GLubyte *src, *dst;
  62.     GLfloat pix, avg;
  63.     img = read_texture(fname, &w, &h, &comp);
  64.     if (!img) {
  65. fprintf(stderr, "Could not open %sn", fname);
  66. exit(1);
  67.     }
  68.     black = alloc_image();
  69.     memset(black, 0, w * h * sizeof(GLuint));
  70.     lum = alloc_image();
  71.     src = (GLubyte *)img;
  72.     dst = (GLubyte *)lum;
  73.     avg = 0.;
  74.     /* compute average luminance at same time that we set luminance image.
  75.      * note that little care is taken to avoid mathematical error when
  76.      * computing overall average... */
  77.     for (i = 0; i < w * h; i++) {
  78. pix = (float)src[0]*RW + (float)src[1]*GW + (float)src[2]*BW;
  79. if (pix > 255) pix = 255;
  80. dst[0] = dst[1] = dst[2] = pix;
  81. avg += pix / 255.;
  82. src += 4;
  83. dst += 4;
  84.     }
  85.     avgLum = alloc_image();
  86.     pix = avg * 255. / (float)(w*h);
  87.     dst = (GLubyte *)avgLum;
  88.     for (i = 0; i < w * h; i++) {
  89. dst[0] = dst[1] = dst[2] = pix;
  90. dst += 4;
  91.     }
  92. }
  93. void reshape(GLsizei winW, GLsizei winH) 
  94. {
  95.     glViewport(0, 0, w, h);
  96.     glLoadIdentity();
  97.     glOrtho(0, winW, 0, winH, 0, 5);
  98. }
  99. void draw(void)
  100. {
  101.     GLenum err;
  102.     GLfloat s, absx, abs1minusx;
  103.     glClear(GL_COLOR_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);
  104.     glRasterPos2i(0, 0);
  105.     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, in0);
  106.     absx = fabs(x);
  107.     abs1minusx = fabs(1.-x);
  108.     s = absx > abs1minusx ? absx : abs1minusx;
  109.     if (!isIR) {
  110. glAccum(GL_ACCUM, (1. - x) / s);
  111. glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, in1);
  112. glAccum(GL_ACCUM, x/s);
  113. glAccum(GL_RETURN, s);
  114.     } else {
  115. if (fabs(x) < 1. && fabs(1. - x) < 1) {
  116.     glAccum(GL_ACCUM, 1. - x);
  117.     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, in1);
  118.     glAccum(GL_ACCUM, x);
  119.     glAccum(GL_RETURN, 1);
  120. } else {
  121.     absx = fabs(x);
  122.     abs1minusx = fabs(1.-x);
  123.     s = absx > abs1minusx ? absx : abs1minusx;
  124.     glAccum(GL_ACCUM, .8 * ((1. - x) / s));
  125.     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, in1);
  126.     glAccum(GL_ACCUM, .8 * x/s);
  127.     glAccum(GL_RETURN, 1.2 * s);
  128. }
  129.     }
  130.     err = glGetError();
  131.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  132.     glutSwapBuffers();
  133. }
  134. /* ARGSUSED1 */
  135. void key(unsigned char key, int xpos, int ypos)
  136. {
  137.     if (key == 27) exit(0);
  138.     operation = (operation + 1) % nOperations;
  139.     set_img_pointers();
  140.     draw();
  141. }
  142. int mouseOriginX;
  143. int moveCalled = 0;
  144. float deltaSinceDraw = 0.;
  145. void idle(void);
  146. void clamp_x(void)
  147. {
  148.     if (x > 3.99 && isIR) x = 3.99;
  149.     else if (x < -4. && isIR) x = -4.;
  150. }
  151. /* ARGSUSED */
  152. void button(int button, int state, int xpos, int ypos)
  153. {
  154.     if (state == GLUT_DOWN) {
  155. mouseOriginX = xpos;
  156. deltaSinceDraw = 0;
  157. glutIdleFunc(idle);
  158. return;
  159.     }
  160.     if (!moveCalled) {
  161. if (button == GLUT_MIDDLE_BUTTON) x = 1.;
  162. else x = (float)xpos / ((float)w / 2.);
  163. clamp_x();
  164. deltaSinceDraw = 100000.;
  165.     } 
  166.     moveCalled = 0;
  167.     if (deltaSinceDraw) draw();
  168.     printf("x = %fn", x);
  169.     glutIdleFunc(NULL);
  170. }
  171. void menu(int val) 
  172. {
  173.     operation = val;
  174.     set_img_pointers();
  175.     draw();
  176. }
  177. void idle(void)
  178. {
  179.     if (deltaSinceDraw) {
  180. x += deltaSinceDraw;
  181. clamp_x();
  182. draw();
  183. deltaSinceDraw = 0;
  184.     }
  185. }
  186. /* ARGSUSED */
  187. void motion(int xpos, int ypos)
  188. {
  189.     float delta = xpos - mouseOriginX;
  190.     mouseOriginX = xpos;
  191.     moveCalled = 1;
  192.     delta /= w/2.;
  193.     deltaSinceDraw += delta;
  194. }
  195. main(int argc, char *argv[])
  196. {
  197.     glutInit(&argc, argv);
  198.     if (argc > 1) {
  199. load_img(argv[1]);
  200.     } else {
  201. load_img(defaultFile);
  202.     }
  203.     in0 = black;
  204.     in1 = img;
  205.     operation = BRIGHTNESS;
  206.     glutInitWindowSize(w, h);
  207.     glutInitWindowPosition(0, 0);
  208.     glutInitDisplayMode(GLUT_RGB | GLUT_ACCUM | GLUT_DOUBLE);
  209.     glutCreateWindow(argv[0]);
  210.     glutDisplayFunc(draw);
  211.     glutKeyboardFunc(key);
  212.     glutMotionFunc(motion);
  213.     glutMouseFunc(button);
  214.     glutReshapeFunc(reshape);
  215.     glutCreateMenu(menu);
  216.     glutAddMenuEntry("Change brightness", 0);
  217.     glutAddMenuEntry("Change contrast", 1);
  218.     glutAddMenuEntry("Change saturation", 2);
  219.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  220.     init();
  221.     glutMainLoop();
  222.     return 0;
  223. }