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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1997. */
  2. /* This program is freely distributable without licensing fees  and is
  3.    provided without guarantee or warrantee expressed or  implied. This
  4.    program is -not- in the public domain. */
  5. /* X compile line: cc -o showtxf showtxf.c texfont.c -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm */
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. #include "TexFont.h"
  11. unsigned char *raster;
  12. int imgwidth, imgheight;
  13. int max_ascent, max_descent;
  14. int len;
  15. int ax = 0, ay = 0;
  16. int doubleBuffer = 1, verbose = 0;
  17. char *filename = "default.txf";
  18. TexFont *txf;
  19. /* If resize is called, enable drawing into the full screen area
  20.    (glViewport). Then setup the modelview and projection matrices to map 2D
  21.    x,y coodinates directly onto pixels in the window (lower left origin).
  22.    Then set the raster position (where the image would be drawn) to be offset
  23.    from the upper left corner, and then offset by the current offset (using a
  24.    null glBitmap). */
  25. void
  26. reshape(int w, int h)
  27. {
  28.   glViewport(0, 0, w, h);
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity();
  31.   gluOrtho2D(0, w, 0, h);
  32.   glMatrixMode(GL_MODELVIEW);
  33.   glLoadIdentity();
  34.   glTranslatef(0, h - imgheight, 0);
  35.   glRasterPos2i(0, 0);
  36.   glBitmap(0, 0, 0, 0, ax, -ay, NULL);
  37. }
  38. void
  39. display(void)
  40. {
  41.   /* Clear the color buffer. */
  42.   glClear(GL_COLOR_BUFFER_BIT);
  43.   /* Re-blit the image. */
  44.   glDrawPixels(imgwidth, imgheight,
  45.     GL_LUMINANCE, GL_UNSIGNED_BYTE,
  46.     txf->teximage);
  47.   /* Swap the buffers if necessary. */
  48.   if (doubleBuffer) {
  49.     glutSwapBuffers();
  50.   }
  51. }
  52. static int moving = 0, ox, oy;
  53. void
  54. mouse(int button, int state, int x, int y)
  55. {
  56.   if (button == GLUT_LEFT_BUTTON) {
  57.     if (state == GLUT_DOWN) {
  58.       /* Left mouse button press.  Update last seen mouse position. And set
  59.          "moving" true since button is pressed. */
  60.       ox = x;
  61.       oy = y;
  62.       moving = 1;
  63.     } else {
  64.       /* Left mouse button released; unset "moving" since button no longer
  65.          pressed. */
  66.       moving = 0;
  67.     }
  68.   }
  69. }
  70. void
  71. motion(int x, int y)
  72. {
  73.   /* If there is mouse motion with the left button held down... */
  74.   if (moving) {
  75.     /* Figure out the offset from the last mouse position seen. */
  76.     ax += (x - ox);
  77.     ay += (y - oy);
  78.     /* Offset the raster position based on the just calculated mouse position
  79.        delta.  Use a null glBitmap call to offset the raster position in
  80.        window coordinates. */
  81.     glBitmap(0, 0, 0, 0, x - ox, oy - y, NULL);
  82.     /* Request a window redraw. */
  83.     glutPostRedisplay();
  84.     /* Update last seen mouse position. */
  85.     ox = x;
  86.     oy = y;
  87.   }
  88. }
  89. int
  90. main(int argc, char **argv)
  91. {
  92.   int i;
  93.   glutInit(&argc, argv);
  94.   for (i = 1; i < argc; i++) {
  95.     if (!strcmp(argv[i], "-sb")) {
  96.       doubleBuffer = 0;
  97.     } else if (!strcmp(argv[i], "-v")) {
  98.       verbose = 1;
  99.     } else {
  100.       filename = argv[i];
  101.     }
  102.   }
  103.   if (filename == NULL) {
  104.     fprintf(stderr, "usage: showtxf [GLUT-options] [-sb] [-v] txf-filen");
  105.     exit(1);
  106.   }
  107.   txf = txfLoadFont(filename);
  108.   if (txf == NULL) {
  109.     fprintf(stderr, "Problem loading %sn", filename);
  110.     exit(1);
  111.   }
  112.   imgwidth = txf->tex_width;
  113.   imgheight = txf->tex_height;
  114.   if (doubleBuffer) {
  115.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  116.   } else {
  117.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  118.   }
  119.   glutInitWindowSize(imgwidth, imgheight);
  120.   glutCreateWindow(filename);
  121.   glutReshapeFunc(reshape);
  122.   glutDisplayFunc(display);
  123.   glutMouseFunc(mouse);
  124.   glutMotionFunc(motion);
  125.   /* Use a gray background so teximage with black backgrounds will show
  126.      against showtxf's background. */
  127.   glClearColor(0.2, 0.2, 0.2, 1.0);
  128.   glutMainLoop();
  129.   return 0;             /* ANSI C requires main to return int. */
  130. }