home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / stretch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  7.3 KB  |  347 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <math.h>
  7. #include "tk.h"
  8.  
  9. #if defined(__MWERKS__) || defined(__SC__)
  10.     #include <console.h>            /* ccommand */
  11. #endif
  12.  
  13.  
  14. #define STEPCOUNT 40
  15. #define MAX(a, b) (((a) > (b)) ? (a) : (b))
  16. #define MIN(a, b) (((a) < (b)) ? (a) : (b))
  17.  
  18.  
  19. enum {
  20.     OP_NOOP = 0,
  21.     OP_STRETCH,
  22.     OP_DRAWPOINT,
  23.     OP_DRAWIMAGE
  24. };
  25.  
  26.  
  27. typedef struct _c_rec {
  28.     float x, y;
  29. } c_rec;
  30.  
  31. typedef struct _vertexRec {
  32.     float x, y;
  33.     float dX, dY;
  34.     float tX, tY;
  35. } vertexRec;
  36.  
  37.  
  38. GLenum doubleBuffer, directRender;
  39. int imageSizeX, imageSizeY;
  40. char *fileName = 0;
  41. TK_RGBImageRec *image;
  42. c_rec c_list[50];
  43. vertexRec vList[5];
  44. int cCount, cIndex[2], cStep;
  45. GLenum op = OP_NOOP;
  46.  
  47.  
  48. void DrawImage(void)
  49. {
  50.  
  51.     glRasterPos2i(0, 0);
  52.     glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
  53.          image->data);
  54.  
  55.     glFlush();
  56.     if (doubleBuffer) {
  57.     tkSwapBuffers();
  58.     }
  59.  
  60.     glRasterPos2i(0, 0);
  61.     glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
  62.          image->data);
  63. }
  64.  
  65. void DrawPoint(void)
  66. {
  67.     int i;
  68.  
  69.     glColor3f(1.0, 0.0, 1.0);
  70.     glPointSize(3.0);
  71.     glBegin(GL_POINTS);
  72.     for (i = 0; i < cCount; i++) {
  73.         glVertex2f(c_list[i].x, c_list[i].y);
  74.     }
  75.     glEnd();
  76.  
  77.     glFlush();
  78.     if (doubleBuffer) {
  79.     tkSwapBuffers();
  80.     }
  81. }
  82.  
  83. void InitVList(void)
  84. {
  85.  
  86.     vList[0].x = 0.0;
  87.     vList[0].y = 0.0;
  88.     vList[0].dX = 0.0;
  89.     vList[0].dY = 0.0;
  90.     vList[0].tX = 0.0;
  91.     vList[0].tY = 0.0;
  92.  
  93.     vList[1].x = (float)imageSizeX;
  94.     vList[1].y = 0.0;
  95.     vList[1].dX = 0.0;
  96.     vList[1].dY = 0.0;
  97.     vList[1].tX = 1.0;
  98.     vList[1].tY = 0.0;
  99.  
  100.     vList[2].x = (float)imageSizeX;
  101.     vList[2].y = (float)imageSizeY;
  102.     vList[2].dX = 0.0;
  103.     vList[2].dY = 0.0;
  104.     vList[2].tX = 1.0;
  105.     vList[2].tY = 1.0;
  106.  
  107.     vList[3].x = 0.0;
  108.     vList[3].y = (float)imageSizeY;
  109.     vList[3].dX = 0.0;
  110.     vList[3].dY = 0.0;
  111.     vList[3].tX = 0.0;
  112.     vList[3].tY = 1.0;
  113.  
  114.     vList[4].x = c_list[0].x;
  115.     vList[4].y = c_list[0].y;
  116.     vList[4].dX = (c_list[1].x - c_list[0].x) / STEPCOUNT;
  117.     vList[4].dY = (c_list[1].y - c_list[0].y) / STEPCOUNT;
  118.     vList[4].tX = c_list[0].x / (float)imageSizeX;
  119.     vList[4].tY = c_list[0].y / (float)imageSizeY;
  120. }
  121.  
  122. void ScaleImage(int sizeX, int sizeY)
  123. {
  124.     GLubyte *buf;
  125.  
  126.     buf = (GLubyte *)malloc(3*sizeX*sizeY);
  127.     gluScaleImage(GL_RGB, image->sizeX, image->sizeY, GL_UNSIGNED_BYTE,
  128.                   image->data, sizeX, sizeY, GL_UNSIGNED_BYTE, buf);
  129.     free(image->data);
  130.     image->data = buf;
  131.     image->sizeX = sizeX;
  132.     image->sizeY = sizeY;
  133. }
  134.  
  135. void SetPoint(int x, int y)
  136. {
  137.  
  138.     c_list[cCount].x = (float)x;
  139.     c_list[cCount].y = (float)y;
  140.     cCount++;
  141. }
  142.  
  143. void Stretch(void)
  144. {
  145.  
  146.     glBegin(GL_TRIANGLES);
  147.     glTexCoord2f(vList[0].tX, vList[0].tY);
  148.     glVertex2f(vList[0].x, vList[0].y);
  149.     glTexCoord2f(vList[1].tX, vList[1].tY);
  150.     glVertex2f(vList[1].x, vList[1].y);
  151.     glTexCoord2f(vList[4].tX, vList[4].tY);
  152.     glVertex2f(vList[4].x, vList[4].y);
  153.     glEnd();
  154.  
  155.     glBegin(GL_TRIANGLES);
  156.     glTexCoord2f(vList[1].tX, vList[1].tY);
  157.     glVertex2f(vList[1].x, vList[1].y);
  158.     glTexCoord2f(vList[2].tX, vList[2].tY);
  159.     glVertex2f(vList[2].x, vList[2].y);
  160.     glTexCoord2f(vList[4].tX, vList[4].tY);
  161.     glVertex2f(vList[4].x, vList[4].y);
  162.     glEnd();
  163.  
  164.     glBegin(GL_TRIANGLES);
  165.     glTexCoord2f(vList[2].tX, vList[2].tY);
  166.     glVertex2f(vList[2].x, vList[2].y);
  167.     glTexCoord2f(vList[3].tX, vList[3].tY);
  168.     glVertex2f(vList[3].x, vList[3].y);
  169.     glTexCoord2f(vList[4].tX, vList[4].tY);
  170.     glVertex2f(vList[4].x, vList[4].y);
  171.     glEnd();
  172.  
  173.     glBegin(GL_TRIANGLES);
  174.     glTexCoord2f(vList[3].tX, vList[3].tY);
  175.     glVertex2f(vList[3].x, vList[3].y);
  176.     glTexCoord2f(vList[0].tX, vList[0].tY);
  177.     glVertex2f(vList[0].x, vList[0].y);
  178.     glTexCoord2f(vList[4].tX, vList[4].tY);
  179.     glVertex2f(vList[4].x, vList[4].y);
  180.     glEnd();
  181.  
  182.     glFlush();
  183.     if (doubleBuffer) {
  184.     tkSwapBuffers();
  185.     }
  186.  
  187.     if (++cStep < STEPCOUNT) {
  188.     vList[4].x += vList[4].dX;
  189.     vList[4].y += vList[4].dY;
  190.     } else {
  191.     cIndex[0] = cIndex[1];
  192.     cIndex[1] = cIndex[1] + 1;
  193.     if (cIndex[1] == cCount) {
  194.         cIndex[1] = 0;
  195.     }
  196.     vList[4].dX = (c_list[cIndex[1]].x - c_list[cIndex[0]].x) / STEPCOUNT;
  197.     vList[4].dY = (c_list[cIndex[1]].y - c_list[cIndex[0]].y) / STEPCOUNT;
  198.     cStep = 0;
  199.     }
  200. }
  201.  
  202. GLenum Key(int key, GLenum mask)
  203. {
  204.  
  205.     switch (key) {
  206.       case TK_ESCAPE:
  207.     free(image->data);
  208.         tkQuit();
  209.       case TK_SPACE:
  210.     if (cCount > 1) {
  211.         InitVList();
  212.         cIndex[0] = 0;
  213.         cIndex[1] = 1;
  214.         cStep = 0;
  215.         glEnable(GL_TEXTURE_2D);
  216.         op = OP_STRETCH;
  217.     }
  218.     break;
  219.       default:
  220.     return GL_FALSE;
  221.     }
  222.     return GL_TRUE;
  223. }
  224.  
  225. GLenum Mouse(int mouseX, int mouseY, GLenum button)
  226. {
  227.  
  228.     if (op == OP_STRETCH) {
  229.     glDisable(GL_TEXTURE_2D);
  230.     cCount = 0;
  231.     op = OP_DRAWIMAGE;
  232.     } else {
  233.     SetPoint(mouseX, imageSizeY-mouseY);
  234.     op = OP_DRAWPOINT;
  235.     }
  236.     return GL_TRUE;
  237. }
  238.  
  239. void Animate(void)
  240. {
  241.  
  242.     switch (op) {
  243.       case OP_STRETCH:
  244.     Stretch();
  245.     break;
  246.       case OP_DRAWPOINT:
  247.     DrawPoint();
  248.     break;
  249.       case OP_DRAWIMAGE:
  250.     DrawImage();
  251.     break;
  252.     }
  253. }
  254.  
  255. static GLenum Args(int argc, char **argv)
  256. {
  257.     GLint i;
  258.  
  259.     doubleBuffer = GL_FALSE;
  260.     directRender = GL_TRUE;
  261.  
  262.     for (i = 1; i < argc; i++) {
  263.     if (strcmp(argv[i], "-sb") == 0) {
  264.         doubleBuffer = GL_FALSE;
  265.     } else if (strcmp(argv[i], "-db") == 0) {
  266.         doubleBuffer = GL_TRUE;
  267.     } else if (strcmp(argv[i], "-dr") == 0) {
  268.         directRender = GL_TRUE;
  269.     } else if (strcmp(argv[i], "-ir") == 0) {
  270.         directRender = GL_FALSE;
  271.     } else if (strcmp(argv[i], "-f") == 0) {
  272.         if (i+1 >= argc || argv[i+1][0] == '-') {
  273.         printf("-f (No file name).\n");
  274.         return GL_FALSE;
  275.         } else {
  276.         fileName = argv[++i];
  277.         }
  278.     } else {
  279.         printf("%s (Bad option).\n", argv[i]);
  280.         return GL_FALSE;
  281.     }
  282.     }
  283.     return GL_TRUE;
  284. }
  285.  
  286. void main(int argc, char **argv)
  287. {
  288.     GLenum type;
  289.     
  290.     #if defined(__MWERKS__) || defined(__SC__)
  291.         argc = ccommand(&argv);
  292.     #endif
  293.  
  294.     if (Args(argc, argv) == GL_FALSE) {
  295.     tkQuit();
  296.     }
  297.  
  298.     if (fileName == 0) {
  299.     printf("No image file.\n");
  300.     tkQuit();
  301.     }
  302.  
  303.     image = tkRGBImageLoad(fileName);
  304.  
  305.     imageSizeX = (int)powf(2.0, (float)((int)(logf(image->sizeX)/logf(2.0))));
  306.     imageSizeY = (int)powf(2.0, (float)((int)(logf(image->sizeY)/logf(2.0))));
  307.  
  308.     tkInitPosition(30, 60, imageSizeX, imageSizeY);
  309.  
  310.     type = TK_RGB;
  311.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  312.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  313.     tkInitDisplayMode(type);
  314.  
  315.     if (tkInitWindow("Stretch") == GL_FALSE) {
  316.         tkQuit();
  317.     }
  318.  
  319.     glViewport(0, 0, imageSizeX, imageSizeY);
  320.     gluOrtho2D(0, imageSizeX, 0, imageSizeY);
  321.     glClearColor(0.0, 0.0, 0.0, 0.0);
  322.  
  323.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  324.     glPixelStorei(GL_PACK_ALIGNMENT, 1);
  325.  
  326.     ScaleImage(imageSizeX, imageSizeY);
  327.  
  328.     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  329.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  330.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  331.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  332.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  333.     glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX, image->sizeY, 0,
  334.                  GL_RGB, GL_UNSIGNED_BYTE, (unsigned char *)image->data);
  335.  
  336.     cCount = 0;
  337.     cIndex[0] = 0;
  338.     cIndex[1] = 0;
  339.     cStep = 0;
  340.     op = OP_DRAWIMAGE;
  341.  
  342.     tkKeyDownFunc(Key);
  343.     tkMouseDownFunc(Mouse);
  344.     tkIdleFunc(Animate);
  345.     tkExec();
  346. }
  347.