/* * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the name of * Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF * ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include #include #include #include "tk.h" #include "private.h" #if defined(__cplusplus) || defined(c_plusplus) #define class c_class #endif /******************************************************************************/ int tkGetColorMapSize(void) { if (!xDisplay) { return 0; } else { return w.vInfoMain->colormap_size; } } /******************************************************************************/ void tkGetMouseLoc(int *x, int *y) { int junk; *x = 0; *y = 0; XQueryPointer(xDisplay, w.wMain, (Window *)&junk, (Window *)&junk, &junk, &junk, x, y, (unsigned int *)&junk); } /******************************************************************************/ Display *tkGetXDisplay(void) { return xDisplay; } /******************************************************************************/ Window tkGetXWindow(void) { return w.wMain; } /******************************************************************************/ void tkSetFogRamp(int density, int startIndex) { XColor c[256]; int rShift, gShift, bShift, intensity, fogValues, colorValues; int i, j, k; switch (w.vInfoMain->class) { case DirectColor: fogValues = 1 << density; colorValues = 1 << startIndex; for (i = 0; i < colorValues; i++) { for (j = 0; j < fogValues; j++) { k = i * fogValues + j; intensity = i * fogValues + j * colorValues; if (intensity > w.vInfoMain->colormap_size) { intensity = w.vInfoMain->colormap_size; } intensity = (intensity << 8) | intensity; rShift = ffs((unsigned int)w.vInfoMain->red_mask) - 1; gShift = ffs((unsigned int)w.vInfoMain->green_mask) - 1; bShift = ffs((unsigned int)w.vInfoMain->blue_mask) - 1; c[k].pixel = ((k << rShift) & w.vInfoMain->red_mask) | ((k << gShift) & w.vInfoMain->green_mask) | ((k << bShift) & w.vInfoMain->blue_mask); c[k].red = (unsigned short)intensity; c[k].green = (unsigned short)intensity; c[k].blue = (unsigned short)intensity; c[k].flags = DoRed | DoGreen | DoBlue; } } XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size); break; case GrayScale: case PseudoColor: fogValues = 1 << density; colorValues = 1 << startIndex; for (i = 0; i < colorValues; i++) { for (j = 0; j < fogValues; j++) { k = i * fogValues + j; intensity = i * fogValues + j * colorValues; if (intensity > w.vInfoMain->colormap_size) { intensity = w.vInfoMain->colormap_size; } intensity = (intensity << 8) | intensity; c[k].pixel = k; c[k].red = (unsigned short)intensity; c[k].green = (unsigned short)intensity; c[k].blue = (unsigned short)intensity; c[k].flags = DoRed | DoGreen | DoBlue; } } XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size); break; } XSync(xDisplay, 0); } /******************************************************************************/ void tkSetGreyRamp(void) { XColor c[256]; float intensity; int rShift, gShift, bShift, i; switch (w.vInfoMain->class) { case DirectColor: for (i = 0; i < w.vInfoMain->colormap_size; i++) { intensity = (float)i / (float)w.vInfoMain->colormap_size * 65535.0 + 0.5; rShift = ffs((unsigned int)w.vInfoMain->red_mask) - 1; gShift = ffs((unsigned int)w.vInfoMain->green_mask) - 1; bShift = ffs((unsigned int)w.vInfoMain->blue_mask) - 1; c[i].pixel = ((i << rShift) & w.vInfoMain->red_mask) | ((i << gShift) & w.vInfoMain->green_mask) | ((i << bShift) & w.vInfoMain->blue_mask); c[i].red = (unsigned short)intensity; c[i].green = (unsigned short)intensity; c[i].blue = (unsigned short)intensity; c[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size); break; case GrayScale: case PseudoColor: for (i = 0; i < w.vInfoMain->colormap_size; i++) { intensity = (float)i / (float)w.vInfoMain->colormap_size * 65535.0 + 0.5; c[i].pixel = i; c[i].red = (unsigned short)intensity; c[i].green = (unsigned short)intensity; c[i].blue = (unsigned short)intensity; c[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size); break; } XSync(xDisplay, 0); } /******************************************************************************/ void tkSetOneColor(int index, float r, float g, float b) { XColor c; int rShift, gShift, bShift; switch (w.vInfoMain->class) { case DirectColor: rShift = ffs((unsigned int)w.vInfoMain->red_mask) - 1; gShift = ffs((unsigned int)w.vInfoMain->green_mask) - 1; bShift = ffs((unsigned int)w.vInfoMain->blue_mask) - 1; c.pixel = ((index << rShift) & w.vInfoMain->red_mask) | ((index << gShift) & w.vInfoMain->green_mask) | ((index << bShift) & w.vInfoMain->blue_mask); c.red = (unsigned short)(r * 65535.0 + 0.5); c.green = (unsigned short)(g * 65535.0 + 0.5); c.blue = (unsigned short)(b * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(xDisplay, w.cMapMain, &c); break; case GrayScale: case PseudoColor: if (index < w.vInfoMain->colormap_size) { c.pixel = index; c.red = (unsigned short)(r * 65535.0 + 0.5); c.green = (unsigned short)(g * 65535.0 + 0.5); c.blue = (unsigned short)(b * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(xDisplay, w.cMapMain, &c); } break; } XSync(xDisplay, 0); } /******************************************************************************/ void tkSetOverlayMap(int size, float *rgb) { XColor c; unsigned long *buf; int max, i; if (w.vInfoOverlay->class == PseudoColor) { max = (size > w.vInfoOverlay->colormap_size) ? w.vInfoOverlay->colormap_size : size; buf = (unsigned long *)calloc(max, sizeof(unsigned long)); XAllocColorCells(xDisplay, w.cMapOverlay, True, NULL, 0, buf, max-1); for (i = 1; i < max; i++) { c.pixel = i; c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5); c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5); c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(xDisplay, w.cMapOverlay, &c); } free(buf); } XSync(xDisplay, 0); } /******************************************************************************/ void tkSetRGBMap(int size, float *rgb) { XColor c; int rShift, gShift, bShift, max, i; switch (w.vInfoMain->class) { case DirectColor: max = (size > w.vInfoMain->colormap_size) ? w.vInfoMain->colormap_size : size; for (i = 0; i < max; i++) { rShift = ffs((unsigned int)w.vInfoMain->red_mask) - 1; gShift = ffs((unsigned int)w.vInfoMain->green_mask) - 1; bShift = ffs((unsigned int)w.vInfoMain->blue_mask) - 1; c.pixel = ((i << rShift) & w.vInfoMain->red_mask) | ((i << gShift) & w.vInfoMain->green_mask) | ((i << bShift) & w.vInfoMain->blue_mask); c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5); c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5); c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(xDisplay, w.cMapMain, &c); } break; case GrayScale: case PseudoColor: max = (size > w.vInfoMain->colormap_size) ? w.vInfoMain->colormap_size : size; for (i = 0; i < max; i++) { c.pixel = i; c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5); c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5); c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(xDisplay, w.cMapMain, &c); } break; } XSync(xDisplay, 0); } /******************************************************************************/