XRGB.c revision 61b2299d
11ab64890Smrg/* $Xorg: XRGB.c,v 1.3 2000/08/17 19:45:04 cpqbld Exp $ */ 21ab64890Smrg 31ab64890Smrg/* 41ab64890Smrg * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc. 51ab64890Smrg * All Rights Reserved 661b2299dSmrg * 71ab64890Smrg * This file is a component of an X Window System-specific implementation 81ab64890Smrg * of Xcms based on the TekColor Color Management System. Permission is 91ab64890Smrg * hereby granted to use, copy, modify, sell, and otherwise distribute this 101ab64890Smrg * software and its documentation for any purpose and without fee, provided 111ab64890Smrg * that this copyright, permission, and disclaimer notice is reproduced in 121ab64890Smrg * all copies of this software and in supporting documentation. TekColor 131ab64890Smrg * is a trademark of Tektronix, Inc. 1461b2299dSmrg * 151ab64890Smrg * Tektronix makes no representation about the suitability of this software 161ab64890Smrg * for any purpose. It is provided "as is" and with all faults. 1761b2299dSmrg * 181ab64890Smrg * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE, 191ab64890Smrg * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 201ab64890Smrg * PARTICULAR PURPOSE. IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY 211ab64890Smrg * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 221ab64890Smrg * RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF 231ab64890Smrg * CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 241ab64890Smrg * CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE. 251ab64890Smrg * 261ab64890Smrg * 271ab64890Smrg * NAME 281ab64890Smrg * XcmsRtoX.c 291ab64890Smrg * 301ab64890Smrg * DESCRIPTION 311ab64890Smrg * Convert color specifications in XcmsRGB format in one array of 321ab64890Smrg * XcmsColor structures to RGB in an array of XColor structures. 331ab64890Smrg * 341ab64890Smrg * 351ab64890Smrg */ 361ab64890Smrg/* $XFree86: xc/lib/X11/XRGB.c,v 3.3 2001/07/29 05:01:11 tsi Exp $ */ 371ab64890Smrg 381ab64890Smrg#ifdef HAVE_CONFIG_H 391ab64890Smrg#include <config.h> 401ab64890Smrg#endif 411ab64890Smrg#include "Xlibint.h" 421ab64890Smrg#include "Xcmsint.h" 431ab64890Smrg#include "Cv.h" 441ab64890Smrg 451ab64890Smrg/* 461ab64890Smrg * LOCAL VARIABLES 471ab64890Smrg */ 481ab64890Smrg 491ab64890Smrgstatic unsigned short const MASK[17] = { 501ab64890Smrg 0x0000, /* 0 bitsPerRGB */ 511ab64890Smrg 0x8000, /* 1 bitsPerRGB */ 521ab64890Smrg 0xc000, /* 2 bitsPerRGB */ 531ab64890Smrg 0xe000, /* 3 bitsPerRGB */ 541ab64890Smrg 0xf000, /* 4 bitsPerRGB */ 551ab64890Smrg 0xf800, /* 5 bitsPerRGB */ 561ab64890Smrg 0xfc00, /* 6 bitsPerRGB */ 571ab64890Smrg 0xfe00, /* 7 bitsPerRGB */ 581ab64890Smrg 0xff00, /* 8 bitsPerRGB */ 591ab64890Smrg 0xff80, /* 9 bitsPerRGB */ 601ab64890Smrg 0xffc0, /* 10 bitsPerRGB */ 611ab64890Smrg 0xffe0, /* 11 bitsPerRGB */ 621ab64890Smrg 0xfff0, /* 12 bitsPerRGB */ 631ab64890Smrg 0xfff8, /* 13 bitsPerRGB */ 641ab64890Smrg 0xfffc, /* 14 bitsPerRGB */ 651ab64890Smrg 0xfffe, /* 15 bitsPerRGB */ 661ab64890Smrg 0xffff /* 16 bitsPerRGB */ 671ab64890Smrg}; 681ab64890Smrg 691ab64890Smrg 701ab64890Smrg 711ab64890Smrg/************************************************************************ 721ab64890Smrg * * 731ab64890Smrg * API PRIVATE ROUTINES * 741ab64890Smrg * * 751ab64890Smrg ************************************************************************/ 761ab64890Smrg 771ab64890Smrg/* 781ab64890Smrg * NAME 7961b2299dSmrg * _XcmsRGB_to_XColor - 801ab64890Smrg * 811ab64890Smrg * SYNOPSIS 821ab64890Smrg */ 831ab64890Smrgvoid 841ab64890Smrg_XcmsRGB_to_XColor( 851ab64890Smrg XcmsColor *pColors, 861ab64890Smrg XColor *pXColors, 871ab64890Smrg unsigned int nColors) 881ab64890Smrg/* 891ab64890Smrg * DESCRIPTION 901ab64890Smrg * Translates a color specification in XcmsRGBFormat in a XcmsColor 911ab64890Smrg * structure to an XColor structure. 921ab64890Smrg * 931ab64890Smrg * RETURNS 941ab64890Smrg * void. 951ab64890Smrg */ 961ab64890Smrg{ 971ab64890Smrg for (; nColors--; pXColors++, pColors++) { 981ab64890Smrg pXColors->pixel = pColors->pixel; 991ab64890Smrg pXColors->red = pColors->spec.RGB.red; 1001ab64890Smrg pXColors->green = pColors->spec.RGB.green; 1011ab64890Smrg pXColors->blue = pColors->spec.RGB.blue; 1021ab64890Smrg pXColors->flags = (DoRed | DoGreen | DoBlue); 1031ab64890Smrg } 1041ab64890Smrg} 1051ab64890Smrg 1061ab64890Smrg 1071ab64890Smrg/* 1081ab64890Smrg * NAME 1091ab64890Smrg * _XColor_to_XcmsRGB 1101ab64890Smrg * 1111ab64890Smrg * SYNOPSIS 1121ab64890Smrg */ 1131ab64890Smrgvoid 1141ab64890Smrg_XColor_to_XcmsRGB( 1151ab64890Smrg XcmsCCC ccc, 1161ab64890Smrg XColor *pXColors, 1171ab64890Smrg XcmsColor *pColors, 1181ab64890Smrg unsigned int nColors) 1191ab64890Smrg/* 1201ab64890Smrg * DESCRIPTION 1211ab64890Smrg * Translates an RGB color specification in an XColor 1221ab64890Smrg * structure to an XcmsRGB structure. 1231ab64890Smrg * 1241ab64890Smrg * IMPORTANT NOTE: Bit replication that may have been caused 1251ab64890Smrg * with ResolveColor() routine in the X Server is undone 1261ab64890Smrg * here if requested! For example, if red = 0xcaca and the 1271ab64890Smrg * bits_per_rgb is 8, then spec.RGB.red will be 0xca00. 1281ab64890Smrg * 1291ab64890Smrg * RETURNS 1301ab64890Smrg * void 1311ab64890Smrg */ 1321ab64890Smrg{ 1331ab64890Smrg int bits_per_rgb = ccc->visual->bits_per_rgb; 1341ab64890Smrg 1351ab64890Smrg for (; nColors--; pXColors++, pColors++) { 1361ab64890Smrg pColors->spec.RGB.red = (pXColors->red & MASK[bits_per_rgb]); 1371ab64890Smrg pColors->spec.RGB.green = (pXColors->green & MASK[bits_per_rgb]); 1381ab64890Smrg pColors->spec.RGB.blue = (pXColors->blue & MASK[bits_per_rgb]); 1391ab64890Smrg pColors->format = XcmsRGBFormat; 1401ab64890Smrg pColors->pixel = pXColors->pixel; 1411ab64890Smrg } 1421ab64890Smrg} 1431ab64890Smrg 1441ab64890Smrg 1451ab64890Smrg/* 1461ab64890Smrg * NAME 1471ab64890Smrg * _XcmsResolveColor 1481ab64890Smrg * 1491ab64890Smrg * SYNOPSIS 1501ab64890Smrg */ 1511ab64890Smrgvoid 1521ab64890Smrg_XcmsResolveColor( 1531ab64890Smrg XcmsCCC ccc, 1541ab64890Smrg XcmsColor *pXcmsColor) 1551ab64890Smrg/* 1561ab64890Smrg * DESCRIPTION 1571ab64890Smrg * Uses the X Server ResolveColor() algorithm to 1581ab64890Smrg * modify values to closest values supported by hardware. 1591ab64890Smrg * Old algorithm simply masked low-order bits. The new algorithm 1601ab64890Smrg * has the effect of replicating significant bits into lower order 1611ab64890Smrg * bits in order to stretch the hardware value into all 16 bits. 1621ab64890Smrg * 1631ab64890Smrg * On a display with N-bit DACs, the "hardware" color is computed as: 1641ab64890Smrg * 1651ab64890Smrg * ((unsignedlong)(ClientValue >> (16-N)) * 0xFFFF) / ((1 << N) - 1) 16661b2299dSmrg * 1671ab64890Smrg * 1681ab64890Smrg * RETURNS 1691ab64890Smrg * void. 1701ab64890Smrg */ 1711ab64890Smrg{ 1721ab64890Smrg int shift; 1731ab64890Smrg int max_color; 1741ab64890Smrg 1751ab64890Smrg shift = 16 - ccc->visual->bits_per_rgb; 1761ab64890Smrg max_color = (1 << ccc->visual->bits_per_rgb) - 1; 1771ab64890Smrg 1781ab64890Smrg 1791ab64890Smrg pXcmsColor->spec.RGB.red = 1801ab64890Smrg ((unsigned long)(pXcmsColor->spec.RGB.red >> shift) * 0xFFFF) 1811ab64890Smrg / max_color; 1821ab64890Smrg pXcmsColor->spec.RGB.green = 1831ab64890Smrg ((unsigned long)(pXcmsColor->spec.RGB.green >> shift) * 0xFFFF) 1841ab64890Smrg / max_color; 1851ab64890Smrg pXcmsColor->spec.RGB.blue = 1861ab64890Smrg ((unsigned long)(pXcmsColor->spec.RGB.blue >> shift) * 0xFFFF) 1871ab64890Smrg / max_color; 1881ab64890Smrg} 1891ab64890Smrg 1901ab64890Smrg 1911ab64890Smrg/* 1921ab64890Smrg * NAME 1931ab64890Smrg * _XcmsUnresolveColor 1941ab64890Smrg * 1951ab64890Smrg * SYNOPSIS 1961ab64890Smrg */ 1971ab64890Smrgvoid 1981ab64890Smrg_XcmsUnresolveColor( 1991ab64890Smrg XcmsCCC ccc, 2001ab64890Smrg XcmsColor *pColor) 2011ab64890Smrg/* 2021ab64890Smrg * DESCRIPTION 2031ab64890Smrg * Masks out insignificant bits. 2041ab64890Smrg * 2051ab64890Smrg * RETURNS 2061ab64890Smrg * void. 2071ab64890Smrg * 2081ab64890Smrg * ASSUMPTIONS 2091ab64890Smrg * format == XcmsRGBFormat 2101ab64890Smrg */ 2111ab64890Smrg{ 2121ab64890Smrg int bits_per_rgb = ccc->visual->bits_per_rgb; 2131ab64890Smrg 2141ab64890Smrg pColor->spec.RGB.red &= MASK[bits_per_rgb]; 2151ab64890Smrg pColor->spec.RGB.green &= MASK[bits_per_rgb]; 2161ab64890Smrg pColor->spec.RGB.blue &= MASK[bits_per_rgb]; 2171ab64890Smrg} 2181ab64890Smrg 2191ab64890Smrg 2201ab64890Smrg/* 2211ab64890Smrg * NAME 2221ab64890Smrg * _XUnresolveColor 2231ab64890Smrg * 2241ab64890Smrg * SYNOPSIS 2251ab64890Smrg */ 2261ab64890Smrgvoid 2271ab64890Smrg_XUnresolveColor( 2281ab64890Smrg XcmsCCC ccc, 2291ab64890Smrg XColor *pXColor) 2301ab64890Smrg/* 2311ab64890Smrg * DESCRIPTION 2321ab64890Smrg * Masks out insignificant bits. 2331ab64890Smrg * 2341ab64890Smrg * RETURNS 2351ab64890Smrg * void. 2361ab64890Smrg */ 2371ab64890Smrg{ 2381ab64890Smrg int bits_per_rgb = ccc->visual->bits_per_rgb; 2391ab64890Smrg 2401ab64890Smrg pXColor->red &= MASK[bits_per_rgb]; 2411ab64890Smrg pXColor->green &= MASK[bits_per_rgb]; 2421ab64890Smrg pXColor->blue &= MASK[bits_per_rgb]; 2431ab64890Smrg} 2441ab64890Smrg 245