⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glut_cindex.c

📁 mesa-6.5-minigui源码
💻 C
字号:
/* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. *//* This program is freely distributable without licensing fees    and is provided without guarantee or warrantee expressed or    implied. This program is -not- in the public domain. */#include <stdlib.h>#include "glutint.h"#define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))/* CENTRY */void GLUTAPIENTRYglutSetColor(int ndx, GLfloat red, GLfloat green, GLfloat blue){  GLUTcolormap *cmap, *newcmap;  XVisualInfo *vis;  XColor color;  int i;  if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {    cmap = __glutCurrentWindow->colormap;    vis = __glutCurrentWindow->vis;  } else {    cmap = __glutCurrentWindow->overlay->colormap;    vis = __glutCurrentWindow->overlay->vis;    if (ndx == __glutCurrentWindow->overlay->transparentPixel) {      __glutWarning(        "glutSetColor: cannot set color of overlay transparent index %d\n",        ndx);      return;    }  }  if (!cmap) {    __glutWarning("glutSetColor: current window is RGBA");    return;  }#if defined(_WIN32)  if (ndx >= 256 ||     /* always assume 256 colors on Win32 */#else  if (ndx >= vis->visual->map_entries ||#endif    ndx < 0) {    __glutWarning("glutSetColor: index %d out of range", ndx);    return;  }  if (cmap->refcnt > 1) {    newcmap = __glutAssociateNewColormap(vis);    cmap->refcnt--;    /* Wouldn't it be nice if XCopyColormapAndFree could be       told not to free the old colormap's entries! */    for (i = cmap->size - 1; i >= 0; i--) {      if (i == ndx) {        /* We are going to set this cell shortly! */        continue;      }      if (cmap->cells[i].component[GLUT_RED] >= 0.0) {        color.pixel = i;        newcmap->cells[i].component[GLUT_RED] =          cmap->cells[i].component[GLUT_RED];        color.red = (GLfloat) 0xffff *          cmap->cells[i].component[GLUT_RED];        newcmap->cells[i].component[GLUT_GREEN] =          cmap->cells[i].component[GLUT_GREEN];        color.green = (GLfloat) 0xffff *          cmap->cells[i].component[GLUT_GREEN];        newcmap->cells[i].component[GLUT_BLUE] =          cmap->cells[i].component[GLUT_BLUE];        color.blue = (GLfloat) 0xffff *          cmap->cells[i].component[GLUT_BLUE];        color.flags = DoRed | DoGreen | DoBlue;#if defined(_WIN32)        if (IsWindowVisible(__glutCurrentWindow->win)) {          XHDC = __glutCurrentWindow->hdc;        } else {          XHDC = 0;        }#endif        XStoreColor(__glutDisplay, newcmap->cmap, &color);      } else {        /* Leave unallocated entries unallocated. */      }    }    cmap = newcmap;    if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {      __glutCurrentWindow->colormap = cmap;      __glutCurrentWindow->cmap = cmap->cmap;    } else {      __glutCurrentWindow->overlay->colormap = cmap;      __glutCurrentWindow->overlay->cmap = cmap->cmap;    }    XSetWindowColormap(__glutDisplay,      __glutCurrentWindow->renderWin, cmap->cmap);#if !defined(_WIN32)    {      GLUTwindow *toplevel;      toplevel = __glutToplevelOf(__glutCurrentWindow);      if (toplevel->cmap != cmap->cmap) {        __glutPutOnWorkList(toplevel, GLUT_COLORMAP_WORK);      }    }#endif  }  color.pixel = ndx;  red = CLAMP(red);  cmap->cells[ndx].component[GLUT_RED] = red;  color.red = (GLfloat) 0xffff *red;  green = CLAMP(green);  cmap->cells[ndx].component[GLUT_GREEN] = green;  color.green = (GLfloat) 0xffff *green;  blue = CLAMP(blue);  cmap->cells[ndx].component[GLUT_BLUE] = blue;  color.blue = (GLfloat) 0xffff *blue;  color.flags = DoRed | DoGreen | DoBlue;#if defined(_WIN32)  if (IsWindowVisible(__glutCurrentWindow->win)) {    XHDC = __glutCurrentWindow->hdc;  } else {    XHDC = 0;  }#endif  XStoreColor(__glutDisplay, cmap->cmap, &color);}GLfloat GLUTAPIENTRYglutGetColor(int ndx, int comp){  GLUTcolormap *colormap;  XVisualInfo *vis;  if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {    colormap = __glutCurrentWindow->colormap;    vis = __glutCurrentWindow->vis;  } else {    colormap = __glutCurrentWindow->overlay->colormap;    vis = __glutCurrentWindow->overlay->vis;    if (ndx == __glutCurrentWindow->overlay->transparentPixel) {      __glutWarning("glutGetColor: requesting overlay transparent index %d\n",        ndx);      return -1.0;    }  }  if (!colormap) {    __glutWarning("glutGetColor: current window is RGBA");    return -1.0;  }#if defined(_WIN32)#define OUT_OF_RANGE_NDX(ndx) (ndx >= 256 || ndx < 0)#else#define OUT_OF_RANGE_NDX(ndx) (ndx >= vis->visual->map_entries || ndx < 0)#endif  if (OUT_OF_RANGE_NDX(ndx)) {    __glutWarning("glutGetColor: index %d out of range", ndx);    return -1.0;  }  return colormap->cells[ndx].component[comp];}void GLUTAPIENTRYglutCopyColormap(int winnum){  GLUTwindow *window = __glutWindowList[winnum - 1];  GLUTcolormap *oldcmap, *newcmap;  XVisualInfo *dstvis;  if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {    oldcmap = __glutCurrentWindow->colormap;    dstvis = __glutCurrentWindow->vis;    newcmap = window->colormap;  } else {    oldcmap = __glutCurrentWindow->overlay->colormap;    dstvis = __glutCurrentWindow->overlay->vis;    if (!window->overlay) {      __glutWarning("glutCopyColormap: window %d has no overlay", winnum);      return;    }    newcmap = window->overlay->colormap;  }  if (!oldcmap) {    __glutWarning("glutCopyColormap: destination colormap must be color index");    return;  }  if (!newcmap) {    __glutWarning(      "glutCopyColormap: source colormap of window %d must be color index",      winnum);    return;  }  if (newcmap == oldcmap) {    /* Source and destination are the same; now copy needed. */    return;  }#if !defined(_WIN32)  /* Play safe: compare visual IDs, not Visual*'s. */  if (newcmap->visual->visualid == oldcmap->visual->visualid) {#endif    /* Visuals match!  "Copy" by reference...  */    __glutFreeColormap(oldcmap);    newcmap->refcnt++;    if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {      __glutCurrentWindow->colormap = newcmap;      __glutCurrentWindow->cmap = newcmap->cmap;    } else {      __glutCurrentWindow->overlay->colormap = newcmap;      __glutCurrentWindow->overlay->cmap = newcmap->cmap;    }    XSetWindowColormap(__glutDisplay, __glutCurrentWindow->renderWin,      newcmap->cmap);#if !defined(_WIN32)    __glutPutOnWorkList(__glutToplevelOf(window), GLUT_COLORMAP_WORK);  } else {    GLUTcolormap *copycmap;    XColor color;    int i, last;    /* Visuals different - need a distinct X colormap! */    copycmap = __glutAssociateNewColormap(dstvis);    /* Wouldn't it be nice if XCopyColormapAndFree could be       told not to free the old colormap's entries! */    last = newcmap->size;    if (last > copycmap->size) {      last = copycmap->size;    }    for (i = last - 1; i >= 0; i--) {      if (newcmap->cells[i].component[GLUT_RED] >= 0.0) {        color.pixel = i;        copycmap->cells[i].component[GLUT_RED] =          newcmap->cells[i].component[GLUT_RED];        color.red = (GLfloat) 0xffff *          newcmap->cells[i].component[GLUT_RED];        copycmap->cells[i].component[GLUT_GREEN] =          newcmap->cells[i].component[GLUT_GREEN];        color.green = (GLfloat) 0xffff *          newcmap->cells[i].component[GLUT_GREEN];        copycmap->cells[i].component[GLUT_BLUE] =          newcmap->cells[i].component[GLUT_BLUE];        color.blue = (GLfloat) 0xffff *          newcmap->cells[i].component[GLUT_BLUE];        color.flags = DoRed | DoGreen | DoBlue;        XStoreColor(__glutDisplay, copycmap->cmap, &color);      }    }  }#endif}/* ENDCENTRY */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -