loadData.c revision 2c7c4e3d
12c7c4e3dSmrg/* $Xorg: loadData.c,v 1.4 2000/08/17 19:54:13 cpqbld Exp $ */ 22c7c4e3dSmrg 32c7c4e3dSmrg/* 42c7c4e3dSmrg * (c) Copyright 1990 Tektronix Inc. 52c7c4e3dSmrg * All Rights Reserved 62c7c4e3dSmrg * 72c7c4e3dSmrg * Permission to use, copy, modify, and distribute this software and its 82c7c4e3dSmrg * documentation for any purpose and without fee is hereby granted, 92c7c4e3dSmrg * provided that the above copyright notice appear in all copies and that 102c7c4e3dSmrg * both that copyright notice and this permission notice appear in 112c7c4e3dSmrg * supporting documentation, and that the name of Tektronix not be used 122c7c4e3dSmrg * in advertising or publicity pertaining to distribution of the software 132c7c4e3dSmrg * without specific, written prior permission. 142c7c4e3dSmrg * 152c7c4e3dSmrg * Tektronix disclaims all warranties with regard to this software, including 162c7c4e3dSmrg * all implied warranties of merchantability and fitness, in no event shall 172c7c4e3dSmrg * Tektronix be liable for any special, indirect or consequential damages or 182c7c4e3dSmrg * any damages whatsoever resulting from loss of use, data or profits, 192c7c4e3dSmrg * whether in an action of contract, negligence or other tortious action, 202c7c4e3dSmrg * arising out of or in connection with the use or performance of this 212c7c4e3dSmrg * software. 222c7c4e3dSmrg * 232c7c4e3dSmrg * 242c7c4e3dSmrg * NAME 252c7c4e3dSmrg * LoadSCCData.c 262c7c4e3dSmrg * 272c7c4e3dSmrg * DESCRIPTION 282c7c4e3dSmrg * TekCMS API routine that reads screen data from a file 292c7c4e3dSmrg * and then loads the data on the root window of the screen. 302c7c4e3dSmrg * 312c7c4e3dSmrg * 322c7c4e3dSmrg * 332c7c4e3dSmrg */ 342c7c4e3dSmrg/* $XFree86: xc/programs/xcmsdb/loadData.c,v 3.3 2001/07/25 15:05:18 dawes Exp $ */ 352c7c4e3dSmrg 362c7c4e3dSmrg/* 372c7c4e3dSmrg * INCLUDES 382c7c4e3dSmrg */ 392c7c4e3dSmrg 402c7c4e3dSmrg#include <X11/Xos.h> 412c7c4e3dSmrg#include <sys/stat.h> 422c7c4e3dSmrg#include <stdio.h> 432c7c4e3dSmrg 442c7c4e3dSmrg#include <X11/Xlib.h> 452c7c4e3dSmrg#include <X11/Xatom.h> 462c7c4e3dSmrg#include "SCCDFile.h" 472c7c4e3dSmrg 482c7c4e3dSmrg 492c7c4e3dSmrg/* 502c7c4e3dSmrg * EXTERNS 512c7c4e3dSmrg * External declarations required locally to this package 522c7c4e3dSmrg * that are not already declared in any of the included header 532c7c4e3dSmrg * files (external includes or internal includes). 542c7c4e3dSmrg */ 552c7c4e3dSmrg 562c7c4e3dSmrg#include <stdlib.h> 572c7c4e3dSmrg 582c7c4e3dSmrg/* 592c7c4e3dSmrg * LOCAL TYPEDEFS 602c7c4e3dSmrg * typedefs local to this package (for use with local vars). 612c7c4e3dSmrg * 622c7c4e3dSmrg */ 632c7c4e3dSmrg 642c7c4e3dSmrgtypedef struct _DefineEntry { 652c7c4e3dSmrg char *pString; 662c7c4e3dSmrg int define; 672c7c4e3dSmrg} DefineEntry; 682c7c4e3dSmrg 692c7c4e3dSmrg 702c7c4e3dSmrg/* 712c7c4e3dSmrg * LOCAL VARIABLES 722c7c4e3dSmrg */ 732c7c4e3dSmrgstatic int linenum = 0; 742c7c4e3dSmrg 752c7c4e3dSmrgstatic DefineEntry KeyTbl[] = { 762c7c4e3dSmrg { SC_BEGIN_KEYWORD, SC_BEGIN }, 772c7c4e3dSmrg { SC_END_KEYWORD, SC_END }, 782c7c4e3dSmrg { COMMENT_KEYWORD, COMMENT }, 792c7c4e3dSmrg { NAME_KEYWORD, NAME }, 802c7c4e3dSmrg { MODEL_KEYWORD, MODEL }, 812c7c4e3dSmrg { PART_NUMBER_KEYWORD, PART_NUMBER }, 822c7c4e3dSmrg { SERIAL_NUMBER_KEYWORD, SERIAL_NUMBER }, 832c7c4e3dSmrg { REVISION_KEYWORD, REVISION }, 842c7c4e3dSmrg { SCREEN_CLASS_KEYWORD, SCREEN_CLASS }, 852c7c4e3dSmrg { COLORIMETRIC_BEGIN_KEYWORD, COLORIMETRIC_BEGIN }, 862c7c4e3dSmrg { COLORIMETRIC_END_KEYWORD, COLORIMETRIC_END }, 872c7c4e3dSmrg { XYZTORGBMAT_BEGIN_KEYWORD, XYZTORGBMAT_BEGIN }, 882c7c4e3dSmrg { XYZTORGBMAT_END_KEYWORD, XYZTORGBMAT_END }, 892c7c4e3dSmrg { WHITEPT_XYZ_BEGIN_KEYWORD, WHITEPT_XYZ_BEGIN }, 902c7c4e3dSmrg { WHITEPT_XYZ_END_KEYWORD, WHITEPT_XYZ_END }, 912c7c4e3dSmrg { RGBTOXYZMAT_BEGIN_KEYWORD, RGBTOXYZMAT_BEGIN }, 922c7c4e3dSmrg { RGBTOXYZMAT_END_KEYWORD, RGBTOXYZMAT_END }, 932c7c4e3dSmrg { IPROFILE_BEGIN_KEYWORD, IPROFILE_BEGIN }, 942c7c4e3dSmrg { IPROFILE_END_KEYWORD, IPROFILE_END }, 952c7c4e3dSmrg { ITBL_BEGIN_KEYWORD, ITBL_BEGIN }, 962c7c4e3dSmrg { ITBL_END_KEYWORD, ITBL_END }, 972c7c4e3dSmrg { "", -1 } 982c7c4e3dSmrg}; 992c7c4e3dSmrg 1002c7c4e3dSmrgstatic DefineEntry ScrnClassTbl[] = { 1012c7c4e3dSmrg { VIDEO_RGB_KEYWORD, VIDEO_RGB }, 1022c7c4e3dSmrg#ifdef GRAY 1032c7c4e3dSmrg { VIDEO_GRAY_KEYWORD, VIDEO_GRAY }, 1042c7c4e3dSmrg#endif /* GRAY */ 1052c7c4e3dSmrg { "", -1 } 1062c7c4e3dSmrg}; 1072c7c4e3dSmrg 1082c7c4e3dSmrg#define KEY_VISUALID 1 1092c7c4e3dSmrg#define KEY_DEPTH 2 1102c7c4e3dSmrg#define KEY_CLASS 3 1112c7c4e3dSmrg#define KEY_RED_MASK 4 1122c7c4e3dSmrg#define KEY_GREEN_MASK 5 1132c7c4e3dSmrg#define KEY_BLUE_MASK 6 1142c7c4e3dSmrg#define KEY_COLORMAP_SIZE 7 1152c7c4e3dSmrg#define KEY_BITS_PER_RGB 8 1162c7c4e3dSmrg 1172c7c4e3dSmrgstatic DefineEntry VisualOptKeyTbl[] = { 1182c7c4e3dSmrg { "visualid", KEY_VISUALID }, 1192c7c4e3dSmrg { "depth", KEY_DEPTH }, 1202c7c4e3dSmrg { "class", KEY_CLASS }, 1212c7c4e3dSmrg { "red_mask", KEY_RED_MASK }, 1222c7c4e3dSmrg { "green_mask", KEY_GREEN_MASK }, 1232c7c4e3dSmrg { "blue_mask", KEY_BLUE_MASK }, 1242c7c4e3dSmrg { "colormap_size", KEY_COLORMAP_SIZE }, 1252c7c4e3dSmrg { "bits_per_rgb", KEY_BITS_PER_RGB }, 1262c7c4e3dSmrg { "", -1 } 1272c7c4e3dSmrg}; 1282c7c4e3dSmrgstatic DefineEntry VisualClassTbl[] = { 1292c7c4e3dSmrg { "StaticGray", StaticGray }, 1302c7c4e3dSmrg { "GrayScale", GrayScale }, 1312c7c4e3dSmrg { "StaticColor", StaticColor }, 1322c7c4e3dSmrg { "PseudoColor", PseudoColor }, 1332c7c4e3dSmrg { "TrueColor", TrueColor }, 1342c7c4e3dSmrg { "DirectColor", DirectColor }, 1352c7c4e3dSmrg { "", -1 } 1362c7c4e3dSmrg}; 1372c7c4e3dSmrg 1382c7c4e3dSmrg 1392c7c4e3dSmrg/************************************************************************ 1402c7c4e3dSmrg * * 1412c7c4e3dSmrg * PRIVATE ROUTINES * 1422c7c4e3dSmrg * * 1432c7c4e3dSmrg ************************************************************************/ 1442c7c4e3dSmrg 1452c7c4e3dSmrg/* 1462c7c4e3dSmrg * NAME 1472c7c4e3dSmrg * StrToDefine - convert a string to a define 1482c7c4e3dSmrg * 1492c7c4e3dSmrg * SYNOPSIS 1502c7c4e3dSmrg */ 1512c7c4e3dSmrgstatic int 1522c7c4e3dSmrgStrToDefine(DefineEntry pde[], /* IN: table of X string-define pairs */ 1532c7c4e3dSmrg /* last entry must contain pair "", 0 */ 1542c7c4e3dSmrg char *pstring) /* IN: string to be looked up in that table */ 1552c7c4e3dSmrg/* 1562c7c4e3dSmrg * DESCRIPTION 1572c7c4e3dSmrg * Converts a string to an integer define. 1582c7c4e3dSmrg * 1592c7c4e3dSmrg * Looks up the string in the table and returns the integer 1602c7c4e3dSmrg * associated with the string. 1612c7c4e3dSmrg * 1622c7c4e3dSmrg * Later may need similar function for unsigned long define. 1632c7c4e3dSmrg * 1642c7c4e3dSmrg * 1652c7c4e3dSmrg * 1662c7c4e3dSmrg * RETURNS 1672c7c4e3dSmrg * The int equivalent of the defined string. 1682c7c4e3dSmrg * -1 if the string is not found in table 1692c7c4e3dSmrg * 1702c7c4e3dSmrg */ 1712c7c4e3dSmrg{ 1722c7c4e3dSmrg while( strcmp(pde->pString,"") != 0 ){ 1732c7c4e3dSmrg if( strcmp(pde->pString,pstring) == 0){ 1742c7c4e3dSmrg return(pde->define); 1752c7c4e3dSmrg } 1762c7c4e3dSmrg pde++; 1772c7c4e3dSmrg } 1782c7c4e3dSmrg return(-1); 1792c7c4e3dSmrg} 1802c7c4e3dSmrg 1812c7c4e3dSmrg/* 1822c7c4e3dSmrg * NAME 1832c7c4e3dSmrg * DefineToStr 1842c7c4e3dSmrg * 1852c7c4e3dSmrg * SYNOPSIS 1862c7c4e3dSmrg */ 1872c7c4e3dSmrgstatic char * 1882c7c4e3dSmrgDefineToStr(DefineEntry pde[], /* IN: table of X string-define pairs */ 1892c7c4e3dSmrg /* last entry must contain pair "", 0 */ 1902c7c4e3dSmrg int id) /* IN: id to be looked up in that table */ 1912c7c4e3dSmrg/* 1922c7c4e3dSmrg * DESCRIPTION 1932c7c4e3dSmrg * Converts a string to an integer define. 1942c7c4e3dSmrg * 1952c7c4e3dSmrg * Looks up the string in the table and returns the integer 1962c7c4e3dSmrg * associated with the string. 1972c7c4e3dSmrg * 1982c7c4e3dSmrg * Later may need similar function for unsigned long define. 1992c7c4e3dSmrg * 2002c7c4e3dSmrg * 2012c7c4e3dSmrg * 2022c7c4e3dSmrg * RETURNS 2032c7c4e3dSmrg * The int equivalent of the defined string. 2042c7c4e3dSmrg * -1 if the string is not found in table 2052c7c4e3dSmrg * 2062c7c4e3dSmrg */ 2072c7c4e3dSmrg{ 2082c7c4e3dSmrg while(pde->define != -1) { 2092c7c4e3dSmrg if (pde->define == id) { 2102c7c4e3dSmrg return(pde->pString); 2112c7c4e3dSmrg } 2122c7c4e3dSmrg pde++; 2132c7c4e3dSmrg } 2142c7c4e3dSmrg return(NULL); 2152c7c4e3dSmrg} 2162c7c4e3dSmrg 2172c7c4e3dSmrg/* 2182c7c4e3dSmrg * NAME 2192c7c4e3dSmrg * SCKeyOf - convert keyword into key ID 2202c7c4e3dSmrg * 2212c7c4e3dSmrg * SYNOPSIS 2222c7c4e3dSmrg */ 2232c7c4e3dSmrgstatic int 2242c7c4e3dSmrgSCKeyOf(char *string) 2252c7c4e3dSmrg/* 2262c7c4e3dSmrg * DESCRIPTION 2272c7c4e3dSmrg * Converts a string to an integer define. 2282c7c4e3dSmrg * 2292c7c4e3dSmrg * Looks up the string in the table and returns the integer 2302c7c4e3dSmrg * associated with the string. 2312c7c4e3dSmrg * 2322c7c4e3dSmrg * Later may need similar function for unsigned long define. 2332c7c4e3dSmrg * 2342c7c4e3dSmrg * 2352c7c4e3dSmrg * 2362c7c4e3dSmrg * RETURNS 2372c7c4e3dSmrg * The int equivalent of the defined string. 2382c7c4e3dSmrg * -1 if the string is not found in table 2392c7c4e3dSmrg * 2402c7c4e3dSmrg */ 2412c7c4e3dSmrg{ 2422c7c4e3dSmrg return(StrToDefine(KeyTbl, string)); 2432c7c4e3dSmrg} 2442c7c4e3dSmrg 2452c7c4e3dSmrg 2462c7c4e3dSmrg/* 2472c7c4e3dSmrg * NAME 2482c7c4e3dSmrg * SCScrnClassOf - convert screen class string into class ID 2492c7c4e3dSmrg * 2502c7c4e3dSmrg * SYNOPSIS 2512c7c4e3dSmrg */ 2522c7c4e3dSmrgstatic int 2532c7c4e3dSmrgSCScrnClassOf(char *string) 2542c7c4e3dSmrg/* 2552c7c4e3dSmrg * DESCRIPTION 2562c7c4e3dSmrg * Converts a string to an integer define. 2572c7c4e3dSmrg * 2582c7c4e3dSmrg * Looks up the string in the table and returns the integer 2592c7c4e3dSmrg * associated with the string. 2602c7c4e3dSmrg * 2612c7c4e3dSmrg * Later may need similar function for unsigned long define. 2622c7c4e3dSmrg * 2632c7c4e3dSmrg * 2642c7c4e3dSmrg * 2652c7c4e3dSmrg * RETURNS 2662c7c4e3dSmrg * The int equivalent of the defined string. 2672c7c4e3dSmrg * -1 if the string is not found in table 2682c7c4e3dSmrg * 2692c7c4e3dSmrg */ 2702c7c4e3dSmrg{ 2712c7c4e3dSmrg return(StrToDefine(ScrnClassTbl, string)); 2722c7c4e3dSmrg} 2732c7c4e3dSmrg 2742c7c4e3dSmrg 2752c7c4e3dSmrg/* 2762c7c4e3dSmrg * NAME 2772c7c4e3dSmrg * SCScrnClassStringOf - convert screen class id into class string 2782c7c4e3dSmrg * 2792c7c4e3dSmrg * SYNOPSIS 2802c7c4e3dSmrg */ 2812c7c4e3dSmrgstatic char * 2822c7c4e3dSmrgSCScrnClassStringOf(int id) 2832c7c4e3dSmrg/* 2842c7c4e3dSmrg * DESCRIPTION 2852c7c4e3dSmrg * Converts a id to astring 2862c7c4e3dSmrg * 2872c7c4e3dSmrg * RETURNS 2882c7c4e3dSmrg * Pointer to string if found; otherwise NULL. 2892c7c4e3dSmrg * 2902c7c4e3dSmrg */ 2912c7c4e3dSmrg{ 2922c7c4e3dSmrg return(DefineToStr(ScrnClassTbl, id)); 2932c7c4e3dSmrg} 2942c7c4e3dSmrg 2952c7c4e3dSmrg/* close the stream and return any memory allocated. */ 2962c7c4e3dSmrg/*ARGSUSED*/ 2972c7c4e3dSmrgstatic void 2982c7c4e3dSmrgcloseS(FILE *stream, XDCCC_Correction *pCorrection) 2992c7c4e3dSmrg{ 3002c7c4e3dSmrg XDCCC_Correction* pNext; 3012c7c4e3dSmrg if (stream) { 3022c7c4e3dSmrg fclose (stream); 3032c7c4e3dSmrg } 3042c7c4e3dSmrg while (pCorrection) { 3052c7c4e3dSmrg pNext = pCorrection->next; 3062c7c4e3dSmrg free(pCorrection); 3072c7c4e3dSmrg pCorrection = pNext; 3082c7c4e3dSmrg } 3092c7c4e3dSmrg} 3102c7c4e3dSmrg 3112c7c4e3dSmrg/* 3122c7c4e3dSmrg * Get a line of text from the stream. 3132c7c4e3dSmrg */ 3142c7c4e3dSmrgstatic char * 3152c7c4e3dSmrgnextline(char *buf, int maxch, FILE *stream) 3162c7c4e3dSmrg{ 3172c7c4e3dSmrg linenum++; 3182c7c4e3dSmrg return (fgets(buf, maxch, stream)); 3192c7c4e3dSmrg} 3202c7c4e3dSmrg 3212c7c4e3dSmrg 3222c7c4e3dSmrgstatic int 3232c7c4e3dSmrgProcessColorimetric(FILE *stream, XDCCC_Matrix *pMatrix, int VisualFlag) 3242c7c4e3dSmrg{ 3252c7c4e3dSmrg char buf[BUFSIZ]; 3262c7c4e3dSmrg char keyword[BUFSIZ]; 3272c7c4e3dSmrg char token[BUFSIZ], *ptoken; 3282c7c4e3dSmrg int ntok; 3292c7c4e3dSmrg unsigned int matrices_processed = 0; 3302c7c4e3dSmrg /* bit 0 for XYZtoRGB matrix */ 3312c7c4e3dSmrg /* bit 1 for RGBtoXYZ matrix */ 3322c7c4e3dSmrg int state = 0; 3332c7c4e3dSmrg /* 0 -- looking for matrix */ 3342c7c4e3dSmrg /* 1 -- processing data from matrix */ 3352c7c4e3dSmrg /* 2 -- both matrices processed */ 3362c7c4e3dSmrg /* Note: the order of the matrices is not important. */ 3372c7c4e3dSmrg int count = -1; 3382c7c4e3dSmrg XcmsFloat *pElement = NULL; 3392c7c4e3dSmrg 3402c7c4e3dSmrg while ((nextline(buf, BUFSIZ, stream)) != NULL) { 3412c7c4e3dSmrg if ((ntok = sscanf(buf, "%s %s", keyword, token)) > 0) { 3422c7c4e3dSmrg switch (SCKeyOf(keyword)) { 3432c7c4e3dSmrg case XYZTORGBMAT_BEGIN : 3442c7c4e3dSmrg if (VisualFlag != VIDEO_RGB) { 3452c7c4e3dSmrg fprintf(stderr, 3462c7c4e3dSmrg "Line %d: Keyword XYZTORGBMAT_BEGIN mismatch for visual %s.\n", 3472c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 3482c7c4e3dSmrg return (0); 3492c7c4e3dSmrg } 3502c7c4e3dSmrg if (state != 0) { 3512c7c4e3dSmrg fprintf(stderr, 3522c7c4e3dSmrg "Line %d: Extraneous keyword %s.\n", 3532c7c4e3dSmrg linenum, keyword); 3542c7c4e3dSmrg return (0); 3552c7c4e3dSmrg } 3562c7c4e3dSmrg state = 1; 3572c7c4e3dSmrg count = 0; 3582c7c4e3dSmrg pElement = (XcmsFloat *) pMatrix->XYZtoRGBmatrix; 3592c7c4e3dSmrg break; 3602c7c4e3dSmrg case XYZTORGBMAT_END : 3612c7c4e3dSmrg if (VisualFlag != VIDEO_RGB) { 3622c7c4e3dSmrg fprintf(stderr, 3632c7c4e3dSmrg "Line %d: Keyword XYZTORGBMAT_END mismatch for visual %s.\n", 3642c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 3652c7c4e3dSmrg return (0); 3662c7c4e3dSmrg } 3672c7c4e3dSmrg if ((state != 1) || (count != 9)) { 3682c7c4e3dSmrg fprintf(stderr, 3692c7c4e3dSmrg "Line %d: Incomplete XYZtoRGB matrix -- Premature %s\n", 3702c7c4e3dSmrg linenum, keyword); 3712c7c4e3dSmrg return (0); 3722c7c4e3dSmrg } 3732c7c4e3dSmrg matrices_processed |= 0x1; 3742c7c4e3dSmrg if (matrices_processed == 3) { 3752c7c4e3dSmrg state = 2; 3762c7c4e3dSmrg } else { 3772c7c4e3dSmrg state = 0; 3782c7c4e3dSmrg } 3792c7c4e3dSmrg break; 3802c7c4e3dSmrg case RGBTOXYZMAT_BEGIN : 3812c7c4e3dSmrg if (VisualFlag != VIDEO_RGB) { 3822c7c4e3dSmrg fprintf(stderr, 3832c7c4e3dSmrg "Line %d: Keyword RGBTOXYZMAT_BEGIN mismatch for visual %s.\n", 3842c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 3852c7c4e3dSmrg return (0); 3862c7c4e3dSmrg } 3872c7c4e3dSmrg if (state != 0) { 3882c7c4e3dSmrg fprintf(stderr, "Line %d: Extraneous keyword %s.\n", 3892c7c4e3dSmrg linenum, keyword); 3902c7c4e3dSmrg return (0); 3912c7c4e3dSmrg } 3922c7c4e3dSmrg state = 1; 3932c7c4e3dSmrg count = 0; 3942c7c4e3dSmrg pElement = (XcmsFloat *) pMatrix->RGBtoXYZmatrix; 3952c7c4e3dSmrg break; 3962c7c4e3dSmrg case RGBTOXYZMAT_END : 3972c7c4e3dSmrg if (VisualFlag != VIDEO_RGB) { 3982c7c4e3dSmrg fprintf(stderr, 3992c7c4e3dSmrg "Line %d: Keyword RGBTOXYZMAT_END mismatch for visual %s.\n", 4002c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 4012c7c4e3dSmrg return (0); 4022c7c4e3dSmrg } 4032c7c4e3dSmrg if ((state != 1) || (count != 9)) { 4042c7c4e3dSmrg fprintf(stderr, 4052c7c4e3dSmrg "Line %d: Incomplete RGBtoXYZ matrix -- Premature %s\n", 4062c7c4e3dSmrg linenum, keyword); 4072c7c4e3dSmrg return (0); 4082c7c4e3dSmrg } 4092c7c4e3dSmrg matrices_processed |= 0x2; 4102c7c4e3dSmrg if (matrices_processed == 3) { 4112c7c4e3dSmrg state = 2; 4122c7c4e3dSmrg } else { 4132c7c4e3dSmrg state = 0; 4142c7c4e3dSmrg } 4152c7c4e3dSmrg break; 4162c7c4e3dSmrg#ifdef GRAY 4172c7c4e3dSmrg case WHITEPT_XYZ_BEGIN : 4182c7c4e3dSmrg if (VisualFlag != VIDEO_GRAY) { 4192c7c4e3dSmrg fprintf(stderr, 4202c7c4e3dSmrg "Line %d: Keyword WHITEPT_XYZ_BEGIN mismatch for visual %s.\n", 4212c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 4222c7c4e3dSmrg return (0); 4232c7c4e3dSmrg } 4242c7c4e3dSmrg if (state != 0) { 4252c7c4e3dSmrg fprintf(stderr, 4262c7c4e3dSmrg "Line %d: Extraneous keyword %s.\n", 4272c7c4e3dSmrg linenum, keyword); 4282c7c4e3dSmrg return (0); 4292c7c4e3dSmrg } 4302c7c4e3dSmrg state = 1; 4312c7c4e3dSmrg count = 0; 4322c7c4e3dSmrg pElement = (XcmsFloat *) pMatrix->XYZtoRGBmatrix; 4332c7c4e3dSmrg break; 4342c7c4e3dSmrg case WHITEPT_XYZ_END : 4352c7c4e3dSmrg if (VisualFlag != VIDEO_GRAY) { 4362c7c4e3dSmrg fprintf(stderr, 4372c7c4e3dSmrg "Line %d: Keyword WHITEPT_XYZ_END mismatch for visual %s.\n", 4382c7c4e3dSmrg linenum, SCScrnClassStringOf(VisualFlag)); 4392c7c4e3dSmrg return (0); 4402c7c4e3dSmrg } 4412c7c4e3dSmrg if ((state != 1) || (count != 3)) { 4422c7c4e3dSmrg fprintf(stderr, 4432c7c4e3dSmrg "Line %d: Incomplete white point -- Premature %s\n", 4442c7c4e3dSmrg linenum, keyword); 4452c7c4e3dSmrg return (0); 4462c7c4e3dSmrg } 4472c7c4e3dSmrg state = 2; 4482c7c4e3dSmrg break; 4492c7c4e3dSmrg#endif /* GRAY */ 4502c7c4e3dSmrg case DATA : 4512c7c4e3dSmrg for (ptoken = strtok(buf, DATA_DELIMS); ptoken != NULL; 4522c7c4e3dSmrg ptoken = strtok(NULL, DATA_DELIMS)) { 4532c7c4e3dSmrg if (sscanf(ptoken, "%lf", pElement) != 1) { 4542c7c4e3dSmrg if (VisualFlag == VIDEO_RGB) { 4552c7c4e3dSmrg fprintf(stderr, 4562c7c4e3dSmrg "Line %d: Invalid matrix value %s.", 4572c7c4e3dSmrg linenum, ptoken); 4582c7c4e3dSmrg } else { 4592c7c4e3dSmrg fprintf(stderr, 4602c7c4e3dSmrg "Line %d: Invalid CIEXYZ value %s.\n", 4612c7c4e3dSmrg linenum, ptoken); 4622c7c4e3dSmrg } 4632c7c4e3dSmrg return (0); 4642c7c4e3dSmrg } 4652c7c4e3dSmrg pElement++; 4662c7c4e3dSmrg if (VisualFlag == VIDEO_RGB) { 4672c7c4e3dSmrg if (++count > 9) { 4682c7c4e3dSmrg fprintf(stderr, 4692c7c4e3dSmrg "Line %d: Extra matrix value %s\n", 4702c7c4e3dSmrg linenum, ptoken); 4712c7c4e3dSmrg return (0); 4722c7c4e3dSmrg } 4732c7c4e3dSmrg } else { 4742c7c4e3dSmrg if (++count > 3) { 4752c7c4e3dSmrg fprintf(stderr, 4762c7c4e3dSmrg "Line %d: Extra CIEXYZ value %s.\n", 4772c7c4e3dSmrg linenum, ptoken); 4782c7c4e3dSmrg return (0); 4792c7c4e3dSmrg } 4802c7c4e3dSmrg } 4812c7c4e3dSmrg } 4822c7c4e3dSmrg break; 4832c7c4e3dSmrg case COLORIMETRIC_BEGIN : 4842c7c4e3dSmrg fprintf(stderr, 4852c7c4e3dSmrg "Line %d: Extraneous keyword %s.\n", 4862c7c4e3dSmrg linenum, keyword); 4872c7c4e3dSmrg return (0); 4882c7c4e3dSmrg/* NOTREACHED */break; 4892c7c4e3dSmrg case COLORIMETRIC_END : 4902c7c4e3dSmrg if (state != 2) { 4912c7c4e3dSmrg fprintf(stderr, 4922c7c4e3dSmrg "Line %d: Incomplete Colorimetric data -- Premature %s\n", 4932c7c4e3dSmrg linenum, keyword); 4942c7c4e3dSmrg return (0); 4952c7c4e3dSmrg } 4962c7c4e3dSmrg return (1); 4972c7c4e3dSmrg case COMMENT : 4982c7c4e3dSmrg /* Currently, do nothing. */ 4992c7c4e3dSmrg break; 5002c7c4e3dSmrg default : 5012c7c4e3dSmrg fprintf(stderr, 5022c7c4e3dSmrg "Line %d: Unexpected keyword %s\n", 5032c7c4e3dSmrg linenum, keyword); 5042c7c4e3dSmrg return (0); 5052c7c4e3dSmrg/* NOTREACHED */break; 5062c7c4e3dSmrg } 5072c7c4e3dSmrg } else if (ntok < 0) { 5082c7c4e3dSmrg /* mismatch */ 5092c7c4e3dSmrg fprintf(stderr, "Line %d: Unrecognized keyword\n", linenum); 5102c7c4e3dSmrg return (0); 5112c7c4e3dSmrg/* NOTREACHED */break; 5122c7c4e3dSmrg } 5132c7c4e3dSmrg } 5142c7c4e3dSmrg return (0); 5152c7c4e3dSmrg} 5162c7c4e3dSmrg 5172c7c4e3dSmrgstatic int 5182c7c4e3dSmrgProcessIProfile(FILE *stream, XDCCC_Correction *pCorrection) 5192c7c4e3dSmrg{ 5202c7c4e3dSmrg char buf[BUFSIZ]; 5212c7c4e3dSmrg char *keyword; 5222c7c4e3dSmrg char *tableStr, *sizeStr, *ptoken; 5232c7c4e3dSmrg int size; 5242c7c4e3dSmrg int state = 0; 5252c7c4e3dSmrg /************************************************ 5262c7c4e3dSmrg * 0 -- Looking for Intensity Table(s) * 5272c7c4e3dSmrg * 1 -- Processing Intensity Table(s) * 5282c7c4e3dSmrg ************************************************/ 5292c7c4e3dSmrg int nTbl = 0; 5302c7c4e3dSmrg int count = 0; 5312c7c4e3dSmrg IntensityRec *pIRec = NULL; 5322c7c4e3dSmrg 5332c7c4e3dSmrg while ((nextline(buf, BUFSIZ, stream)) != NULL) { 5342c7c4e3dSmrg ptoken = keyword = strtok(buf, DATA_DELIMS); 5352c7c4e3dSmrg if (keyword != (char*)NULL) { 5362c7c4e3dSmrg switch (SCKeyOf(keyword)) { 5372c7c4e3dSmrg case ITBL_BEGIN : 5382c7c4e3dSmrg if (state != 0) { 5392c7c4e3dSmrg fprintf(stderr,"Line %d: unexpected keyword %s\n", 5402c7c4e3dSmrg linenum, keyword); 5412c7c4e3dSmrg return (0); 5422c7c4e3dSmrg } 5432c7c4e3dSmrg tableStr = strtok((char*)NULL, DATA_DELIMS); 5442c7c4e3dSmrg sizeStr = strtok((char*)NULL, DATA_DELIMS); 5452c7c4e3dSmrg if ((sizeStr == (char*)NULL) || 5462c7c4e3dSmrg sscanf(sizeStr, "%d", &size) != 1) { 5472c7c4e3dSmrg fprintf(stderr, 5482c7c4e3dSmrg "Line %d: invalid Intensity Table size, %s.\n", 5492c7c4e3dSmrg linenum, sizeStr); 5502c7c4e3dSmrg return (0); 5512c7c4e3dSmrg } 5522c7c4e3dSmrg if (size < 0) { 5532c7c4e3dSmrg fprintf(stderr, 5542c7c4e3dSmrg "Line %d: count %d < 0 for Intensity Table.\n", 5552c7c4e3dSmrg linenum, size); 5562c7c4e3dSmrg return (0); 5572c7c4e3dSmrg } 5582c7c4e3dSmrg if (strcmp(tableStr, "GREEN") == 0) { 5592c7c4e3dSmrg if (pCorrection->nTables != 3) { 5602c7c4e3dSmrg fprintf(stderr,"Line %d: incorrect number of tables\n", 5612c7c4e3dSmrg linenum); 5622c7c4e3dSmrg return (0); 5632c7c4e3dSmrg } 5642c7c4e3dSmrg if (pCorrection->pGreenTbl->pBase != NULL) { 5652c7c4e3dSmrg fprintf(stderr, 5662c7c4e3dSmrg "Line %d: multiple GREEN Intensity Profiles\n", 5672c7c4e3dSmrg linenum); 5682c7c4e3dSmrg return (0); 5692c7c4e3dSmrg } 5702c7c4e3dSmrg pCorrection->pGreenTbl->nEntries = size; 5712c7c4e3dSmrg pCorrection->pGreenTbl->pBase = 5722c7c4e3dSmrg (IntensityRec *) calloc (size, sizeof(IntensityRec)); 5732c7c4e3dSmrg if (!pCorrection->pGreenTbl->pBase) { 5742c7c4e3dSmrg fprintf(stderr, 5752c7c4e3dSmrg "Line %d: Unable to allocate space for GREEN Intensity Profile\n", linenum); 5762c7c4e3dSmrg return (0); 5772c7c4e3dSmrg } 5782c7c4e3dSmrg pIRec = pCorrection->pGreenTbl->pBase; 5792c7c4e3dSmrg } else if (strcmp(tableStr, "BLUE") == 0) { 5802c7c4e3dSmrg if (pCorrection->nTables != 3) { 5812c7c4e3dSmrg fprintf(stderr, 5822c7c4e3dSmrg "Line %d: incorrect number of tables\n", 5832c7c4e3dSmrg linenum); 5842c7c4e3dSmrg return (0); 5852c7c4e3dSmrg } 5862c7c4e3dSmrg if (pCorrection->pBlueTbl->pBase != NULL) { 5872c7c4e3dSmrg fprintf(stderr, 5882c7c4e3dSmrg "Line %d: multiple BLUE Intensity Profiles\n", 5892c7c4e3dSmrg linenum); 5902c7c4e3dSmrg return (0); 5912c7c4e3dSmrg } 5922c7c4e3dSmrg pCorrection->pBlueTbl->nEntries = size; 5932c7c4e3dSmrg pCorrection->pBlueTbl->pBase = 5942c7c4e3dSmrg (IntensityRec *) calloc (size, sizeof(IntensityRec)); 5952c7c4e3dSmrg if (!pCorrection->pBlueTbl->pBase) { 5962c7c4e3dSmrg fprintf(stderr, 5972c7c4e3dSmrg "Line %d: Unable to allocate space for BLUE Intensity Profile\n", linenum); 5982c7c4e3dSmrg return (0); 5992c7c4e3dSmrg } 6002c7c4e3dSmrg pIRec = pCorrection->pBlueTbl->pBase; 6012c7c4e3dSmrg } else { 6022c7c4e3dSmrg if (!strcmp(tableStr, "RGB") && pCorrection->nTables != 1) { 6032c7c4e3dSmrg fprintf(stderr,"Line %d: multiple RGB Intensity Tables", 6042c7c4e3dSmrg linenum); 6052c7c4e3dSmrg return (0); 6062c7c4e3dSmrg } 6072c7c4e3dSmrg if (pCorrection->pRedTbl->pBase != NULL) { 6082c7c4e3dSmrg fprintf(stderr, 6092c7c4e3dSmrg "Line %d: multiple RED or GREEN or BLUE Intensity Tables\n", 6102c7c4e3dSmrg linenum); 6112c7c4e3dSmrg return (0); 6122c7c4e3dSmrg } 6132c7c4e3dSmrg pCorrection->pRedTbl->nEntries = size; 6142c7c4e3dSmrg pCorrection->pRedTbl->pBase = 6152c7c4e3dSmrg (IntensityRec *) calloc (size, sizeof(IntensityRec)); 6162c7c4e3dSmrg if (!pCorrection->pRedTbl->pBase) { 6172c7c4e3dSmrg fprintf(stderr, 6182c7c4e3dSmrg "Line %d: Unable to allocate space for intensity table\n", linenum); 6192c7c4e3dSmrg return (0); 6202c7c4e3dSmrg } 6212c7c4e3dSmrg pIRec = pCorrection->pRedTbl->pBase; 6222c7c4e3dSmrg } 6232c7c4e3dSmrg state = 1; 6242c7c4e3dSmrg count = 0; 6252c7c4e3dSmrg break; 6262c7c4e3dSmrg case ITBL_END : 6272c7c4e3dSmrg if ((state != 1) || (count != size)) { 6282c7c4e3dSmrg fprintf(stderr, 6292c7c4e3dSmrg "Line %d: incomplete Intensity Table -- Premature %s\n", 6302c7c4e3dSmrg linenum, keyword); 6312c7c4e3dSmrg return (0); 6322c7c4e3dSmrg } 6332c7c4e3dSmrg nTbl++; 6342c7c4e3dSmrg state = 0; 6352c7c4e3dSmrg break; 6362c7c4e3dSmrg case DATA : 6372c7c4e3dSmrg do { 6382c7c4e3dSmrg /******************************************************** 6392c7c4e3dSmrg * Note: tableType should only be 0 or 1 at this point. 6402c7c4e3dSmrg * 0 indicates value and intensity stored. 6412c7c4e3dSmrg * 1 indicates only intensity stored. 6422c7c4e3dSmrg ********************************************************/ 6432c7c4e3dSmrg if (pCorrection->tableType) { 6442c7c4e3dSmrg if (sscanf(ptoken, "%lf", &pIRec->intensity) != 1) { 6452c7c4e3dSmrg fprintf(stderr, 6462c7c4e3dSmrg "Line %d: invalid Intensity Profile value %s\n", 6472c7c4e3dSmrg linenum, ptoken); 6482c7c4e3dSmrg return (0); 6492c7c4e3dSmrg } 6502c7c4e3dSmrg /* With tableType 1 only store the intensity. */ 6512c7c4e3dSmrg pIRec++; 6522c7c4e3dSmrg } else { 6532c7c4e3dSmrg short tmp; 6542c7c4e3dSmrg /* Note ansi C can handle 0x preceeding hex number */ 6552c7c4e3dSmrg if (sscanf(ptoken, "%hi", &tmp) != 1) { 6562c7c4e3dSmrg fprintf(stderr, 6572c7c4e3dSmrg "Line %d: invalid Intensity Profile value %s\n", 6582c7c4e3dSmrg linenum, ptoken); 6592c7c4e3dSmrg return (0); 6602c7c4e3dSmrg } else 6612c7c4e3dSmrg pIRec->value = tmp; 6622c7c4e3dSmrg if ((ptoken = strtok(NULL, DATA_DELIMS)) == NULL) { 6632c7c4e3dSmrg fprintf(stderr, 6642c7c4e3dSmrg "Line %d: missing Intensity Profile value\n", 6652c7c4e3dSmrg linenum); 6662c7c4e3dSmrg return (0); 6672c7c4e3dSmrg } 6682c7c4e3dSmrg if (sscanf(ptoken, "%lf", &pIRec->intensity) != 1) { 6692c7c4e3dSmrg fprintf(stderr, 6702c7c4e3dSmrg "Line %d: invalid Intensity Profile intensity %s\n", 6712c7c4e3dSmrg linenum, ptoken); 6722c7c4e3dSmrg return (0); 6732c7c4e3dSmrg } 6742c7c4e3dSmrg /* With tableType 0 only store both value & intensity*/ 6752c7c4e3dSmrg pIRec++; 6762c7c4e3dSmrg } 6772c7c4e3dSmrg if (++count > size) { 6782c7c4e3dSmrg fprintf(stderr, 6792c7c4e3dSmrg "Line %d: extra Intensity value %s\n", 6802c7c4e3dSmrg linenum, ptoken); 6812c7c4e3dSmrg return (0); 6822c7c4e3dSmrg } 6832c7c4e3dSmrg ptoken = strtok(NULL, DATA_DELIMS); 6842c7c4e3dSmrg } while(ptoken != NULL); 6852c7c4e3dSmrg break; 6862c7c4e3dSmrg case IPROFILE_BEGIN : 6872c7c4e3dSmrg fprintf(stderr,"Line %d: extraneous keyword %s\n", 6882c7c4e3dSmrg linenum, keyword); 6892c7c4e3dSmrg return (0); 6902c7c4e3dSmrg/* NOTREACHED */break; 6912c7c4e3dSmrg case IPROFILE_END : 6922c7c4e3dSmrg if ((state != 0) || (nTbl != pCorrection->nTables)) { 6932c7c4e3dSmrg fprintf(stderr, 6942c7c4e3dSmrg "Line %d: incomplete Intensity Profile data -- Premature %s\n", 6952c7c4e3dSmrg linenum, keyword); 6962c7c4e3dSmrg return (0); 6972c7c4e3dSmrg } 6982c7c4e3dSmrg return (1); 6992c7c4e3dSmrg case COMMENT : 7002c7c4e3dSmrg /* ignore line */ 7012c7c4e3dSmrg break; 7022c7c4e3dSmrg default : 7032c7c4e3dSmrg fprintf(stderr,"Line %d: unexpected keyword %s\n", 7042c7c4e3dSmrg linenum, keyword); 7052c7c4e3dSmrg return (0); 7062c7c4e3dSmrg/* NOTREACHED */break; 7072c7c4e3dSmrg } 7082c7c4e3dSmrg } /* else its was just a blank line */ 7092c7c4e3dSmrg } 7102c7c4e3dSmrg return (0); 7112c7c4e3dSmrg} 7122c7c4e3dSmrg 7132c7c4e3dSmrgstatic void 7142c7c4e3dSmrgPutTableType0Card8(IntensityTbl *pTbl, unsigned char **pCard8) 7152c7c4e3dSmrg{ 7162c7c4e3dSmrg unsigned int count; 7172c7c4e3dSmrg IntensityRec *pIRec; 7182c7c4e3dSmrg 7192c7c4e3dSmrg pIRec = pTbl->pBase; 7202c7c4e3dSmrg count = pTbl->nEntries; 7212c7c4e3dSmrg **pCard8 = count - 1; 7222c7c4e3dSmrg *pCard8 += 1; 7232c7c4e3dSmrg for (; count; count--, pIRec++) { 7242c7c4e3dSmrg **pCard8 = pIRec->value >> 8; 7252c7c4e3dSmrg *pCard8 += 1; 7262c7c4e3dSmrg **pCard8 = pIRec->intensity * 255.0; 7272c7c4e3dSmrg *pCard8 += 1; 7282c7c4e3dSmrg } 7292c7c4e3dSmrg} 7302c7c4e3dSmrg 7312c7c4e3dSmrgstatic void 7322c7c4e3dSmrgPutTableType1Card8(IntensityTbl *pTbl, unsigned char **pCard8) 7332c7c4e3dSmrg{ 7342c7c4e3dSmrg unsigned int count; 7352c7c4e3dSmrg IntensityRec *pIRec; 7362c7c4e3dSmrg 7372c7c4e3dSmrg pIRec = pTbl->pBase; 7382c7c4e3dSmrg count = pTbl->nEntries; 7392c7c4e3dSmrg **pCard8 = count - 1; 7402c7c4e3dSmrg *pCard8 += 1; 7412c7c4e3dSmrg for (; count; count--, pIRec++) { 7422c7c4e3dSmrg **pCard8 = pIRec->intensity * 255.0; 7432c7c4e3dSmrg *pCard8 += 1; 7442c7c4e3dSmrg } 7452c7c4e3dSmrg} 7462c7c4e3dSmrg 7472c7c4e3dSmrgstatic void 7482c7c4e3dSmrgPutTableType0Card16(IntensityTbl *pTbl, unsigned short **pCard16) 7492c7c4e3dSmrg{ 7502c7c4e3dSmrg unsigned int count; 7512c7c4e3dSmrg IntensityRec *pIRec; 7522c7c4e3dSmrg 7532c7c4e3dSmrg pIRec = pTbl->pBase; 7542c7c4e3dSmrg count = pTbl->nEntries; 7552c7c4e3dSmrg **pCard16 = count - 1; 7562c7c4e3dSmrg *pCard16 += 1; 7572c7c4e3dSmrg for (; count; count--, pIRec++) { 7582c7c4e3dSmrg **pCard16 = pIRec->value; 7592c7c4e3dSmrg *pCard16 += 1; 7602c7c4e3dSmrg **pCard16 = pIRec->intensity * 65535.0; 7612c7c4e3dSmrg *pCard16 += 1; 7622c7c4e3dSmrg } 7632c7c4e3dSmrg} 7642c7c4e3dSmrg 7652c7c4e3dSmrgstatic void 7662c7c4e3dSmrgPutTableType1Card16(IntensityTbl *pTbl, unsigned short **pCard16) 7672c7c4e3dSmrg{ 7682c7c4e3dSmrg unsigned int count; 7692c7c4e3dSmrg IntensityRec *pIRec; 7702c7c4e3dSmrg 7712c7c4e3dSmrg pIRec = pTbl->pBase; 7722c7c4e3dSmrg count = pTbl->nEntries; 7732c7c4e3dSmrg **pCard16 = count - 1; 7742c7c4e3dSmrg *pCard16 += 1; 7752c7c4e3dSmrg for (; count; count--, pIRec++) { 7762c7c4e3dSmrg **pCard16 = pIRec->intensity * 65535.0; 7772c7c4e3dSmrg *pCard16 += 1; 7782c7c4e3dSmrg } 7792c7c4e3dSmrg} 7802c7c4e3dSmrg 7812c7c4e3dSmrgstatic void 7822c7c4e3dSmrgPutTableType0Card32(IntensityTbl *pTbl, unsigned long **pCard32) 7832c7c4e3dSmrg{ 7842c7c4e3dSmrg unsigned int count; 7852c7c4e3dSmrg IntensityRec *pIRec; 7862c7c4e3dSmrg 7872c7c4e3dSmrg pIRec = pTbl->pBase; 7882c7c4e3dSmrg count = pTbl->nEntries; 7892c7c4e3dSmrg **pCard32 = count - 1; 7902c7c4e3dSmrg *pCard32 += 1; 7912c7c4e3dSmrg for (; count; count--, pIRec++) { 7922c7c4e3dSmrg **pCard32 = pIRec->value; 7932c7c4e3dSmrg *pCard32 += 1; 7942c7c4e3dSmrg **pCard32 = pIRec->intensity * 4294967295.0; 7952c7c4e3dSmrg *pCard32 += 1; 7962c7c4e3dSmrg } 7972c7c4e3dSmrg} 7982c7c4e3dSmrg 7992c7c4e3dSmrgstatic void 8002c7c4e3dSmrgPutTableType1Card32(IntensityTbl *pTbl, unsigned long **pCard32) 8012c7c4e3dSmrg{ 8022c7c4e3dSmrg unsigned int count; 8032c7c4e3dSmrg IntensityRec *pIRec; 8042c7c4e3dSmrg 8052c7c4e3dSmrg pIRec = pTbl->pBase; 8062c7c4e3dSmrg count = pTbl->nEntries; 8072c7c4e3dSmrg **pCard32 = count - 1; 8082c7c4e3dSmrg *pCard32 += 1; 8092c7c4e3dSmrg for (; count; count--, pIRec++) { 8102c7c4e3dSmrg **pCard32 = pIRec->intensity * 4294967295.0; 8112c7c4e3dSmrg *pCard32 += 1; 8122c7c4e3dSmrg } 8132c7c4e3dSmrg} 8142c7c4e3dSmrg 8152c7c4e3dSmrg 8162c7c4e3dSmrgstatic void 8172c7c4e3dSmrgLoadMatrix(Display *pDpy, Window root, XDCCC_Matrix *pMatrix) 8182c7c4e3dSmrg{ 8192c7c4e3dSmrg int count; 8202c7c4e3dSmrg unsigned long *pCard32; 8212c7c4e3dSmrg unsigned long Card32Array[18]; 8222c7c4e3dSmrg Atom MatricesAtom; 8232c7c4e3dSmrg XcmsFloat *pValue; 8242c7c4e3dSmrg 8252c7c4e3dSmrg /* 8262c7c4e3dSmrg * Store the XDCCC_LINEAR_RGB_MATRICES 8272c7c4e3dSmrg */ 8282c7c4e3dSmrg pCard32 = Card32Array; 8292c7c4e3dSmrg pValue = (XcmsFloat *)pMatrix->XYZtoRGBmatrix; 8302c7c4e3dSmrg for (count = 0; count < 9; count++) { 8312c7c4e3dSmrg *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER); 8322c7c4e3dSmrg } 8332c7c4e3dSmrg pValue = (XcmsFloat *)pMatrix->RGBtoXYZmatrix; 8342c7c4e3dSmrg for (count = 0; count < 9; count++) { 8352c7c4e3dSmrg *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER); 8362c7c4e3dSmrg } 8372c7c4e3dSmrg MatricesAtom = XInternAtom (pDpy, XDCCC_MATRIX_ATOM_NAME, False); 8382c7c4e3dSmrg XChangeProperty (pDpy, root, MatricesAtom, XA_INTEGER, 32, 8392c7c4e3dSmrg PropModeReplace, (unsigned char *)Card32Array, 18); 8402c7c4e3dSmrg} 8412c7c4e3dSmrg 8422c7c4e3dSmrg 8432c7c4e3dSmrgstatic int 8442c7c4e3dSmrgLoadCorrections(Display *pDpy, Window root, XDCCC_Correction *pCorrection, 8452c7c4e3dSmrg int targetFormat) 8462c7c4e3dSmrg{ 8472c7c4e3dSmrg unsigned char *pCard8; 8482c7c4e3dSmrg unsigned char *pCard8Array = (unsigned char *)NULL; 8492c7c4e3dSmrg unsigned short *pCard16; 8502c7c4e3dSmrg unsigned short *pCard16Array = (unsigned short *)NULL; 8512c7c4e3dSmrg unsigned long *pCard32; 8522c7c4e3dSmrg unsigned long *pCard32Array = (unsigned long *)NULL; 8532c7c4e3dSmrg Atom CorrectAtom; 8542c7c4e3dSmrg int total; 8552c7c4e3dSmrg int i; 8562c7c4e3dSmrg 8572c7c4e3dSmrg /* 8582c7c4e3dSmrg * Store each XDCCC_CORRECTION into XDCCC_LINEAR_RGB_CORRECTION property 8592c7c4e3dSmrg */ 8602c7c4e3dSmrg CorrectAtom = XInternAtom (pDpy, XDCCC_CORRECT_ATOM_NAME, False); 8612c7c4e3dSmrg 8622c7c4e3dSmrg for (i = 0; pCorrection; i++, pCorrection = pCorrection->next) { 8632c7c4e3dSmrg if ((pCorrection->tableType != 0) && (pCorrection->tableType != 1)) { 8642c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 8652c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: Invalid intensity table type %d.\n", 8662c7c4e3dSmrg pCorrection->visual_info.visualid, 8672c7c4e3dSmrg pCorrection->tableType); 8682c7c4e3dSmrg } else { 8692c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: Invalid intensity table type %d.\n", 8702c7c4e3dSmrg pCorrection->tableType); 8712c7c4e3dSmrg } 8722c7c4e3dSmrg return(0); 8732c7c4e3dSmrg } 8742c7c4e3dSmrg 8752c7c4e3dSmrg if (pCorrection->nTables != 1 && pCorrection->nTables != 3) { 8762c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 8772c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: %d invalid number of tables.\n", 8782c7c4e3dSmrg pCorrection->visual_info.visualid, 8792c7c4e3dSmrg pCorrection->nTables); 8802c7c4e3dSmrg } else { 8812c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: %d invalid number of tables.\n", 8822c7c4e3dSmrg pCorrection->nTables); 8832c7c4e3dSmrg } 8842c7c4e3dSmrg return(0); 8852c7c4e3dSmrg } 8862c7c4e3dSmrg 8872c7c4e3dSmrg if (pCorrection->nTables == 1) { 8882c7c4e3dSmrg if (pCorrection->pRedTbl->nEntries < 2) { 8892c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 8902c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: Illegal number of entries in table\n", 8912c7c4e3dSmrg pCorrection->visual_info.visualid); 8922c7c4e3dSmrg } else { 8932c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: Illegal number of entries in table\n"); 8942c7c4e3dSmrg } 8952c7c4e3dSmrg return (0); 8962c7c4e3dSmrg } 8972c7c4e3dSmrg switch (targetFormat) { 8982c7c4e3dSmrg case 8: 8992c7c4e3dSmrg total = 7 + (pCorrection->pRedTbl->nEntries * 9002c7c4e3dSmrg (pCorrection->tableType == 0 ? 2 : 1)); 9012c7c4e3dSmrg if ((pCard8 = pCard8Array = (unsigned char *) calloc (total, 9022c7c4e3dSmrg sizeof (unsigned char))) == NULL) { 9032c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 9042c7c4e3dSmrg return (0); 9052c7c4e3dSmrg } 9062c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 24) & 0xFF; 9072c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 16) & 0xFF; 9082c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 8) & 0xFF; 9092c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid) & 0xFF; 9102c7c4e3dSmrg *pCard8++ = pCorrection->tableType; /* type */ 9112c7c4e3dSmrg *pCard8++ = 1; /* number of tables = 1 */ 9122c7c4e3dSmrg if (pCorrection->tableType == 0) { 9132c7c4e3dSmrg PutTableType0Card8(pCorrection->pRedTbl, &pCard8); 9142c7c4e3dSmrg } else { 9152c7c4e3dSmrg PutTableType1Card8(pCorrection->pRedTbl, &pCard8); 9162c7c4e3dSmrg } 9172c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8, 9182c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 9192c7c4e3dSmrg (unsigned char *)pCard8Array, total); 9202c7c4e3dSmrg free(pCard8Array); 9212c7c4e3dSmrg break; 9222c7c4e3dSmrg case 16: 9232c7c4e3dSmrg total = 5 + (pCorrection->pRedTbl->nEntries * 9242c7c4e3dSmrg (pCorrection->tableType == 0 ? 2 : 1)); 9252c7c4e3dSmrg if ((pCard16 = pCard16Array = (unsigned short *) calloc (total, 9262c7c4e3dSmrg sizeof (unsigned short))) == NULL) { 9272c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 9282c7c4e3dSmrg return (0); 9292c7c4e3dSmrg } 9302c7c4e3dSmrg *pCard16++ = (pCorrection->visual_info.visualid >> 16) & 0xFFFF; 9312c7c4e3dSmrg *pCard16++ = (pCorrection->visual_info.visualid) & 0xFFFF; 9322c7c4e3dSmrg *pCard16++ = pCorrection->tableType; /* type */ 9332c7c4e3dSmrg *pCard16++ = 1; /* number of tables = 1 */ 9342c7c4e3dSmrg if (pCorrection->tableType == 0) { 9352c7c4e3dSmrg PutTableType0Card16(pCorrection->pRedTbl, &pCard16); 9362c7c4e3dSmrg } else { 9372c7c4e3dSmrg PutTableType1Card16(pCorrection->pRedTbl, &pCard16); 9382c7c4e3dSmrg } 9392c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16, 9402c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 9412c7c4e3dSmrg (unsigned char *)pCard16Array, total); 9422c7c4e3dSmrg free(pCard16Array); 9432c7c4e3dSmrg break; 9442c7c4e3dSmrg case 32: 9452c7c4e3dSmrg total = 4 + (pCorrection->pRedTbl->nEntries * 9462c7c4e3dSmrg (pCorrection->tableType == 0 ? 2 : 1)); 9472c7c4e3dSmrg if ((pCard32 = pCard32Array = 9482c7c4e3dSmrg (unsigned long *) calloc (total, 9492c7c4e3dSmrg sizeof (unsigned long))) == NULL) { 9502c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 9512c7c4e3dSmrg return (0); 9522c7c4e3dSmrg } 9532c7c4e3dSmrg *pCard32++ = pCorrection->visual_info.visualid; 9542c7c4e3dSmrg *pCard32++ = pCorrection->tableType; /* type */ 9552c7c4e3dSmrg *pCard32++ = 1; /* number of tables = 1 */ 9562c7c4e3dSmrg if (pCorrection->tableType == 0) { 9572c7c4e3dSmrg PutTableType0Card32(pCorrection->pRedTbl, &pCard32); 9582c7c4e3dSmrg } else { 9592c7c4e3dSmrg PutTableType1Card32(pCorrection->pRedTbl, &pCard32); 9602c7c4e3dSmrg } 9612c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32, 9622c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 9632c7c4e3dSmrg (unsigned char *)pCard32Array, total); 9642c7c4e3dSmrg free(pCard32Array); 9652c7c4e3dSmrg break; 9662c7c4e3dSmrg default: 9672c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 9682c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: Invalid property format\n", 9692c7c4e3dSmrg pCorrection->visual_info.visualid); 9702c7c4e3dSmrg } else { 9712c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: Invalid property format\n"); 9722c7c4e3dSmrg } 9732c7c4e3dSmrg return (0); 9742c7c4e3dSmrg } 9752c7c4e3dSmrg } else { /* pCorrection->nTables == 3 */ 9762c7c4e3dSmrg if ((pCorrection->pRedTbl->nEntries < 2) || 9772c7c4e3dSmrg (pCorrection->pGreenTbl->nEntries < 2) || 9782c7c4e3dSmrg (pCorrection->pBlueTbl->nEntries < 2)) { 9792c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 9802c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: Illegal number of entries in table\n", 9812c7c4e3dSmrg pCorrection->visual_info.visualid); 9822c7c4e3dSmrg } else { 9832c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: Illegal number of entries in table\n"); 9842c7c4e3dSmrg } 9852c7c4e3dSmrg return (0); 9862c7c4e3dSmrg } 9872c7c4e3dSmrg switch (targetFormat) { 9882c7c4e3dSmrg case 8: 9892c7c4e3dSmrg total = 9 + /* visualID, type, and 3 lengths */ 9902c7c4e3dSmrg (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 9912c7c4e3dSmrg (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 9922c7c4e3dSmrg (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)); 9932c7c4e3dSmrg if ((pCard8 = pCard8Array = 9942c7c4e3dSmrg (unsigned char *) calloc (total, 9952c7c4e3dSmrg sizeof (unsigned char))) == NULL) { 9962c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 9972c7c4e3dSmrg return (0); 9982c7c4e3dSmrg } 9992c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 24) & 0xFF; 10002c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 16) & 0xFF; 10012c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid >> 8) & 0xFF; 10022c7c4e3dSmrg *pCard8++ = (pCorrection->visual_info.visualid) & 0xFF; 10032c7c4e3dSmrg *pCard8++ = pCorrection->tableType; /* type */ 10042c7c4e3dSmrg *pCard8++ = 3; /* number of tables = 3 */ 10052c7c4e3dSmrg if (pCorrection->tableType == 0) { 10062c7c4e3dSmrg PutTableType0Card8(pCorrection->pRedTbl, &pCard8); 10072c7c4e3dSmrg PutTableType0Card8(pCorrection->pGreenTbl, &pCard8); 10082c7c4e3dSmrg PutTableType0Card8(pCorrection->pBlueTbl, &pCard8); 10092c7c4e3dSmrg } else { 10102c7c4e3dSmrg PutTableType1Card8(pCorrection->pRedTbl, &pCard8); 10112c7c4e3dSmrg PutTableType1Card8(pCorrection->pGreenTbl, &pCard8); 10122c7c4e3dSmrg PutTableType1Card8(pCorrection->pBlueTbl, &pCard8); 10132c7c4e3dSmrg } 10142c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8, 10152c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 10162c7c4e3dSmrg (unsigned char *)pCard8Array, total); 10172c7c4e3dSmrg free(pCard8Array); 10182c7c4e3dSmrg break; 10192c7c4e3dSmrg case 16: 10202c7c4e3dSmrg total = 7 + /* visualID, type, and 3 lengths */ 10212c7c4e3dSmrg (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 10222c7c4e3dSmrg (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 10232c7c4e3dSmrg (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)); 10242c7c4e3dSmrg if ((pCard16 = pCard16Array = 10252c7c4e3dSmrg (unsigned short *) calloc (total, 10262c7c4e3dSmrg sizeof (unsigned short))) == NULL) { 10272c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 10282c7c4e3dSmrg return (0); 10292c7c4e3dSmrg } 10302c7c4e3dSmrg *pCard16++ = (pCorrection->visual_info.visualid >> 16) & 0xFFFF; 10312c7c4e3dSmrg *pCard16++ = (pCorrection->visual_info.visualid) & 0xFFFF; 10322c7c4e3dSmrg *pCard16++ = pCorrection->tableType; /* type = 0 */ 10332c7c4e3dSmrg *pCard16++ = 3; /* number of tables = 3 */ 10342c7c4e3dSmrg if (pCorrection->tableType == 0) { 10352c7c4e3dSmrg PutTableType0Card16(pCorrection->pRedTbl, &pCard16); 10362c7c4e3dSmrg PutTableType0Card16(pCorrection->pGreenTbl, &pCard16); 10372c7c4e3dSmrg PutTableType0Card16(pCorrection->pBlueTbl, &pCard16); 10382c7c4e3dSmrg } else { 10392c7c4e3dSmrg PutTableType1Card16(pCorrection->pRedTbl, &pCard16); 10402c7c4e3dSmrg PutTableType1Card16(pCorrection->pGreenTbl, &pCard16); 10412c7c4e3dSmrg PutTableType1Card16(pCorrection->pBlueTbl, &pCard16); 10422c7c4e3dSmrg } 10432c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16, 10442c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 10452c7c4e3dSmrg (unsigned char *)pCard16Array, total); 10462c7c4e3dSmrg free(pCard16Array); 10472c7c4e3dSmrg break; 10482c7c4e3dSmrg case 32: 10492c7c4e3dSmrg total = 6 + /* visualID, type, and 3 lengths */ 10502c7c4e3dSmrg (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 10512c7c4e3dSmrg (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) + 10522c7c4e3dSmrg (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)); 10532c7c4e3dSmrg if ((pCard32 = pCard32Array = 10542c7c4e3dSmrg (unsigned long *) calloc (total, 10552c7c4e3dSmrg sizeof (unsigned long))) == NULL) { 10562c7c4e3dSmrg fprintf(stderr,"Unable allocate array of ints\n"); 10572c7c4e3dSmrg return (0); 10582c7c4e3dSmrg } 10592c7c4e3dSmrg *pCard32++ = pCorrection->visual_info.visualid; 10602c7c4e3dSmrg *pCard32++ = pCorrection->tableType; /* type */ 10612c7c4e3dSmrg *pCard32++ = 3; /* number of tables = 3 */ 10622c7c4e3dSmrg if (pCorrection->tableType == 0) { 10632c7c4e3dSmrg PutTableType0Card32(pCorrection->pRedTbl, &pCard32); 10642c7c4e3dSmrg PutTableType0Card32(pCorrection->pGreenTbl, &pCard32); 10652c7c4e3dSmrg PutTableType0Card32(pCorrection->pBlueTbl, &pCard32); 10662c7c4e3dSmrg } else { 10672c7c4e3dSmrg PutTableType1Card32(pCorrection->pRedTbl, &pCard32); 10682c7c4e3dSmrg PutTableType1Card32(pCorrection->pGreenTbl, &pCard32); 10692c7c4e3dSmrg PutTableType1Card32(pCorrection->pBlueTbl, &pCard32); 10702c7c4e3dSmrg } 10712c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32, 10722c7c4e3dSmrg i ? PropModeAppend : PropModeReplace, 10732c7c4e3dSmrg (unsigned char *)pCard32Array, total); 10742c7c4e3dSmrg free(pCard32Array); 10752c7c4e3dSmrg break; 10762c7c4e3dSmrg default: 10772c7c4e3dSmrg if (pCorrection->visual_info.visualid) { 10782c7c4e3dSmrg fprintf(stderr,"RGB Correction for visualid %ld: Invalid property format\n", 10792c7c4e3dSmrg pCorrection->visual_info.visualid); 10802c7c4e3dSmrg } else { 10812c7c4e3dSmrg fprintf(stderr,"Global RGB Correction: Invalid property format\n"); 10822c7c4e3dSmrg } 10832c7c4e3dSmrg return (0); 10842c7c4e3dSmrg } 10852c7c4e3dSmrg } 10862c7c4e3dSmrg } 10872c7c4e3dSmrg 10882c7c4e3dSmrg return (1); 10892c7c4e3dSmrg} 10902c7c4e3dSmrg 10912c7c4e3dSmrg#ifdef GRAY 10922c7c4e3dSmrg 10932c7c4e3dSmrgstatic int 10942c7c4e3dSmrgLoadDataGray(Display *pDpy, window root, int tableType, 10952c7c4e3dSmrg LINEAR_RGB_SCCData *pScreenData, int targetFormat) 10962c7c4e3dSmrg{ 10972c7c4e3dSmrg unsigned char *ret_prop; 10982c7c4e3dSmrg int count; 10992c7c4e3dSmrg int nLevels; 11002c7c4e3dSmrg unsigned char *pCard8; 11012c7c4e3dSmrg unsigned char *pCard8Array = (unsigned char *)NULL; 11022c7c4e3dSmrg unsigned short *pCard16; 11032c7c4e3dSmrg unsigned short *pCard16Array = (unsigned short *)NULL; 11042c7c4e3dSmrg unsigned long *pCard32; 11052c7c4e3dSmrg unsigned long *pCard32Array = (unsigned long *)NULL; 11062c7c4e3dSmrg unsigned long Card32Array[18]; 11072c7c4e3dSmrg int ret_format; 11082c7c4e3dSmrg unsigned long ret_len, ret_after; 11092c7c4e3dSmrg Atom MatricesAtom, CorrectAtom, ret_atom; 11102c7c4e3dSmrg XcmsFloat *pValue; 11112c7c4e3dSmrg int total; 11122c7c4e3dSmrg 11132c7c4e3dSmrg /* Now store the XDCCC_SCREENWHITEPT */ 11142c7c4e3dSmrg pCard32 = Card32Array; 11152c7c4e3dSmrg pValue = (XcmsFloat *)pScreenData->XYZtoRGBmatrix; 11162c7c4e3dSmrg for (count = 0; count < 3; count++) { 11172c7c4e3dSmrg *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER); 11182c7c4e3dSmrg } 11192c7c4e3dSmrg MatricesAtom = XInternAtom (pDpy,XDCCC_SCREENWHITEPT_ATOM_NAME,False); 11202c7c4e3dSmrg XChangeProperty (pDpy, root, MatricesAtom, XA_INTEGER, 32, 11212c7c4e3dSmrg PropModeReplace, (unsigned char *)Card32Array, 3); 11222c7c4e3dSmrg 11232c7c4e3dSmrg /* Now store the XDCCC_GRAY_CORRECTION */ 11242c7c4e3dSmrg CorrectAtom = XInternAtom (pDpy, XDCCC_GRAY_CORRECT_ATOM_NAME, False); 11252c7c4e3dSmrg 11262c7c4e3dSmrg if (tableType == CORR_TYPE_NONE) { 11272c7c4e3dSmrg XGetWindowProperty (pDpy, root, CorrectAtom, 11282c7c4e3dSmrg 0, 5, False, XA_INTEGER, 11292c7c4e3dSmrg &ret_atom, &ret_format, &ret_len, &ret_after, 11302c7c4e3dSmrg &ret_prop); 11312c7c4e3dSmrg if (ret_format != 0) { 11322c7c4e3dSmrg XDeleteProperty (pDpy, root, CorrectAtom); 11332c7c4e3dSmrg XFree ((char *)ret_prop); 11342c7c4e3dSmrg } 11352c7c4e3dSmrg return (1); 11362c7c4e3dSmrg } 11372c7c4e3dSmrg nLevels = pScreenData->pRedTbl->nEntries; 11382c7c4e3dSmrg if (nLevels < 2) { 11392c7c4e3dSmrg fprintf(stderr,"Illegal number of entries in table\n"); 11402c7c4e3dSmrg return (0); 11412c7c4e3dSmrg } 11422c7c4e3dSmrg switch (targetFormat) { 11432c7c4e3dSmrg case 8: 11442c7c4e3dSmrg total = 6 /* visualID, type, length */ 11452c7c4e3dSmrg + (nLevels * (tableType == 0 ? 2 : 1)); 11462c7c4e3dSmrg if ((pCard8 = pCard8Array = (unsigned char *) 11472c7c4e3dSmrg calloc (total, sizeof (unsigned char))) == NULL) { 11482c7c4e3dSmrg fprintf(stderr,"Unable allocate array of Card8\n"); 11492c7c4e3dSmrg return (0); 11502c7c4e3dSmrg } 11512c7c4e3dSmrg *pCard8++ = 0; /* VisualID = 0 */ 11522c7c4e3dSmrg *pCard8++ = 0; /* VisualID = 0 */ 11532c7c4e3dSmrg *pCard8++ = 0; /* VisualID = 0 */ 11542c7c4e3dSmrg *pCard8++ = 0; /* VisualID = 0 */ 11552c7c4e3dSmrg *pCard8++ = tableType; /* type */ 11562c7c4e3dSmrg if (tableType == 0) { 11572c7c4e3dSmrg PutTableType0Card8(pScreenData->pRedTbl, &pCard8); 11582c7c4e3dSmrg } else { /* tableType == 1 */ 11592c7c4e3dSmrg PutTableType1Card8(pScreenData->pRedTbl, &pCard8); 11602c7c4e3dSmrg } 11612c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8, 11622c7c4e3dSmrg PropModeReplace, (unsigned char *)pCard8Array, 11632c7c4e3dSmrg total); 11642c7c4e3dSmrg free (pCard8Array); 11652c7c4e3dSmrg break; 11662c7c4e3dSmrg case 16: 11672c7c4e3dSmrg total = 4 /* visualID, type, length */ 11682c7c4e3dSmrg + (nLevels * (tableType == 0 ? 2 : 1)); 11692c7c4e3dSmrg if ((pCard16 = pCard16Array = (unsigned short *) 11702c7c4e3dSmrg calloc (total, sizeof (unsigned short))) == NULL) { 11712c7c4e3dSmrg fprintf(stderr,"Unable allocate array of Card16\n"); 11722c7c4e3dSmrg return (0); 11732c7c4e3dSmrg } 11742c7c4e3dSmrg *pCard16++ = 0; /* VisualID = 0 */ 11752c7c4e3dSmrg *pCard16++ = 0; /* VisualID = 0 */ 11762c7c4e3dSmrg *pCard16++ = tableType; /* type */ 11772c7c4e3dSmrg if (tableType == 0) { 11782c7c4e3dSmrg PutTableType0Card16(pScreenData->pRedTbl, &pCard16); 11792c7c4e3dSmrg } else { /* tableType == 1 */ 11802c7c4e3dSmrg PutTableType1Card16(pScreenData->pRedTbl, &pCard16); 11812c7c4e3dSmrg } 11822c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16, 11832c7c4e3dSmrg PropModeReplace, (unsigned char *)pCard16Array, 11842c7c4e3dSmrg total); 11852c7c4e3dSmrg free (pCard16Array); 11862c7c4e3dSmrg break; 11872c7c4e3dSmrg case 32: 11882c7c4e3dSmrg total = 3 /* visualID, type, length */ 11892c7c4e3dSmrg + (nLevels * (tableType == 0 ? 2 : 1)); 11902c7c4e3dSmrg if ((pCard32 = pCard32Array = (unsigned long *) 11912c7c4e3dSmrg calloc (total, sizeof (unsigned long))) == NULL) { 11922c7c4e3dSmrg fprintf(stderr,"Unable allocate array of Card32\n"); 11932c7c4e3dSmrg return (0); 11942c7c4e3dSmrg } 11952c7c4e3dSmrg *pCard32++ = 0; /* VisualID = 0 */ 11962c7c4e3dSmrg *pCard32++ = tableType; /* type */ 11972c7c4e3dSmrg if (tableType == 0) { 11982c7c4e3dSmrg PutTableType0Card32(pScreenData->pRedTbl, &pCard32); 11992c7c4e3dSmrg } else { /* tableType == 1 */ 12002c7c4e3dSmrg PutTableType1Card32(pScreenData->pRedTbl, &pCard32); 12012c7c4e3dSmrg } 12022c7c4e3dSmrg XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32, 12032c7c4e3dSmrg PropModeReplace, (unsigned char *)pCard32Array, 12042c7c4e3dSmrg total); 12052c7c4e3dSmrg free (pCard32Array); 12062c7c4e3dSmrg break; 12072c7c4e3dSmrg default: 12082c7c4e3dSmrg fprintf(stderr,"Invalid property format\n"); 12092c7c4e3dSmrg return (0); 12102c7c4e3dSmrg } 12112c7c4e3dSmrg return (1); 12122c7c4e3dSmrg} 12132c7c4e3dSmrg#endif /* GRAY */ 12142c7c4e3dSmrg 12152c7c4e3dSmrg 12162c7c4e3dSmrgstatic void 12172c7c4e3dSmrgPrintVisualOptions(XDCCC_Correction *pCorrection) 12182c7c4e3dSmrg{ 12192c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualIDMask) { 12202c7c4e3dSmrg fprintf(stderr, "\t%s:0x%lx\n", 12212c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_VISUALID), 12222c7c4e3dSmrg (unsigned long)pCorrection->visual_info.visualid); 12232c7c4e3dSmrg } 12242c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualDepthMask) { 12252c7c4e3dSmrg fprintf(stderr, "\t%s:%d\n", 12262c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_DEPTH), 12272c7c4e3dSmrg pCorrection->visual_info.depth); 12282c7c4e3dSmrg } 12292c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualClassMask) { 12302c7c4e3dSmrg fprintf(stderr, "\t%s:%s\n", 12312c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_CLASS), 12322c7c4e3dSmrg DefineToStr(VisualClassTbl, pCorrection->visual_info.class)); 12332c7c4e3dSmrg } 12342c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualRedMaskMask) { 12352c7c4e3dSmrg fprintf(stderr, "\t%s:0x%lx\n", 12362c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_RED_MASK), 12372c7c4e3dSmrg pCorrection->visual_info.red_mask); 12382c7c4e3dSmrg } 12392c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualGreenMaskMask) { 12402c7c4e3dSmrg fprintf(stderr, "\t%s:0x%lx\n", 12412c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_GREEN_MASK), 12422c7c4e3dSmrg pCorrection->visual_info.green_mask); 12432c7c4e3dSmrg } 12442c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualBlueMaskMask) { 12452c7c4e3dSmrg fprintf(stderr, "\t%s:0x%lx\n", 12462c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_BLUE_MASK), 12472c7c4e3dSmrg pCorrection->visual_info.blue_mask); 12482c7c4e3dSmrg } 12492c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualColormapSizeMask) { 12502c7c4e3dSmrg fprintf(stderr, "\t%s:0x%x\n", 12512c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_COLORMAP_SIZE), 12522c7c4e3dSmrg pCorrection->visual_info.colormap_size); 12532c7c4e3dSmrg } 12542c7c4e3dSmrg if (pCorrection->visual_info_mask & VisualBitsPerRGBMask) { 12552c7c4e3dSmrg fprintf(stderr, "\t%s:%d\n", 12562c7c4e3dSmrg DefineToStr(VisualOptKeyTbl, KEY_BITS_PER_RGB), 12572c7c4e3dSmrg pCorrection->visual_info.bits_per_rgb); 12582c7c4e3dSmrg } 12592c7c4e3dSmrg} 12602c7c4e3dSmrg 12612c7c4e3dSmrg 12622c7c4e3dSmrgstatic int 12632c7c4e3dSmrgParseVisualOptions(Display *pDpy, XDCCC_Correction *pCorrection, char *pbuf) 12642c7c4e3dSmrg{ 12652c7c4e3dSmrg char *key; 12662c7c4e3dSmrg char *value; 12672c7c4e3dSmrg XVisualInfo *vinfo; 12682c7c4e3dSmrg int n_matches; 12692c7c4e3dSmrg char delims[8]; 12702c7c4e3dSmrg 12712c7c4e3dSmrg strcpy(delims, DATA_DELIMS); 12722c7c4e3dSmrg strcat(delims, ":"); 12732c7c4e3dSmrg pCorrection->visual_info_mask = VisualNoMask; 12742c7c4e3dSmrg key = strtok(pbuf, delims); 12752c7c4e3dSmrg do { 12762c7c4e3dSmrg long tmp; 12772c7c4e3dSmrg value = strtok((char*)NULL, delims); 12782c7c4e3dSmrg if ((key == (char*)NULL) || (value == (char*)NULL)) { 12792c7c4e3dSmrg return (0); 12802c7c4e3dSmrg } 12812c7c4e3dSmrg switch (StrToDefine(VisualOptKeyTbl, key)) { 12822c7c4e3dSmrg case KEY_VISUALID: 12832c7c4e3dSmrg if (sscanf(value, "%li", &tmp) != 1) { 12842c7c4e3dSmrg fprintf(stderr, 12852c7c4e3dSmrg "Line %d: invalid VisualID specified, %s\n", 12862c7c4e3dSmrg linenum, value); 12872c7c4e3dSmrg return (0); 12882c7c4e3dSmrg } else 12892c7c4e3dSmrg pCorrection->visual_info.visualid = tmp; 12902c7c4e3dSmrg pCorrection->visual_info_mask |= VisualIDMask; 12912c7c4e3dSmrg break; 12922c7c4e3dSmrg case KEY_DEPTH: 12932c7c4e3dSmrg if (sscanf(value, "%i", &pCorrection->visual_info.depth) != 1) { 12942c7c4e3dSmrg fprintf(stderr, 12952c7c4e3dSmrg "Line %d: invalid depth specified, %s\n", 12962c7c4e3dSmrg linenum, value); 12972c7c4e3dSmrg return (0); 12982c7c4e3dSmrg } 12992c7c4e3dSmrg pCorrection->visual_info_mask |= VisualDepthMask; 13002c7c4e3dSmrg break; 13012c7c4e3dSmrg case KEY_CLASS: 13022c7c4e3dSmrg switch (pCorrection->visual_info.class = 13032c7c4e3dSmrg StrToDefine(VisualClassTbl, value)) { 13042c7c4e3dSmrg case StaticColor: 13052c7c4e3dSmrg break; 13062c7c4e3dSmrg case PseudoColor: 13072c7c4e3dSmrg break; 13082c7c4e3dSmrg case TrueColor: 13092c7c4e3dSmrg break; 13102c7c4e3dSmrg case DirectColor: 13112c7c4e3dSmrg break; 13122c7c4e3dSmrg case StaticGray: 13132c7c4e3dSmrg /* invalid, fall through */ 13142c7c4e3dSmrg case GrayScale: 13152c7c4e3dSmrg /* invalid, fall through */ 13162c7c4e3dSmrg default: 13172c7c4e3dSmrg fprintf(stderr, 13182c7c4e3dSmrg "Line %d: invalid Visual Class -- %s\n", 13192c7c4e3dSmrg linenum, value); 13202c7c4e3dSmrg return (0); 13212c7c4e3dSmrg } 13222c7c4e3dSmrg pCorrection->visual_info_mask |= VisualClassMask; 13232c7c4e3dSmrg break; 13242c7c4e3dSmrg case KEY_RED_MASK: 13252c7c4e3dSmrg if (sscanf(value, "%li", &tmp) != 1) { 13262c7c4e3dSmrg fprintf(stderr, 13272c7c4e3dSmrg "Line %d: invalid red_mask specified -- %s\n", 13282c7c4e3dSmrg linenum, value); 13292c7c4e3dSmrg return (0); 13302c7c4e3dSmrg } else 13312c7c4e3dSmrg pCorrection->visual_info.red_mask = tmp; 13322c7c4e3dSmrg pCorrection->visual_info_mask |= VisualRedMaskMask; 13332c7c4e3dSmrg break; 13342c7c4e3dSmrg case KEY_GREEN_MASK: 13352c7c4e3dSmrg if (sscanf(value, "%li", &tmp) != 1) { 13362c7c4e3dSmrg fprintf(stderr, 13372c7c4e3dSmrg "Line %d: invalid green_mask specified -- %s\n", 13382c7c4e3dSmrg linenum, value); 13392c7c4e3dSmrg return (0); 13402c7c4e3dSmrg } else 13412c7c4e3dSmrg pCorrection->visual_info.green_mask = tmp; 13422c7c4e3dSmrg pCorrection->visual_info_mask |= VisualGreenMaskMask; 13432c7c4e3dSmrg break; 13442c7c4e3dSmrg case KEY_BLUE_MASK: 13452c7c4e3dSmrg if (sscanf(value, "%li", &tmp) != 1) { 13462c7c4e3dSmrg fprintf(stderr, 13472c7c4e3dSmrg "Line %d: invalid blue_mask specified -- %s\n", 13482c7c4e3dSmrg linenum, value); 13492c7c4e3dSmrg return (0); 13502c7c4e3dSmrg } else 13512c7c4e3dSmrg pCorrection->visual_info.blue_mask = tmp; 13522c7c4e3dSmrg pCorrection->visual_info_mask |= VisualBlueMaskMask; 13532c7c4e3dSmrg break; 13542c7c4e3dSmrg case KEY_COLORMAP_SIZE: 13552c7c4e3dSmrg if (sscanf(value, "%i", &pCorrection->visual_info.colormap_size) != 1) { 13562c7c4e3dSmrg fprintf(stderr, 13572c7c4e3dSmrg "Line %d: invalid colormap_size specified -- %s\n", 13582c7c4e3dSmrg linenum, value); 13592c7c4e3dSmrg return (0); 13602c7c4e3dSmrg } 13612c7c4e3dSmrg pCorrection->visual_info_mask |= VisualColormapSizeMask; 13622c7c4e3dSmrg break; 13632c7c4e3dSmrg case KEY_BITS_PER_RGB: 13642c7c4e3dSmrg if (sscanf(value, "%i", &pCorrection->visual_info.bits_per_rgb) != 1) { 13652c7c4e3dSmrg fprintf(stderr, 13662c7c4e3dSmrg "Line %d: invalid bits_per_rgb specified -- %s\n", 13672c7c4e3dSmrg linenum, value); 13682c7c4e3dSmrg return (0); 13692c7c4e3dSmrg } 13702c7c4e3dSmrg pCorrection->visual_info_mask |= VisualBitsPerRGBMask; 13712c7c4e3dSmrg break; 13722c7c4e3dSmrg default: 13732c7c4e3dSmrg fprintf(stderr, 13742c7c4e3dSmrg "Line %d: invalid keyword %s\n", linenum, key); 13752c7c4e3dSmrg return (0); 13762c7c4e3dSmrg } 13772c7c4e3dSmrg key = strtok((char*)NULL, delims); 13782c7c4e3dSmrg } while (key != (char *)NULL); 13792c7c4e3dSmrg 13802c7c4e3dSmrg vinfo = XGetVisualInfo(pDpy, 13812c7c4e3dSmrg pCorrection->visual_info_mask, 13822c7c4e3dSmrg &pCorrection->visual_info, 13832c7c4e3dSmrg &n_matches); 13842c7c4e3dSmrg 13852c7c4e3dSmrg if (!n_matches) { 13862c7c4e3dSmrg fprintf(stderr, "Line %d: Cannot find visual matching ...\n", linenum); 13872c7c4e3dSmrg PrintVisualOptions(pCorrection); 13882c7c4e3dSmrg fprintf(stderr, "\n"); 13892c7c4e3dSmrg return(0); 13902c7c4e3dSmrg } 13912c7c4e3dSmrg if (n_matches > 1) { 13922c7c4e3dSmrg fprintf(stderr, "Line %d: Found more than one visual matching ...\n", linenum); 13932c7c4e3dSmrg PrintVisualOptions(pCorrection); 13942c7c4e3dSmrg fprintf(stderr, " Using VisualId 0x%lx\n", (unsigned long)vinfo->visualid); 13952c7c4e3dSmrg } 13962c7c4e3dSmrg memcpy((char*)&pCorrection->visual_info, (char*)vinfo, 13972c7c4e3dSmrg sizeof(XVisualInfo)); 13982c7c4e3dSmrg return (1); 13992c7c4e3dSmrg} 14002c7c4e3dSmrg 14012c7c4e3dSmrg 14022c7c4e3dSmrg/************************************************************************ 14032c7c4e3dSmrg * * 14042c7c4e3dSmrg * PUBLIC ROUTINES * 14052c7c4e3dSmrg * * 14062c7c4e3dSmrg ************************************************************************/ 14072c7c4e3dSmrg 14082c7c4e3dSmrg/* 14092c7c4e3dSmrg * NAME 14102c7c4e3dSmrg * LoadSCCData - Read and store the screen data 14112c7c4e3dSmrg * 14122c7c4e3dSmrg * SYNOPSIS 14132c7c4e3dSmrg */ 14142c7c4e3dSmrgint 14152c7c4e3dSmrgLoadSCCData(Display *pDpy, int screenNumber, char *filename, int targetFormat) 14162c7c4e3dSmrg 14172c7c4e3dSmrg/* 14182c7c4e3dSmrg * DESCRIPTION 14192c7c4e3dSmrg * Using the X Device Color Characterization Convention (XDCCC) 14202c7c4e3dSmrg * read the screen data and store it on the root window of the 14212c7c4e3dSmrg * screen. 14222c7c4e3dSmrg * 14232c7c4e3dSmrg * RETURNS 14242c7c4e3dSmrg * Returns 0 if failed; otherwise 1. 14252c7c4e3dSmrg * 14262c7c4e3dSmrg */ 14272c7c4e3dSmrg{ 14282c7c4e3dSmrg FILE *stream; 14292c7c4e3dSmrg char *pStr; 14302c7c4e3dSmrg char buf[BUFSIZ]; 14312c7c4e3dSmrg char *keyword, *token1, *token2, *token3; 14322c7c4e3dSmrg int state = 0; 14332c7c4e3dSmrg int VisualFlag = -2; 14342c7c4e3dSmrg Window root; 14352c7c4e3dSmrg XDCCC_Matrix matrix; 14362c7c4e3dSmrg XDCCC_Correction* CorrectionTail = (XDCCC_Correction*)NULL; 14372c7c4e3dSmrg XDCCC_Correction* CorrectionHead = (XDCCC_Correction*)NULL; 14382c7c4e3dSmrg XDCCC_Correction* pCurrent; 14392c7c4e3dSmrg 14402c7c4e3dSmrg if (screenNumber < 0) { 14412c7c4e3dSmrg fprintf(stderr,"Invalid Screen Number %d\n", screenNumber); 14422c7c4e3dSmrg return(0); 14432c7c4e3dSmrg } 14442c7c4e3dSmrg root = RootWindow(pDpy, screenNumber); 14452c7c4e3dSmrg 14462c7c4e3dSmrg if (!root) { 14472c7c4e3dSmrg /* if no root window is available then return an error */ 14482c7c4e3dSmrg fprintf(stderr,"Could not open root window supplied.\n "); 14492c7c4e3dSmrg return (0); 14502c7c4e3dSmrg } 14512c7c4e3dSmrg /* 14522c7c4e3dSmrg * Open the file, determine its size, then read it into memory. 14532c7c4e3dSmrg */ 14542c7c4e3dSmrg if (filename == NULL) { 14552c7c4e3dSmrg stream = stdin; 14562c7c4e3dSmrg filename = "stdin"; 14572c7c4e3dSmrg } else if ((stream = fopen(filename, "r")) == NULL) { 14582c7c4e3dSmrg fprintf(stderr,"Could not open file %s.\n", filename); 14592c7c4e3dSmrg return (0); 14602c7c4e3dSmrg } 14612c7c4e3dSmrg 14622c7c4e3dSmrg /* 14632c7c4e3dSmrg * Advance to starting keyword 14642c7c4e3dSmrg * Anything before this keyword is just treated as comments. 14652c7c4e3dSmrg */ 14662c7c4e3dSmrg 14672c7c4e3dSmrg while((pStr = nextline(buf, BUFSIZ, stream)) != NULL) { 14682c7c4e3dSmrg keyword = strtok(buf, DATA_DELIMS); 14692c7c4e3dSmrg if (keyword != (char *)NULL && 14702c7c4e3dSmrg (strcmp(keyword, SC_BEGIN_KEYWORD) == 0)) { 14712c7c4e3dSmrg break; 14722c7c4e3dSmrg } /* else ignore the line */ 14732c7c4e3dSmrg } 14742c7c4e3dSmrg 14752c7c4e3dSmrg if (pStr == NULL) { 14762c7c4e3dSmrg fprintf(stderr,"File %s is missing %s\n", filename, SC_BEGIN_KEYWORD); 14772c7c4e3dSmrg closeS (stream, CorrectionHead); 14782c7c4e3dSmrg return (0); 14792c7c4e3dSmrg } 14802c7c4e3dSmrg 14812c7c4e3dSmrg token1 = strtok((char*)NULL, DATA_DELIMS); 14822c7c4e3dSmrg if ((strcmp(token1, TXT_FORMAT_VERSION) != 0) && 14832c7c4e3dSmrg (strcmp(token1, "0.3") != 0)) { 14842c7c4e3dSmrg fprintf(stderr, 14852c7c4e3dSmrg "Screen data format version mismatch in file %s-- expected %s, found %s\n", 14862c7c4e3dSmrg filename, TXT_FORMAT_VERSION, token1); 14872c7c4e3dSmrg closeS (stream, CorrectionHead); 14882c7c4e3dSmrg return (0); 14892c7c4e3dSmrg } 14902c7c4e3dSmrg 14912c7c4e3dSmrg while ((pStr = nextline(buf, BUFSIZ, stream)) != NULL) { 14922c7c4e3dSmrg token1 = token2 = token3 = (char*)NULL; 14932c7c4e3dSmrg keyword = strtok(buf, DATA_DELIMS); 14942c7c4e3dSmrg if (keyword != (char*)NULL) { 14952c7c4e3dSmrg switch (SCKeyOf(keyword)) { 14962c7c4e3dSmrg case COMMENT : 14972c7c4e3dSmrg case NAME : 14982c7c4e3dSmrg case PART_NUMBER : 14992c7c4e3dSmrg case MODEL : 15002c7c4e3dSmrg case SERIAL_NUMBER : 15012c7c4e3dSmrg case REVISION : 15022c7c4e3dSmrg /* Do nothing */ 15032c7c4e3dSmrg break; 15042c7c4e3dSmrg case SCREEN_CLASS : 15052c7c4e3dSmrg token1 = strtok((char*)NULL, DATA_DELIMS); 15062c7c4e3dSmrg token2 = strtok((char*)NULL, DATA_DELIMS); 15072c7c4e3dSmrg if ((token1 == (char*)NULL) 15082c7c4e3dSmrg || ((VisualFlag = SCScrnClassOf(token1)) == -1)) { 15092c7c4e3dSmrg closeS (stream, CorrectionHead); 15102c7c4e3dSmrg return (0); 15112c7c4e3dSmrg } 15122c7c4e3dSmrg /*include code to handle screen number input*/ 15132c7c4e3dSmrg if (token2 != (char*)NULL) { 15142c7c4e3dSmrg screenNumber = atoi(token2); 15152c7c4e3dSmrg 15162c7c4e3dSmrg if (screenNumber < 0) { 15172c7c4e3dSmrg fprintf(stderr,"Invalid Screen Number %d\n", 15182c7c4e3dSmrg screenNumber); 15192c7c4e3dSmrg } 15202c7c4e3dSmrg else { 15212c7c4e3dSmrg root = RootWindow(pDpy, screenNumber); 15222c7c4e3dSmrg if (!root) { 15232c7c4e3dSmrg /* if no root window is available then return an error */ 15242c7c4e3dSmrg fprintf(stderr, 15252c7c4e3dSmrg "Could not open root window supplied.\n "); 15262c7c4e3dSmrg return (0); 15272c7c4e3dSmrg } 15282c7c4e3dSmrg } 15292c7c4e3dSmrg } 15302c7c4e3dSmrg break; 15312c7c4e3dSmrg case COLORIMETRIC_BEGIN : 15322c7c4e3dSmrg if (VisualFlag == -2) { 15332c7c4e3dSmrg closeS (stream, CorrectionHead); 15342c7c4e3dSmrg return (0); 15352c7c4e3dSmrg } 15362c7c4e3dSmrg if (!ProcessColorimetric(stream, 15372c7c4e3dSmrg &matrix, VisualFlag)) { 15382c7c4e3dSmrg closeS (stream, CorrectionHead); 15392c7c4e3dSmrg return (0); 15402c7c4e3dSmrg } 15412c7c4e3dSmrg state |= 0x02; 15422c7c4e3dSmrg break; 15432c7c4e3dSmrg case IPROFILE_BEGIN : 15442c7c4e3dSmrg if (VisualFlag == -2) { 15452c7c4e3dSmrg closeS (stream, CorrectionHead); 15462c7c4e3dSmrg return (0); 15472c7c4e3dSmrg } 15482c7c4e3dSmrg token1 = strtok((char*)NULL, DATA_DELIMS); 15492c7c4e3dSmrg token2 = strtok((char*)NULL, DATA_DELIMS); 15502c7c4e3dSmrg if ((token1 == (char*)NULL) || (token2 == (char*)NULL)) { 15512c7c4e3dSmrg fprintf(stderr, 15522c7c4e3dSmrg "Line %d: Intensity profile missing TableType and/or nTables.", 15532c7c4e3dSmrg linenum); 15542c7c4e3dSmrg closeS (stream, CorrectionHead); 15552c7c4e3dSmrg return (0); 15562c7c4e3dSmrg } 15572c7c4e3dSmrg 15582c7c4e3dSmrg if ((pCurrent = (XDCCC_Correction *) 15592c7c4e3dSmrg calloc(1, sizeof(XDCCC_Correction))) ==NULL) { 15602c7c4e3dSmrg fprintf(stderr, 15612c7c4e3dSmrg "Line %d: Could not allocate memory for intensity profile.", 15622c7c4e3dSmrg linenum); 15632c7c4e3dSmrg closeS (stream, CorrectionHead); 15642c7c4e3dSmrg return (0); 15652c7c4e3dSmrg } 15662c7c4e3dSmrg 15672c7c4e3dSmrg if (sscanf(token1, "%d", &pCurrent->tableType) != 1 || 15682c7c4e3dSmrg (pCurrent->tableType < 0 || pCurrent->tableType > 1)) { 15692c7c4e3dSmrg fprintf(stderr, 15702c7c4e3dSmrg "Line %d: invalid table type specified -- %s\n", 15712c7c4e3dSmrg linenum, buf); 15722c7c4e3dSmrg closeS (stream, CorrectionHead); 15732c7c4e3dSmrg return (0); 15742c7c4e3dSmrg } 15752c7c4e3dSmrg 15762c7c4e3dSmrg if ((VisualFlag == VIDEO_RGB) && (token2 == (char *)NULL)) { 15772c7c4e3dSmrg fprintf(stderr, 15782c7c4e3dSmrg "Line %d: invalid number of tables specified -- %s\n", 15792c7c4e3dSmrg linenum, buf); 15802c7c4e3dSmrg closeS (stream, CorrectionHead); 15812c7c4e3dSmrg return (0); 15822c7c4e3dSmrg } 15832c7c4e3dSmrg 15842c7c4e3dSmrg if (VisualFlag == VIDEO_RGB) { 15852c7c4e3dSmrg if (sscanf(token2, "%d", &pCurrent->nTables) != 1 || 15862c7c4e3dSmrg (pCurrent->nTables != 0 && pCurrent->nTables != 1 15872c7c4e3dSmrg && pCurrent->nTables != 3)) { 15882c7c4e3dSmrg fprintf(stderr, 15892c7c4e3dSmrg "Line %d: invalid number of tables (must be 0, 1, or 3)\n", 15902c7c4e3dSmrg linenum); 15912c7c4e3dSmrg closeS (stream, CorrectionHead); 15922c7c4e3dSmrg return (0); 15932c7c4e3dSmrg } 15942c7c4e3dSmrg } else { 15952c7c4e3dSmrg pCurrent->nTables = 0; 15962c7c4e3dSmrg } 15972c7c4e3dSmrg 15982c7c4e3dSmrg token3 = strtok((char*)NULL, "\n"); 15992c7c4e3dSmrg if (token3 != (char*)NULL) { 16002c7c4e3dSmrg if (!ParseVisualOptions(pDpy, pCurrent, token3)) { 16012c7c4e3dSmrg goto ByPassThisIProfile; 16022c7c4e3dSmrg } 16032c7c4e3dSmrg } 16042c7c4e3dSmrg 16052c7c4e3dSmrg switch (pCurrent->nTables) { 16062c7c4e3dSmrg case 3 : 16072c7c4e3dSmrg if (!(pCurrent->pRedTbl = (IntensityTbl *) 16082c7c4e3dSmrg calloc (1, sizeof (IntensityTbl)))) { 16092c7c4e3dSmrg fprintf(stderr, 16102c7c4e3dSmrg "Line %d: Could not allocate Red Intensity Table\n", 16112c7c4e3dSmrg linenum); 16122c7c4e3dSmrg closeS (stream, CorrectionHead); 16132c7c4e3dSmrg return (0); 16142c7c4e3dSmrg } 16152c7c4e3dSmrg if (!(pCurrent->pGreenTbl = (IntensityTbl *) 16162c7c4e3dSmrg calloc (1, sizeof (IntensityTbl)))) { 16172c7c4e3dSmrg fprintf(stderr, 16182c7c4e3dSmrg "Line %d: Could not allocate Green Intensity Table\n", 16192c7c4e3dSmrg linenum); 16202c7c4e3dSmrg closeS (stream, CorrectionHead); 16212c7c4e3dSmrg return (0); 16222c7c4e3dSmrg } 16232c7c4e3dSmrg if (!(pCurrent->pBlueTbl = (IntensityTbl *) 16242c7c4e3dSmrg calloc (1, sizeof (IntensityTbl)))) { 16252c7c4e3dSmrg fprintf(stderr, 16262c7c4e3dSmrg "Line %d: Could not allocate Blue Intensity Table", 16272c7c4e3dSmrg linenum); 16282c7c4e3dSmrg closeS (stream, CorrectionHead); 16292c7c4e3dSmrg return (0); 16302c7c4e3dSmrg } 16312c7c4e3dSmrg if (!ProcessIProfile(stream, pCurrent)) { 16322c7c4e3dSmrg goto ByPassThisIProfile; 16332c7c4e3dSmrg } 16342c7c4e3dSmrg break; 16352c7c4e3dSmrg case 1 : 16362c7c4e3dSmrg if (!(pCurrent->pRedTbl = (IntensityTbl *) 16372c7c4e3dSmrg calloc (1, sizeof (IntensityTbl)))) { 16382c7c4e3dSmrg fprintf(stderr, 16392c7c4e3dSmrg "Line %d: Could not allocate Red Intensity Table", 16402c7c4e3dSmrg linenum); 16412c7c4e3dSmrg closeS (stream, CorrectionHead); 16422c7c4e3dSmrg return (0); 16432c7c4e3dSmrg } 16442c7c4e3dSmrg pCurrent->pGreenTbl = pCurrent->pRedTbl; 16452c7c4e3dSmrg pCurrent->pBlueTbl = pCurrent->pRedTbl; 16462c7c4e3dSmrg if (!ProcessIProfile(stream, pCurrent)) { 16472c7c4e3dSmrg goto ByPassThisIProfile; 16482c7c4e3dSmrg } 16492c7c4e3dSmrg break; 16502c7c4e3dSmrg default : 16512c7c4e3dSmrg /* do nothing */ 16522c7c4e3dSmrg break; 16532c7c4e3dSmrg } 16542c7c4e3dSmrg 16552c7c4e3dSmrg if (CorrectionHead == NULL) { 16562c7c4e3dSmrg CorrectionHead = CorrectionTail = pCurrent; 16572c7c4e3dSmrg } else { 16582c7c4e3dSmrg CorrectionTail->next = pCurrent; 16592c7c4e3dSmrg CorrectionTail = pCurrent; 16602c7c4e3dSmrg } 16612c7c4e3dSmrg state |= 0x04; 16622c7c4e3dSmrg break; 16632c7c4e3dSmrgByPassThisIProfile: 16642c7c4e3dSmrg /* read till INTENSITY_PROFILE_END */ 16652c7c4e3dSmrg while ((pStr = nextline(buf, BUFSIZ, stream)) != NULL) { 16662c7c4e3dSmrg keyword = strtok(buf, DATA_DELIMS); 16672c7c4e3dSmrg if (keyword != (char*)NULL) { 16682c7c4e3dSmrg switch (SCKeyOf(keyword)) { 16692c7c4e3dSmrg case ITBL_BEGIN: 16702c7c4e3dSmrg case ITBL_END: 16712c7c4e3dSmrg case COMMENT: 16722c7c4e3dSmrg case DATA: 16732c7c4e3dSmrg break; 16742c7c4e3dSmrg case IPROFILE_END: 16752c7c4e3dSmrg goto IProfileProcessed; 16762c7c4e3dSmrg default: 16772c7c4e3dSmrg closeS (stream, CorrectionHead); 16782c7c4e3dSmrg return (0); 16792c7c4e3dSmrg } 16802c7c4e3dSmrg } 16812c7c4e3dSmrg } 16822c7c4e3dSmrg free(pCurrent); 16832c7c4e3dSmrgIProfileProcessed: 16842c7c4e3dSmrg state |= 0x04; 16852c7c4e3dSmrg break; 16862c7c4e3dSmrg case SC_END : 16872c7c4e3dSmrg if (!(state & 0x02)) { 16882c7c4e3dSmrg fprintf(stderr, 16892c7c4e3dSmrg "File %s is missing Colorimetric data.\n", 16902c7c4e3dSmrg filename); 16912c7c4e3dSmrg closeS (stream, CorrectionHead); 16922c7c4e3dSmrg return (0); 16932c7c4e3dSmrg } 16942c7c4e3dSmrg if (!(state & 0x04)) { 16952c7c4e3dSmrg fprintf(stderr, 16962c7c4e3dSmrg "File %s is missing Intensity Profile Data.\n", 16972c7c4e3dSmrg filename); 16982c7c4e3dSmrg } 16992c7c4e3dSmrg if (VisualFlag == VIDEO_RGB) { 17002c7c4e3dSmrg LoadMatrix(pDpy, root, &matrix); 17012c7c4e3dSmrg if (!LoadCorrections(pDpy, root, CorrectionHead, 17022c7c4e3dSmrg targetFormat)) { 17032c7c4e3dSmrg closeS (stream, CorrectionHead); 17042c7c4e3dSmrg return (0); 17052c7c4e3dSmrg } 17062c7c4e3dSmrg#ifdef GRAY 17072c7c4e3dSmrg } else if (VisualFlag == VIDEO_GRAY) { 17082c7c4e3dSmrg if (!LoadDataGray(pDpy, root, 17092c7c4e3dSmrg pCurrent->tableType, pScreenData, targetFormat)) { 17102c7c4e3dSmrg closeS (stream, CorrectionHead); 17112c7c4e3dSmrg return (0); 17122c7c4e3dSmrg } 17132c7c4e3dSmrg#endif /* GRAY */ 17142c7c4e3dSmrg } else { 17152c7c4e3dSmrg fprintf(stderr,"File %s Visual missing.", filename); 17162c7c4e3dSmrg } 17172c7c4e3dSmrg closeS (stream, CorrectionHead); 17182c7c4e3dSmrg return (1); 17192c7c4e3dSmrg/* NOTREACHED */ break; 17202c7c4e3dSmrg default : 17212c7c4e3dSmrg fprintf(stderr,"Line %d: extraneous keyword %s\n", 17222c7c4e3dSmrg linenum, keyword); 17232c7c4e3dSmrg closeS (stream, CorrectionHead); 17242c7c4e3dSmrg return (0); 17252c7c4e3dSmrg 17262c7c4e3dSmrg } 17272c7c4e3dSmrg } /* else it was just a blank line */ 17282c7c4e3dSmrg } 17292c7c4e3dSmrg closeS (stream, CorrectionHead); 17302c7c4e3dSmrg return (1); 17312c7c4e3dSmrg} 1732