plvImageCmds.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:9k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <tk.h>
  3. #include "plvGlobals.h"
  4. #include "plvImageCmds.h"
  5. #include "plvDrawCmds.h"
  6. #include "Image.h"
  7. #include "plvClipBoxCmds.h"
  8. #include "togl.h"
  9. #include "ToglHash.h"
  10. typedef unsigned int uint;
  11. static uint *theZBuf = NULL;
  12. static uchar *theColorBuf = NULL;
  13. int
  14. PlvWriteIrisCmd(ClientData clientData, Tcl_Interp *interp, 
  15. int argc, char *argv[])
  16. {
  17.   struct Togl* togl = toglHash.FindTogl (argv[1]);
  18.   if (!togl) {
  19.     interp->result = "Missing togl in PlvWriteIrisCmd";
  20.     return TCL_ERROR;
  21.   }
  22.   Togl_MakeCurrent (togl);
  23.   int width = Togl_Width (togl);
  24.   int height = Togl_Height (togl);
  25.   Image img (width, height, 4);
  26.   glReadBuffer(GL_FRONT);
  27.   glReadPixels(0, 0, width, height, GL_RGBA, 
  28.        GL_UNSIGNED_BYTE, img);
  29.   if (!img.write(argv[2])) {
  30. #ifdef linux
  31. // give an error message alerting that IFL is not supported under
  32. // Linux
  33. interp->result = "Image saving not supported under Linux";
  34. #else
  35. interp->result = "file creation error";
  36. #endif
  37.     return TCL_ERROR;
  38.   }
  39.   return TCL_OK;
  40.   //#ifdef SGI
  41.   /*
  42.   uchar *cbuf, *pcbuf;
  43.   ushort *sbuf;
  44.   int xx, yy;
  45.   IMAGE *image;
  46.   */
  47.   /*
  48.   image = iopen(argv[2], "w", RLE(1), 3, theWidth, theHeight, 3);
  49.   if (!image)
  50.     return TCL_ERROR;
  51.   cbuf = (uchar *)malloc(theWidth*theHeight*4);
  52.   sbuf = (ushort *)malloc(theWidth*sizeof(ushort));
  53.   */
  54.   /*
  55.   pcbuf = cbuf;
  56.   for (yy = 0; yy < theHeight; yy++, pcbuf += 4*theWidth) {
  57.     for (xx = 0; xx < theWidth; xx++)
  58.       sbuf[xx] = pcbuf[4*xx];
  59.     putrow(image, sbuf, yy, 0);
  60.     for (xx = 0; xx < theWidth; xx++)
  61.       sbuf[xx] = pcbuf[4*xx+1];
  62.     putrow(image, sbuf, yy, 1);
  63.     for (xx = 0; xx < theWidth; xx++)
  64.       sbuf[xx] = pcbuf[4*xx+2];
  65.     putrow(image, sbuf, yy, 2);
  66.   }
  67.   iclose(image);
  68.   free(cbuf);
  69.   free(sbuf);
  70.   */
  71.   //#endif
  72. }
  73. int
  74. PlvCacheBufferCmd(ClientData clientData, Tcl_Interp *interp, 
  75.   int argc, char *argv[])
  76. {
  77.   GLint lastBuffer;
  78.   prepareDrawInWin(argv[1]);
  79.   if (theColorBuf == NULL) {
  80.     theColorBuf = new uchar[theWidth*theHeight*4];
  81.   }
  82.   if (theZBuf == NULL) {
  83.     theZBuf = new uint[theWidth*theHeight];
  84.   }
  85.   glGetIntegerv(GL_DRAW_BUFFER, &lastBuffer);
  86.   glDrawBuffer(GL_FRONT);
  87.   glReadPixels(0, 0, theWidth, theHeight, 
  88.        GL_RGBA, GL_UNSIGNED_BYTE, theColorBuf);
  89.   glReadPixels(0, 0, theWidth, theHeight, 
  90.        GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, theZBuf);
  91.   glDrawBuffer(GLenum(lastBuffer));
  92.   return TCL_OK;
  93. }
  94. int
  95. PlvReloadBufferCmd(ClientData clientData, Tcl_Interp *interp, 
  96.    int argc, char *argv[])
  97. {
  98.   GLint lastBuffer;
  99.   prepareDrawInWin(argv[1]);
  100.   glGetIntegerv(GL_DRAW_BUFFER, &lastBuffer);
  101.   glDrawBuffer(GL_FRONT);
  102.   glDrawPixels(theWidth, theHeight, 
  103.        GL_RGBA, GL_UNSIGNED_BYTE, theColorBuf);
  104.   glDrawPixels(theWidth, theHeight, 
  105.        GL_DEPTH_COMPONENT, GL_INT, theZBuf);
  106.   glDrawBuffer(GLenum(lastBuffer));
  107.   return TCL_OK;
  108. }
  109. /*
  110. void
  111. loadTexture(MeshSet *meshSet, char *texFile, int flipX)
  112. {
  113.   Image img;
  114.   img.read(texFile);
  115.   uchar *tempTexture = new uchar[3*img.width()*img.height()];
  116.   meshSet->texture = new uchar[3*512*512];
  117.   meshSet->newTexture = new uchar[512*512];
  118.   int yy, xx;
  119.   if (img.width() != 512) {
  120.     for (yy = 0; yy < img.height(); yy++) {
  121.       for (xx = 0; xx < 512; xx++) {
  122. float xoff = xx/512.0*img.width();
  123. int xint = int(xoff);
  124. float dx = xoff - xint;
  125. uchar *tmp = &meshSet->texture[xx*3+yy*3*512];
  126. uchar *tmp0 = img.getValues(xint, yy);
  127. uchar *tmp1 = img.getValues(xint+1, yy);
  128. tmp[0] = uchar((1-dx)*tmp0[0] + dx*tmp1[0]);
  129. tmp[1] = uchar((1-dx)*tmp0[1] + dx*tmp1[1]);
  130. tmp[2] = uchar((1-dx)*tmp0[2] + dx*tmp1[2]);
  131.       }
  132.     }
  133.   } else {
  134.     if (!flipX) {
  135.       for (yy = 0; yy < img.height(); yy++) {
  136. for (xx = 0; xx < img.width(); xx++) {
  137.   uchar *tmp = &meshSet->texture[xx*3+yy*3*512];
  138.   uchar *tmp0 = img.getValues(xx, yy);
  139.   tmp[0] = tmp0[0];
  140.   tmp[1] = tmp0[1];
  141.   tmp[2] = tmp0[2];
  142. }
  143.       }
  144.     }
  145.     else {
  146.       for (yy = 0; yy < img.height(); yy++) {
  147. for (xx = 0; xx < img.width(); xx++) {
  148.   uchar *tmp = &meshSet->texture[xx*3+yy*3*512];
  149.   uchar *tmp0 = img.getValues(img.width()-xx-1, yy);
  150.   tmp[0] = tmp0[0];
  151.   tmp[1] = tmp0[1];
  152.   tmp[2] = tmp0[2];
  153. }
  154.       }
  155.     }
  156.   }
  157.   delete [] tempTexture;
  158.   
  159.   meshSet->hasTexture = TRUE;
  160.   meshSet->texXdim = 512;
  161.   meshSet->texYdim = 512;
  162. #if 0
  163. #ifdef SGI
  164.     int xx, yy;
  165.     ImgUchar *texture = new ImgUchar;
  166.     texture->readIris(texFile);
  167.     uchar *tempTexture = new uchar[3*texture->xdim*texture->ydim];
  168.     meshSet->texture = new uchar[3*512*512];
  169.     meshSet->newTexture = new uchar[512*512];
  170.     // Hack! Resample in x only for some troublesome Cyberware
  171.     //  cyl scans
  172.     if (texture->xdim != 512) {
  173. for (yy = 0; yy < texture->ydim; yy++) {
  174.     for (xx = 0; xx < 512; xx++) {
  175. float xoff = xx/512.0*texture->xdim;
  176. int xint = int(xoff);
  177. float dx = xoff - xint;
  178. meshSet->texture[0+xx*3+yy*3*512] = 
  179.     uchar((1-dx)*texture->elem(xint, yy, 0) 
  180.   + dx*texture->elem(xint+1, yy, 0));
  181.     
  182. meshSet->texture[1+xx*3+yy*3*512] = 
  183.     uchar((1-dx)*texture->elem(xint, yy, 1) 
  184.   + dx*texture->elem(xint+1, yy, 1));
  185.     
  186. meshSet->texture[2+xx*3+yy*3*512] = 
  187.     uchar((1-dx)*texture->elem(xint, yy, 2) 
  188.   + dx*texture->elem(xint+1, yy, 2));
  189.     }
  190. }
  191.     } else {
  192. if (!flipX) {
  193.     for (yy = 0; yy < texture->ydim; yy++) {
  194. for (xx = 0; xx < texture->xdim; xx++) {
  195.     meshSet->texture[0+xx*3+yy*3*512] = 
  196. texture->elem(xx, yy, 0);
  197.     meshSet->texture[1+xx*3+yy*3*512] = 
  198. texture->elem(xx, yy, 1);
  199.     meshSet->texture[2+xx*3+yy*3*512] = 
  200. texture->elem(xx, yy, 2);
  201. }
  202.     }
  203. }
  204. else {
  205.     for (yy = 0; yy < texture->ydim; yy++) {
  206. for (xx = 0; xx < texture->xdim; xx++) {
  207.     meshSet->texture[0+xx*3+yy*3*512] = 
  208. texture->elem(texture->xdim-xx-1, yy, 0);
  209.     meshSet->texture[1+xx*3+yy*3*512] = 
  210. texture->elem(texture->xdim-xx-1, yy, 1);
  211.     meshSet->texture[2+xx*3+yy*3*512] = 
  212. texture->elem(texture->xdim-xx-1, yy, 2);
  213. }
  214.     }
  215. }
  216.     }
  217.     
  218.     
  219. //  for (yy = 0; yy < texture->ydim; yy++) {
  220. //      for (xx = 0; xx < texture->xdim; xx++) {
  221. //  tempTexture[0+xx*3+yy*3*texture->xdim] = 
  222. //      texture->elem(xx, yy, 0);
  223. //  tempTexture[1+xx*3+yy*3*texture->xdim] = 
  224. //      texture->elem(xx, yy, 1);
  225. //  tempTexture[2+xx*3+yy*3*texture->xdim] = 
  226. //      texture->elem(xx, yy, 2);
  227. //      }
  228. //  }
  229. //  gluScaleImage(GL_RGB, texture->xdim, texture->ydim, GL_UNSIGNED_BYTE,
  230. //        tempTexture, 512, 512, 
  231. //        GL_UNSIGNED_BYTE, meshSet->texture); 
  232.     delete [] tempTexture;
  233.     
  234.     meshSet->hasTexture = TRUE;
  235.     meshSet->texXdim = 512;
  236.     meshSet->texYdim = 512;
  237.     delete texture;
  238. #endif
  239. #endif
  240. }
  241. */
  242. // Count the number of pixels in the image region
  243. // who's RGB values fall in the given range
  244. int countPixInRange (int x, int y, int w, int h,
  245.      int lowR, int lowG, int lowB,
  246.      int highR, int highG, int highB)
  247. {
  248.   typedef struct {unsigned char r,g,b,a;} pix;
  249.     unsigned char *img = (unsigned char *) new char[(w+1)*(h+1)*4];
  250.     
  251.     glReadBuffer(GL_FRONT);
  252.     glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img);
  253.     int count=0;
  254.     for (int i=0; i<w*h; i=i+4)
  255.       {
  256. pix &p=*((pix *)img+i);
  257. if (p.r >= lowR && p.r <= highR &&
  258.     p.g >= lowG && p.g <= highG &&
  259.     p.b >= lowB && p.b <= highB)
  260.   {
  261.     count++;
  262.   }
  263.       }
  264.     
  265.     delete [] img;
  266.     return count;
  267. }
  268. int PlvCountPixelsCmd (ClientData clientData, Tcl_Interp *interp, 
  269.        int argc, char *argv[])
  270. {
  271.   int x,w,y,h;
  272.   
  273.   if (argc==4 || argc==7)
  274.     {
  275.       // Use selection box
  276.       // Find Rectangle
  277.       if (theSel.type == Selection::rect)
  278. {
  279.    x = min (theSel[0].x, theSel[2].x);
  280.    w = abs (theSel[0].x - theSel[2].x);
  281.    y = min (theSel[0].y, theSel[2].y);
  282.    h = abs (theSel[0].y - theSel[2].y);
  283. }
  284.       else
  285. {
  286.   interp->result="Need to have a rectangle selected";
  287.   return TCL_ERROR;
  288. }
  289.      
  290.     }
  291.   else if (argc==11)
  292.     {
  293.       // Count pix in specified rectangle in specified range
  294.       x = atoi(argv[7]);
  295.       y = atoi(argv[8]);
  296.       w = atoi(argv[9]) -x;
  297.       h = atoi(argv[10]) -y;
  298.     }
  299.   else
  300.     {
  301.       // Usage
  302.       char buf[2048]="";
  303.       strcat (buf,"n");
  304.       strcat (buf,"Usage: plv_countPixels RGB_min [RGB_max] [Bounding_Rect_LTRB]n");
  305.       strcat (buf,"  plv_countPixels 0 0 0 - counts all black pixels in current selectionn");
  306.       strcat (buf,"  plv_countPixels 0 0 200 255 255 255 - counts pixels with high blue valuesn");
  307.       strcat (buf,"  plv_countPixels 0 0 0 0 0 0 100 150 200 200 - counts black pixels in then    rect bounded by (100,150) and (200,200).n");
  308.       strcat (buf,"n");
  309.       Tcl_SetResult(interp,buf,TCL_VOLATILE);
  310.       return TCL_ERROR;
  311.     }
  312.   // Count pix  with specified value
  313.   int Rmin,Gmin,Bmin;
  314.   int Rmax,Gmax,Bmax;
  315.   
  316.   Rmin=atoi(argv[1]);
  317.   Gmin=atoi(argv[2]);
  318.   Bmin=atoi(argv[3]);
  319.   if (argc==4)
  320.     {
  321.       // default max to min
  322.       Rmax=Rmin;
  323.       Gmax=Gmin;
  324.       Bmax=Bmin;
  325.     }
  326.   else
  327.     {
  328.       // explicitly set max
  329.       Rmax=atoi(argv[4]);
  330.       Gmax=atoi(argv[5]);
  331.       Bmax=atoi(argv[6]);
  332.     }
  333.   int count = countPixInRange(x,y,w,h,Rmin,Gmin,Bmin,Rmax,Gmax,Bmax);
  334.   sprintf(interp->result,"%d",count);
  335.       
  336.   return TCL_OK;
  337. }