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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. */
  2. /* This program is freely distributable without licensing fees 
  3.    and is provided without guarantee or warrantee expressed or 
  4.    implied. This program is -not- in the public domain. */
  5. #include <stdlib.h>
  6. #include "glutint.h"
  7. #define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))
  8. /* CENTRY */
  9. void APIENTRY
  10. glutSetColor(int ndx, GLfloat red, GLfloat green, GLfloat blue)
  11. {
  12.   GLUTcolormap *cmap, *newcmap;
  13.   XVisualInfo *vis;
  14.   XColor color;
  15.   int i;
  16.   if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  17.     cmap = __glutCurrentWindow->colormap;
  18.     vis = __glutCurrentWindow->vis;
  19.   } else {
  20.     cmap = __glutCurrentWindow->overlay->colormap;
  21.     vis = __glutCurrentWindow->overlay->vis;
  22.     if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
  23.       __glutWarning(
  24.         "glutSetColor: cannot set color of overlay transparent index %dn",
  25.         ndx);
  26.       return;
  27.     }
  28.   }
  29.   if (!cmap) {
  30.     __glutWarning("glutSetColor: current window is RGBA");
  31.     return;
  32.   }
  33. #if defined(_WIN32)
  34.   if (ndx >= 256 ||     /* always assume 256 colors on Win32 */
  35. #else
  36.   if (ndx >= vis->visual->map_entries ||
  37. #endif
  38.     ndx < 0) {
  39.     __glutWarning("glutSetColor: index %d out of range", ndx);
  40.     return;
  41.   }
  42.   if (cmap->refcnt > 1) {
  43.     newcmap = __glutAssociateNewColormap(vis);
  44.     cmap->refcnt--;
  45.     /* Wouldn't it be nice if XCopyColormapAndFree could be
  46.        told not to free the old colormap's entries! */
  47.     for (i = cmap->size - 1; i >= 0; i--) {
  48.       if (i == ndx) {
  49.         /* We are going to set this cell shortly! */
  50.         continue;
  51.       }
  52.       if (cmap->cells[i].component[GLUT_RED] >= 0.0) {
  53.         color.pixel = i;
  54.         newcmap->cells[i].component[GLUT_RED] =
  55.           cmap->cells[i].component[GLUT_RED];
  56.         color.red = (GLfloat) 0xffff *
  57.           cmap->cells[i].component[GLUT_RED];
  58.         newcmap->cells[i].component[GLUT_GREEN] =
  59.           cmap->cells[i].component[GLUT_GREEN];
  60.         color.green = (GLfloat) 0xffff *
  61.           cmap->cells[i].component[GLUT_GREEN];
  62.         newcmap->cells[i].component[GLUT_BLUE] =
  63.           cmap->cells[i].component[GLUT_BLUE];
  64.         color.blue = (GLfloat) 0xffff *
  65.           cmap->cells[i].component[GLUT_BLUE];
  66.         color.flags = DoRed | DoGreen | DoBlue;
  67. #if defined(_WIN32)
  68.         if (IsWindowVisible(__glutCurrentWindow->win)) {
  69.           XHDC = __glutCurrentWindow->hdc;
  70.         } else {
  71.           XHDC = 0;
  72.         }
  73. #endif
  74.         XStoreColor(__glutDisplay, newcmap->cmap, &color);
  75.       } else {
  76.         /* Leave unallocated entries unallocated. */
  77.       }
  78.     }
  79.     cmap = newcmap;
  80.     if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  81.       __glutCurrentWindow->colormap = cmap;
  82.       __glutCurrentWindow->cmap = cmap->cmap;
  83.     } else {
  84.       __glutCurrentWindow->overlay->colormap = cmap;
  85.       __glutCurrentWindow->overlay->cmap = cmap->cmap;
  86.     }
  87.     XSetWindowColormap(__glutDisplay,
  88.       __glutCurrentWindow->renderWin, cmap->cmap);
  89. #if !defined(_WIN32)
  90.     {
  91.       GLUTwindow *toplevel;
  92.       toplevel = __glutToplevelOf(__glutCurrentWindow);
  93.       if (toplevel->cmap != cmap->cmap) {
  94.         __glutPutOnWorkList(toplevel, GLUT_COLORMAP_WORK);
  95.       }
  96.     }
  97. #endif
  98.   }
  99.   color.pixel = ndx;
  100.   red = CLAMP(red);
  101.   cmap->cells[ndx].component[GLUT_RED] = red;
  102.   color.red = (GLfloat) 0xffff *red;
  103.   green = CLAMP(green);
  104.   cmap->cells[ndx].component[GLUT_GREEN] = green;
  105.   color.green = (GLfloat) 0xffff *green;
  106.   blue = CLAMP(blue);
  107.   cmap->cells[ndx].component[GLUT_BLUE] = blue;
  108.   color.blue = (GLfloat) 0xffff *blue;
  109.   color.flags = DoRed | DoGreen | DoBlue;
  110. #if defined(_WIN32)
  111.   if (IsWindowVisible(__glutCurrentWindow->win)) {
  112.     XHDC = __glutCurrentWindow->hdc;
  113.   } else {
  114.     XHDC = 0;
  115.   }
  116. #endif
  117.   XStoreColor(__glutDisplay, cmap->cmap, &color);
  118. }
  119. GLfloat APIENTRY
  120. glutGetColor(int ndx, int comp)
  121. {
  122.   GLUTcolormap *colormap;
  123.   XVisualInfo *vis;
  124.   if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  125.     colormap = __glutCurrentWindow->colormap;
  126.     vis = __glutCurrentWindow->vis;
  127.   } else {
  128.     colormap = __glutCurrentWindow->overlay->colormap;
  129.     vis = __glutCurrentWindow->overlay->vis;
  130.     if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
  131.       __glutWarning("glutGetColor: requesting overlay transparent index %dn",
  132.         ndx);
  133.       return -1.0;
  134.     }
  135.   }
  136.   if (!colormap) {
  137.     __glutWarning("glutGetColor: current window is RGBA");
  138.     return -1.0;
  139.   }
  140. #if defined(_WIN32)
  141. #define OUT_OF_RANGE_NDX(ndx) (ndx >= 256 || ndx < 0)
  142. #else
  143. #define OUT_OF_RANGE_NDX(ndx) (ndx >= vis->visual->map_entries || ndx < 0)
  144. #endif
  145.   if (OUT_OF_RANGE_NDX(ndx)) {
  146.     __glutWarning("glutGetColor: index %d out of range", ndx);
  147.     return -1.0;
  148.   }
  149.   return colormap->cells[ndx].component[comp];
  150. }
  151. void APIENTRY
  152. glutCopyColormap(int winnum)
  153. {
  154.   GLUTwindow *window = __glutWindowList[winnum - 1];
  155.   GLUTcolormap *oldcmap, *newcmap;
  156.   XVisualInfo *dstvis;
  157.   if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  158.     oldcmap = __glutCurrentWindow->colormap;
  159.     dstvis = __glutCurrentWindow->vis;
  160.     newcmap = window->colormap;
  161.   } else {
  162.     oldcmap = __glutCurrentWindow->overlay->colormap;
  163.     dstvis = __glutCurrentWindow->overlay->vis;
  164.     if (!window->overlay) {
  165.       __glutWarning("glutCopyColormap: window %d has no overlay", winnum);
  166.       return;
  167.     }
  168.     newcmap = window->overlay->colormap;
  169.   }
  170.   if (!oldcmap) {
  171.     __glutWarning("glutCopyColormap: destination colormap must be color index");
  172.     return;
  173.   }
  174.   if (!newcmap) {
  175.     __glutWarning(
  176.       "glutCopyColormap: source colormap of window %d must be color index",
  177.       winnum);
  178.     return;
  179.   }
  180.   if (newcmap == oldcmap) {
  181.     /* Source and destination are the same; now copy needed. */
  182.     return;
  183.   }
  184. #if !defined(_WIN32)
  185.   /* Play safe: compare visual IDs, not Visual*'s. */
  186.   if (newcmap->visual->visualid == oldcmap->visual->visualid) {
  187. #endif
  188.     /* Visuals match!  "Copy" by reference...  */
  189.     __glutFreeColormap(oldcmap);
  190.     newcmap->refcnt++;
  191.     if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  192.       __glutCurrentWindow->colormap = newcmap;
  193.       __glutCurrentWindow->cmap = newcmap->cmap;
  194.     } else {
  195.       __glutCurrentWindow->overlay->colormap = newcmap;
  196.       __glutCurrentWindow->overlay->cmap = newcmap->cmap;
  197.     }
  198.     XSetWindowColormap(__glutDisplay, __glutCurrentWindow->renderWin,
  199.       newcmap->cmap);
  200. #if !defined(_WIN32)
  201.     __glutPutOnWorkList(__glutToplevelOf(window), GLUT_COLORMAP_WORK);
  202.   } else {
  203.     GLUTcolormap *copycmap;
  204.     XColor color;
  205.     int i, last;
  206.     /* Visuals different - need a distinct X colormap! */
  207.     copycmap = __glutAssociateNewColormap(dstvis);
  208.     /* Wouldn't it be nice if XCopyColormapAndFree could be
  209.        told not to free the old colormap's entries! */
  210.     last = newcmap->size;
  211.     if (last > copycmap->size) {
  212.       last = copycmap->size;
  213.     }
  214.     for (i = last - 1; i >= 0; i--) {
  215.       if (newcmap->cells[i].component[GLUT_RED] >= 0.0) {
  216.         color.pixel = i;
  217.         copycmap->cells[i].component[GLUT_RED] =
  218.           newcmap->cells[i].component[GLUT_RED];
  219.         color.red = (GLfloat) 0xffff *
  220.           newcmap->cells[i].component[GLUT_RED];
  221.         copycmap->cells[i].component[GLUT_GREEN] =
  222.           newcmap->cells[i].component[GLUT_GREEN];
  223.         color.green = (GLfloat) 0xffff *
  224.           newcmap->cells[i].component[GLUT_GREEN];
  225.         copycmap->cells[i].component[GLUT_BLUE] =
  226.           newcmap->cells[i].component[GLUT_BLUE];
  227.         color.blue = (GLfloat) 0xffff *
  228.           newcmap->cells[i].component[GLUT_BLUE];
  229.         color.flags = DoRed | DoGreen | DoBlue;
  230.         XStoreColor(__glutDisplay, copycmap->cmap, &color);
  231.       }
  232.     }
  233.   }
  234. #endif
  235. }
  236. /* ENDCENTRY */