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