summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SCCDFile.h142
-rw-r--r--datafiles/sample1.dcc843
-rw-r--r--datafiles/sample2.dcc843
-rw-r--r--loadData.c1787
-rw-r--r--xcmsdb.c888
-rw-r--r--xcmsdb.man93
6 files changed, 4596 insertions, 0 deletions
diff --git a/SCCDFile.h b/SCCDFile.h
new file mode 100644
index 0000000..a8aa87f
--- /dev/null
+++ b/SCCDFile.h
@@ -0,0 +1,142 @@
+/* $Xorg: SCCDFile.h,v 1.3 2000/08/17 19:54:13 cpqbld Exp $ */
+/*
+ * (c) Copyright 1990 Tektronix Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix be liable for any special, indirect or consequential damages or
+ * any damages whatsoever resulting from loss of use, data or profits,
+ * whether in an action of contract, negligence or other tortious action,
+ * arising out of or in connection with the use or performance of this
+ * software.
+ *
+ *
+ * NAME
+ * SCCDFile.h
+ *
+ * DESCRIPTION
+ * Include file for TekCMS Color Extension when using the
+ * X Device Color Characterization Convention (XDCCC).
+ *
+ */
+#ifndef SCCDFILE_H
+#define SCCDFILE_H
+
+#include <X11/Xutil.h>
+#include <X11/Xcms.h>
+
+/*
+ * DEFINES
+ */
+
+#define XDCCC_NUMBER 0x8000000L /* 2**27 per ICCCM */
+#define XDCCC_MATRIX_ATOM_NAME "XDCCC_LINEAR_RGB_MATRICES"
+#define XDCCC_CORRECT_ATOM_NAME "XDCCC_LINEAR_RGB_CORRECTION"
+#define READABLE_SD_SUFFIX ".txt"
+#define TXT_FORMAT_VERSION "1.1"
+
+#define DATA_DELIMS " \t\n" /* space, tab, newline */
+
+#define SC_BEGIN_KEYWORD "SCREENDATA_BEGIN"
+#define SC_END_KEYWORD "SCREENDATA_END"
+#define COMMENT_KEYWORD "COMMENT"
+#define NAME_KEYWORD "NAME"
+#define MODEL_KEYWORD "MODEL"
+#define PART_NUMBER_KEYWORD "PART_NUMBER"
+#define SERIAL_NUMBER_KEYWORD "SERIAL_NUMBER"
+#define REVISION_KEYWORD "REVISION"
+#define SCREEN_CLASS_KEYWORD "SCREEN_CLASS"
+#define COLORIMETRIC_BEGIN_KEYWORD "COLORIMETRIC_BEGIN"
+#define COLORIMETRIC_END_KEYWORD "COLORIMETRIC_END"
+#define XYZTORGBMAT_BEGIN_KEYWORD "XYZtoRGB_MATRIX_BEGIN"
+#define XYZTORGBMAT_END_KEYWORD "XYZtoRGB_MATRIX_END"
+#define RGBTOXYZMAT_BEGIN_KEYWORD "RGBtoXYZ_MATRIX_BEGIN"
+#define RGBTOXYZMAT_END_KEYWORD "RGBtoXYZ_MATRIX_END"
+#define IPROFILE_BEGIN_KEYWORD "INTENSITY_PROFILE_BEGIN"
+#define IPROFILE_END_KEYWORD "INTENSITY_PROFILE_END"
+#define ITBL_BEGIN_KEYWORD "INTENSITY_TBL_BEGIN"
+#define ITBL_END_KEYWORD "INTENSITY_TBL_END"
+
+#define WHITEPT_XYZ_BEGIN_KEYWORD "WHITEPT_XYZ_BEGIN"
+#define WHITEPT_XYZ_END_KEYWORD "WHITEPT_XYZ_END"
+
+#define VIDEO_RGB_KEYWORD "VIDEO_RGB"
+#ifdef GRAY
+#define VIDEO_GRAY_KEYWORD "VIDEO_GRAY"
+#endif
+
+#define DATA -1
+#define SC_BEGIN 1
+#define SC_END 2
+#define COMMENT 3
+#define NAME 4
+#define MODEL 5
+#define PART_NUMBER 6
+#define SERIAL_NUMBER 7
+#define REVISION 8
+#define SCREEN_CLASS 9
+#define COLORIMETRIC_BEGIN 10
+#define COLORIMETRIC_END 11
+#define XYZTORGBMAT_BEGIN 12
+#define XYZTORGBMAT_END 13
+#define RGBTOXYZMAT_BEGIN 14
+#define RGBTOXYZMAT_END 15
+#define IPROFILE_BEGIN 16
+#define IPROFILE_END 17
+#define ITBL_BEGIN 18
+#define ITBL_END 19
+#define WHITEPT_XYZ_BEGIN 20
+#define WHITEPT_XYZ_END 21
+
+#define CORR_TYPE_NONE -1
+#define CORR_TYPE_0 0
+#define CORR_TYPE_1 1
+
+#define VIDEO_RGB 0
+#ifdef GRAY
+#define VIDEO_GRAY 1
+#endif
+
+ /*
+ * Intensity Record (i.e., value / intensity tuple)
+ */
+typedef struct _IntensityRec {
+ unsigned short value;
+ XcmsFloat intensity;
+} IntensityRec;
+
+ /*
+ * Intensity Table
+ */
+typedef struct _IntensityTbl {
+ IntensityRec *pBase;
+ unsigned int nEntries;
+} IntensityTbl;
+
+typedef struct _XDCCC_Matrix {
+ XcmsFloat XYZtoRGBmatrix[3][3];
+ XcmsFloat RGBtoXYZmatrix[3][3];
+} XDCCC_Matrix;
+
+typedef struct _XDCCC_Correction {
+ XVisualInfo visual_info;
+ long visual_info_mask;
+ int tableType;
+ int nTables;
+ IntensityTbl* pRedTbl;
+ IntensityTbl* pGreenTbl;
+ IntensityTbl* pBlueTbl;
+ struct _XDCCC_Correction* next;
+} XDCCC_Correction;
+
+
+#endif /* SCCDFILE_H */
diff --git a/datafiles/sample1.dcc b/datafiles/sample1.dcc
new file mode 100644
index 0000000..d22b72b
--- /dev/null
+++ b/datafiles/sample1.dcc
@@ -0,0 +1,843 @@
+/*
+ * (c) Copyright 1990 1991 Tektronix Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix be liable for any special, indirect or consequential damages or
+ * any damages whatsoever resulting from loss of use, data or profits,
+ * whether in an action of contract, negligence or other tortious action,
+ * arising out of or in connection with the use or performance of this
+ * software.
+ *
+ *
+ * NAME
+ * sample1.dcc
+ *
+ * DESCRIPTION
+ * Sample Screen Color Characterization Data File
+ *
+ * IMPORTANT NOTICE
+ * This sample file is provided solely for the purpose of
+ * presenting the format of input files accepted by the
+ * 'cmsdb' utility -- a sample mechanism for placing Screen
+ * Color Characterization Data into root window properties
+ * in accordance with the X Device Color Characterization
+ * Convention (XDCCC). The data in this file is tailored
+ * specifically for the Tektronix monitor (part number
+ * 119-2451-00). These monitors have been built by the
+ * monitor vendor to Tektronix specifications that typically
+ * differ from monitors provided by the same vendor to other
+ * companies. Therefore, for accurate color rendition this
+ * sample file should only be used in conjunction with the
+ * specified Tektronix monitor. To be XCMS compatible,
+ * X workstation and X terminal vendors must provide screen
+ * characterization data for their own monitors.
+ */
+SCREENDATA_BEGIN 0.3
+
+ NAME Tektronix 19" (Sony) CRT
+ PART_NUMBER 119-2451-00
+ MODEL Tek4300, XD88
+ SCREEN_CLASS VIDEO_RGB
+ REVISION 1.0
+
+ COLORIMETRIC_BEGIN
+ XYZtoRGB_MATRIX_BEGIN
+ 3.48340481253539000 -1.52176374927285200 -0.55923133354049780
+ -1.07152751306193600 1.96593795204372400 0.03673691339553462
+ 0.06351179790497788 -0.20020501000496480 0.81070942031648220
+ XYZtoRGB_MATRIX_END
+ RGBtoXYZ_MATRIX_BEGIN
+ 0.38106149108714790 0.32025712365352110 0.24834578525933100
+ 0.20729745115140850 0.68054638776373240 0.11215616108485920
+ 0.02133944350088028 0.14297193020246480 1.24172892629665500
+ RGBtoXYZ_MATRIX_END
+ COLORIMETRIC_END
+
+ INTENSITY_PROFILE_BEGIN 0 3
+ INTENSITY_TBL_BEGIN RED 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000936
+ 0x0b0b 0.001023
+ 0x0c0c 0.001121
+ 0x0d0d 0.001229
+ 0x0e0e 0.001349
+ 0x0f0f 0.001481
+ 0x1010 0.001624
+ 0x1111 0.001781
+ 0x1212 0.001950
+ 0x1313 0.002133
+ 0x1414 0.002329
+ 0x1515 0.002539
+ 0x1616 0.002764
+ 0x1717 0.003003
+ 0x1818 0.003258
+ 0x1919 0.003529
+ 0x1a1a 0.003815
+ 0x1b1b 0.004118
+ 0x1c1c 0.004437
+ 0x1d1d 0.004773
+ 0x1e1e 0.005127
+ 0x1f1f 0.005498
+ 0x2020 0.005888
+ 0x2121 0.006296
+ 0x2222 0.006723
+ 0x2323 0.007169
+ 0x2424 0.007634
+ 0x2525 0.008120
+ 0x2626 0.008625
+ 0x2727 0.009152
+ 0x2828 0.009699
+ 0x2929 0.010267
+ 0x2a2a 0.010857
+ 0x2b2b 0.011468
+ 0x2c2c 0.012102
+ 0x2d2d 0.012759
+ 0x2e2e 0.013438
+ 0x2f2f 0.014141
+ 0x3030 0.014867
+ 0x3131 0.015617
+ 0x3232 0.016392
+ 0x3333 0.017190
+ 0x3434 0.018014
+ 0x3535 0.018863
+ 0x3636 0.019737
+ 0x3737 0.020637
+ 0x3838 0.021563
+ 0x3939 0.022515
+ 0x3a3a 0.023494
+ 0x3b3b 0.024500
+ 0x3c3c 0.025533
+ 0x3d3d 0.026594
+ 0x3e3e 0.027683
+ 0x3f3f 0.028800
+ 0x4040 0.029945
+ 0x4141 0.031119
+ 0x4242 0.032323
+ 0x4343 0.033555
+ 0x4444 0.034817
+ 0x4545 0.036109
+ 0x4646 0.037431
+ 0x4747 0.038784
+ 0x4848 0.040167
+ 0x4949 0.041582
+ 0x4a4a 0.043027
+ 0x4b4b 0.044504
+ 0x4c4c 0.046013
+ 0x4d4d 0.047554
+ 0x4e4e 0.049128
+ 0x4f4f 0.050734
+ 0x5050 0.052373
+ 0x5151 0.054045
+ 0x5252 0.055750
+ 0x5353 0.057489
+ 0x5454 0.059262
+ 0x5555 0.061069
+ 0x5656 0.062910
+ 0x5757 0.064786
+ 0x5858 0.066697
+ 0x5959 0.068643
+ 0x5a5a 0.070624
+ 0x5b5b 0.072641
+ 0x5c5c 0.074694
+ 0x5d5d 0.076783
+ 0x5e5e 0.078908
+ 0x5f5f 0.081070
+ 0x6060 0.083268
+ 0x6161 0.085503
+ 0x6262 0.087776
+ 0x6363 0.090086
+ 0x6464 0.092433
+ 0x6565 0.094819
+ 0x6666 0.097242
+ 0x6767 0.099704
+ 0x6868 0.102205
+ 0x6969 0.104744
+ 0x6a6a 0.107322
+ 0x6b6b 0.109939
+ 0x6c6c 0.112595
+ 0x6d6d 0.115291
+ 0x6e6e 0.118026
+ 0x6f6f 0.120802
+ 0x7070 0.123618
+ 0x7171 0.126474
+ 0x7272 0.129370
+ 0x7373 0.132307
+ 0x7474 0.135285
+ 0x7575 0.138305
+ 0x7676 0.141365
+ 0x7777 0.144467
+ 0x7878 0.147610
+ 0x7979 0.150795
+ 0x7a7a 0.154023
+ 0x7b7b 0.157292
+ 0x7c7c 0.160604
+ 0x7d7d 0.163958
+ 0x7e7e 0.167354
+ 0x7f7f 0.170794
+ 0x8080 0.174276
+ 0x8181 0.177802
+ 0x8282 0.181371
+ 0x8383 0.184983
+ 0x8484 0.188639
+ 0x8585 0.192339
+ 0x8686 0.196083
+ 0x8787 0.199871
+ 0x8888 0.203702
+ 0x8989 0.207579
+ 0x8a8a 0.211500
+ 0x8b8b 0.215465
+ 0x8c8c 0.219475
+ 0x8d8d 0.223530
+ 0x8e8e 0.227630
+ 0x8f8f 0.231776
+ 0x9090 0.235966
+ 0x9191 0.240202
+ 0x9292 0.244484
+ 0x9393 0.248811
+ 0x9494 0.253184
+ 0x9595 0.257604
+ 0x9696 0.262069
+ 0x9797 0.266580
+ 0x9898 0.271138
+ 0x9999 0.275742
+ 0x9a9a 0.280392
+ 0x9b9b 0.285089
+ 0x9c9c 0.289833
+ 0x9d9d 0.294624
+ 0x9e9e 0.299461
+ 0x9f9f 0.304346
+ 0xa0a0 0.309278
+ 0xa1a1 0.314257
+ 0xa2a2 0.319283
+ 0xa3a3 0.324357
+ 0xa4a4 0.329478
+ 0xa5a5 0.334647
+ 0xa6a6 0.339863
+ 0xa7a7 0.345128
+ 0xa8a8 0.350440
+ 0xa9a9 0.355800
+ 0xaaaa 0.361208
+ 0xabab 0.366664
+ 0xacac 0.372168
+ 0xadad 0.377721
+ 0xaeae 0.383322
+ 0xafaf 0.388971
+ 0xb0b0 0.394669
+ 0xb1b1 0.400415
+ 0xb2b2 0.406210
+ 0xb3b3 0.412053
+ 0xb4b4 0.417945
+ 0xb5b5 0.423886
+ 0xb6b6 0.429876
+ 0xb7b7 0.435914
+ 0xb8b8 0.442001
+ 0xb9b9 0.448138
+ 0xbaba 0.454323
+ 0xbbbb 0.460557
+ 0xbcbc 0.466841
+ 0xbdbd 0.473173
+ 0xbebe 0.479555
+ 0xbfbf 0.485986
+ 0xc0c0 0.492466
+ 0xc1c1 0.498995
+ 0xc2c2 0.505574
+ 0xc3c3 0.512202
+ 0xc4c4 0.518879
+ 0xc5c5 0.525606
+ 0xc6c6 0.532382
+ 0xc7c7 0.539207
+ 0xc8c8 0.546082
+ 0xc9c9 0.553006
+ 0xcaca 0.559980
+ 0xcbcb 0.567004
+ 0xcccc 0.574076
+ 0xcdcd 0.581199
+ 0xcece 0.588370
+ 0xcfcf 0.595592
+ 0xd0d0 0.602862
+ 0xd1d1 0.610183
+ 0xd2d2 0.617552
+ 0xd3d3 0.624972
+ 0xd4d4 0.632440
+ 0xd5d5 0.639959
+ 0xd6d6 0.647526
+ 0xd7d7 0.655144
+ 0xd8d8 0.662810
+ 0xd9d9 0.670526
+ 0xdada 0.678292
+ 0xdbdb 0.686106
+ 0xdcdc 0.693971
+ 0xdddd 0.701884
+ 0xdede 0.709847
+ 0xdfdf 0.717859
+ 0xe0e0 0.725921
+ 0xe1e1 0.734031
+ 0xe2e2 0.742191
+ 0xe3e3 0.750400
+ 0xe4e4 0.758658
+ 0xe5e5 0.766966
+ 0xe6e6 0.775322
+ 0xe7e7 0.783727
+ 0xe8e8 0.792181
+ 0xe9e9 0.800684
+ 0xeaea 0.809236
+ 0xebeb 0.817837
+ 0xecec 0.826486
+ 0xeded 0.835185
+ 0xeeee 0.843931
+ 0xefef 0.852727
+ 0xf0f0 0.861571
+ 0xf1f1 0.870463
+ 0xf2f2 0.879404
+ 0xf3f3 0.888393
+ 0xf4f4 0.897430
+ 0xf5f5 0.906515
+ 0xf6f6 0.915648
+ 0xf7f7 0.924830
+ 0xf8f8 0.934059
+ 0xf9f9 0.943337
+ 0xfafa 0.952662
+ 0xfbfb 0.962034
+ 0xfcfc 0.971454
+ 0xfdfd 0.980922
+ 0xfefe 0.990437
+ 0xffff 1.000000
+ INTENSITY_TBL_END
+ INTENSITY_TBL_BEGIN GREEN 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000000
+ 0x0b0b 0.000000
+ 0x0c0c 0.000000
+ 0x0d0d 0.000000
+ 0x0e0e 0.000000
+ 0x0f0f 0.000000
+ 0x1010 0.000000
+ 0x1111 0.000000
+ 0x1212 0.000000
+ 0x1313 0.000000
+ 0x1414 0.000832
+ 0x1515 0.001033
+ 0x1616 0.001249
+ 0x1717 0.001482
+ 0x1818 0.001731
+ 0x1919 0.001998
+ 0x1a1a 0.002283
+ 0x1b1b 0.002587
+ 0x1c1c 0.002909
+ 0x1d1d 0.003251
+ 0x1e1e 0.003612
+ 0x1f1f 0.003994
+ 0x2020 0.004397
+ 0x2121 0.004821
+ 0x2222 0.005267
+ 0x2323 0.005736
+ 0x2424 0.006227
+ 0x2525 0.006741
+ 0x2626 0.007279
+ 0x2727 0.007842
+ 0x2828 0.008428
+ 0x2929 0.009040
+ 0x2a2a 0.009677
+ 0x2b2b 0.010340
+ 0x2c2c 0.011029
+ 0x2d2d 0.011745
+ 0x2e2e 0.012489
+ 0x2f2f 0.013259
+ 0x3030 0.014058
+ 0x3131 0.014885
+ 0x3232 0.015740
+ 0x3333 0.016625
+ 0x3434 0.017539
+ 0x3535 0.018484
+ 0x3636 0.019458
+ 0x3737 0.020463
+ 0x3838 0.021499
+ 0x3939 0.022566
+ 0x3a3a 0.023665
+ 0x3b3b 0.024796
+ 0x3c3c 0.025960
+ 0x3d3d 0.027156
+ 0x3e3e 0.028385
+ 0x3f3f 0.029648
+ 0x4040 0.030945
+ 0x4141 0.032275
+ 0x4242 0.033640
+ 0x4343 0.035039
+ 0x4444 0.036474
+ 0x4545 0.037944
+ 0x4646 0.039449
+ 0x4747 0.040990
+ 0x4848 0.042567
+ 0x4949 0.044181
+ 0x4a4a 0.045832
+ 0x4b4b 0.047519
+ 0x4c4c 0.049244
+ 0x4d4d 0.051006
+ 0x4e4e 0.052806
+ 0x4f4f 0.054644
+ 0x5050 0.056520
+ 0x5151 0.058435
+ 0x5252 0.060389
+ 0x5353 0.062381
+ 0x5454 0.064413
+ 0x5555 0.066484
+ 0x5656 0.068595
+ 0x5757 0.070746
+ 0x5858 0.072936
+ 0x5959 0.075167
+ 0x5a5a 0.077439
+ 0x5b5b 0.079751
+ 0x5c5c 0.082104
+ 0x5d5d 0.084498
+ 0x5e5e 0.086933
+ 0x5f5f 0.089409
+ 0x6060 0.091927
+ 0x6161 0.094487
+ 0x6262 0.097089
+ 0x6363 0.099732
+ 0x6464 0.102418
+ 0x6565 0.105146
+ 0x6666 0.107917
+ 0x6767 0.110730
+ 0x6868 0.113586
+ 0x6969 0.116485
+ 0x6a6a 0.119427
+ 0x6b6b 0.122411
+ 0x6c6c 0.125439
+ 0x6d6d 0.128511
+ 0x6e6e 0.131625
+ 0x6f6f 0.134783
+ 0x7070 0.137985
+ 0x7171 0.141231
+ 0x7272 0.144520
+ 0x7373 0.147853
+ 0x7474 0.151229
+ 0x7575 0.154650
+ 0x7676 0.158115
+ 0x7777 0.161624
+ 0x7878 0.165176
+ 0x7979 0.168774
+ 0x7a7a 0.172415
+ 0x7b7b 0.176100
+ 0x7c7c 0.179830
+ 0x7d7d 0.183604
+ 0x7e7e 0.187423
+ 0x7f7f 0.191285
+ 0x8080 0.195192
+ 0x8181 0.199144
+ 0x8282 0.203140
+ 0x8383 0.207180
+ 0x8484 0.211264
+ 0x8585 0.215393
+ 0x8686 0.219566
+ 0x8787 0.223783
+ 0x8888 0.228045
+ 0x8989 0.232351
+ 0x8a8a 0.236701
+ 0x8b8b 0.241095
+ 0x8c8c 0.245533
+ 0x8d8d 0.250015
+ 0x8e8e 0.254542
+ 0x8f8f 0.259112
+ 0x9090 0.263726
+ 0x9191 0.268384
+ 0x9292 0.273085
+ 0x9393 0.277830
+ 0x9494 0.282619
+ 0x9595 0.287451
+ 0x9696 0.292327
+ 0x9797 0.297246
+ 0x9898 0.302207
+ 0x9999 0.307212
+ 0x9a9a 0.312260
+ 0x9b9b 0.317351
+ 0x9c9c 0.322484
+ 0x9d9d 0.327660
+ 0x9e9e 0.332878
+ 0x9f9f 0.338138
+ 0xa0a0 0.343441
+ 0xa1a1 0.348786
+ 0xa2a2 0.354172
+ 0xa3a3 0.359600
+ 0xa4a4 0.365069
+ 0xa5a5 0.370580
+ 0xa6a6 0.376132
+ 0xa7a7 0.381725
+ 0xa8a8 0.387359
+ 0xa9a9 0.393033
+ 0xaaaa 0.398747
+ 0xabab 0.404502
+ 0xacac 0.410297
+ 0xadad 0.416131
+ 0xaeae 0.422006
+ 0xafaf 0.427919
+ 0xb0b0 0.433871
+ 0xb1b1 0.439863
+ 0xb2b2 0.445893
+ 0xb3b3 0.451961
+ 0xb4b4 0.458068
+ 0xb5b5 0.464213
+ 0xb6b6 0.470395
+ 0xb7b7 0.476614
+ 0xb8b8 0.482871
+ 0xb9b9 0.489165
+ 0xbaba 0.495495
+ 0xbbbb 0.501862
+ 0xbcbc 0.508264
+ 0xbdbd 0.514703
+ 0xbebe 0.521176
+ 0xbfbf 0.527685
+ 0xc0c0 0.534229
+ 0xc1c1 0.540808
+ 0xc2c2 0.547420
+ 0xc3c3 0.554067
+ 0xc4c4 0.560747
+ 0xc5c5 0.567460
+ 0xc6c6 0.574207
+ 0xc7c7 0.580986
+ 0xc8c8 0.587797
+ 0xc9c9 0.594640
+ 0xcaca 0.601515
+ 0xcbcb 0.608420
+ 0xcccc 0.615357
+ 0xcdcd 0.622324
+ 0xcece 0.629322
+ 0xcfcf 0.636349
+ 0xd0d0 0.643405
+ 0xd1d1 0.650490
+ 0xd2d2 0.657604
+ 0xd3d3 0.664746
+ 0xd4d4 0.671916
+ 0xd5d5 0.679113
+ 0xd6d6 0.686337
+ 0xd7d7 0.693588
+ 0xd8d8 0.700865
+ 0xd9d9 0.708167
+ 0xdada 0.715495
+ 0xdbdb 0.722848
+ 0xdcdc 0.730225
+ 0xdddd 0.737626
+ 0xdede 0.745050
+ 0xdfdf 0.752497
+ 0xe0e0 0.759967
+ 0xe1e1 0.767459
+ 0xe2e2 0.774973
+ 0xe3e3 0.782508
+ 0xe4e4 0.790064
+ 0xe5e5 0.797640
+ 0xe6e6 0.805235
+ 0xe7e7 0.812850
+ 0xe8e8 0.820483
+ 0xe9e9 0.828135
+ 0xeaea 0.835805
+ 0xebeb 0.843491
+ 0xecec 0.851195
+ 0xeded 0.858914
+ 0xeeee 0.866649
+ 0xefef 0.874399
+ 0xf0f0 0.882164
+ 0xf1f1 0.889943
+ 0xf2f2 0.897735
+ 0xf3f3 0.905540
+ 0xf4f4 0.913357
+ 0xf5f5 0.921187
+ 0xf6f6 0.929027
+ 0xf7f7 0.936878
+ 0xf8f8 0.944739
+ 0xf9f9 0.952610
+ 0xfafa 0.960490
+ 0xfbfb 0.968377
+ 0xfcfc 0.976273
+ 0xfdfd 0.984176
+ 0xfefe 0.992085
+ 0xffff 1.000000
+ INTENSITY_TBL_END
+ INTENSITY_TBL_BEGIN BLUE 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000000
+ 0x0b0b 0.000000
+ 0x0c0c 0.000000
+ 0x0d0d 0.000000
+ 0x0e0e 0.000000
+ 0x0f0f 0.001341
+ 0x1010 0.001462
+ 0x1111 0.001596
+ 0x1212 0.001744
+ 0x1313 0.001905
+ 0x1414 0.002080
+ 0x1515 0.002270
+ 0x1616 0.002475
+ 0x1717 0.002696
+ 0x1818 0.002934
+ 0x1919 0.003188
+ 0x1a1a 0.003459
+ 0x1b1b 0.003749
+ 0x1c1c 0.004057
+ 0x1d1d 0.004383
+ 0x1e1e 0.004729
+ 0x1f1f 0.005095
+ 0x2020 0.005481
+ 0x2121 0.005888
+ 0x2222 0.006316
+ 0x2323 0.006766
+ 0x2424 0.007238
+ 0x2525 0.007733
+ 0x2626 0.008250
+ 0x2727 0.008792
+ 0x2828 0.009357
+ 0x2929 0.009947
+ 0x2a2a 0.010562
+ 0x2b2b 0.011202
+ 0x2c2c 0.011867
+ 0x2d2d 0.012559
+ 0x2e2e 0.013277
+ 0x2f2f 0.014023
+ 0x3030 0.014795
+ 0x3131 0.015596
+ 0x3232 0.016424
+ 0x3333 0.017282
+ 0x3434 0.018168
+ 0x3535 0.019083
+ 0x3636 0.020028
+ 0x3737 0.021004
+ 0x3838 0.022009
+ 0x3939 0.023046
+ 0x3a3a 0.024113
+ 0x3b3b 0.025213
+ 0x3c3c 0.026344
+ 0x3d3d 0.027507
+ 0x3e3e 0.028703
+ 0x3f3f 0.029932
+ 0x4040 0.031194
+ 0x4141 0.032489
+ 0x4242 0.033818
+ 0x4343 0.035182
+ 0x4444 0.036580
+ 0x4545 0.038013
+ 0x4646 0.039481
+ 0x4747 0.040984
+ 0x4848 0.042523
+ 0x4949 0.044098
+ 0x4a4a 0.045710
+ 0x4b4b 0.047357
+ 0x4c4c 0.049042
+ 0x4d4d 0.050764
+ 0x4e4e 0.052523
+ 0x4f4f 0.054319
+ 0x5050 0.056154
+ 0x5151 0.058027
+ 0x5252 0.059938
+ 0x5353 0.061887
+ 0x5454 0.063876
+ 0x5555 0.065903
+ 0x5656 0.067970
+ 0x5757 0.070076
+ 0x5858 0.072222
+ 0x5959 0.074408
+ 0x5a5a 0.076634
+ 0x5b5b 0.078900
+ 0x5c5c 0.081207
+ 0x5d5d 0.083555
+ 0x5e5e 0.085944
+ 0x5f5f 0.088373
+ 0x6060 0.090844
+ 0x6161 0.093357
+ 0x6262 0.095911
+ 0x6363 0.098507
+ 0x6464 0.101145
+ 0x6565 0.103825
+ 0x6666 0.106547
+ 0x6767 0.109311
+ 0x6868 0.112118
+ 0x6969 0.114968
+ 0x6a6a 0.117861
+ 0x6b6b 0.120797
+ 0x6c6c 0.123775
+ 0x6d6d 0.126797
+ 0x6e6e 0.129862
+ 0x6f6f 0.132971
+ 0x7070 0.136123
+ 0x7171 0.139318
+ 0x7272 0.142557
+ 0x7373 0.145841
+ 0x7474 0.149167
+ 0x7575 0.152538
+ 0x7676 0.155953
+ 0x7777 0.159412
+ 0x7878 0.162915
+ 0x7979 0.166463
+ 0x7a7a 0.170054
+ 0x7b7b 0.173690
+ 0x7c7c 0.177371
+ 0x7d7d 0.181095
+ 0x7e7e 0.184865
+ 0x7f7f 0.188678
+ 0x8080 0.192536
+ 0x8181 0.196439
+ 0x8282 0.200386
+ 0x8383 0.204378
+ 0x8484 0.208414
+ 0x8585 0.212495
+ 0x8686 0.216621
+ 0x8787 0.220791
+ 0x8888 0.225005
+ 0x8989 0.229265
+ 0x8a8a 0.233568
+ 0x8b8b 0.237916
+ 0x8c8c 0.242309
+ 0x8d8d 0.246746
+ 0x8e8e 0.251227
+ 0x8f8f 0.255753
+ 0x9090 0.260323
+ 0x9191 0.264937
+ 0x9292 0.269596
+ 0x9393 0.274298
+ 0x9494 0.279045
+ 0x9595 0.283836
+ 0x9696 0.288670
+ 0x9797 0.293549
+ 0x9898 0.298471
+ 0x9999 0.303436
+ 0x9a9a 0.308446
+ 0x9b9b 0.313499
+ 0x9c9c 0.318595
+ 0x9d9d 0.323734
+ 0x9e9e 0.328916
+ 0x9f9f 0.334142
+ 0xa0a0 0.339410
+ 0xa1a1 0.344721
+ 0xa2a2 0.350075
+ 0xa3a3 0.355471
+ 0xa4a4 0.360909
+ 0xa5a5 0.366390
+ 0xa6a6 0.371913
+ 0xa7a7 0.377477
+ 0xa8a8 0.383084
+ 0xa9a9 0.388732
+ 0xaaaa 0.394421
+ 0xabab 0.400151
+ 0xacac 0.405923
+ 0xadad 0.411735
+ 0xaeae 0.417588
+ 0xafaf 0.423481
+ 0xb0b0 0.429415
+ 0xb1b1 0.435388
+ 0xb2b2 0.441402
+ 0xb3b3 0.447455
+ 0xb4b4 0.453547
+ 0xb5b5 0.459679
+ 0xb6b6 0.465849
+ 0xb7b7 0.472059
+ 0xb8b8 0.478306
+ 0xb9b9 0.484592
+ 0xbaba 0.490916
+ 0xbbbb 0.497278
+ 0xbcbc 0.503677
+ 0xbdbd 0.510114
+ 0xbebe 0.516587
+ 0xbfbf 0.523097
+ 0xc0c0 0.529643
+ 0xc1c1 0.536226
+ 0xc2c2 0.542844
+ 0xc3c3 0.549498
+ 0xc4c4 0.556187
+ 0xc5c5 0.562912
+ 0xc6c6 0.569670
+ 0xc7c7 0.576463
+ 0xc8c8 0.583291
+ 0xc9c9 0.590151
+ 0xcaca 0.597046
+ 0xcbcb 0.603973
+ 0xcccc 0.610933
+ 0xcdcd 0.617925
+ 0xcece 0.624950
+ 0xcfcf 0.632006
+ 0xd0d0 0.639093
+ 0xd1d1 0.646212
+ 0xd2d2 0.653361
+ 0xd3d3 0.660540
+ 0xd4d4 0.667750
+ 0xd5d5 0.674988
+ 0xd6d6 0.682256
+ 0xd7d7 0.689553
+ 0xd8d8 0.696878
+ 0xd9d9 0.704231
+ 0xdada 0.711612
+ 0xdbdb 0.719019
+ 0xdcdc 0.726454
+ 0xdddd 0.733915
+ 0xdede 0.741402
+ 0xdfdf 0.748914
+ 0xe0e0 0.756451
+ 0xe1e1 0.764013
+ 0xe2e2 0.771600
+ 0xe3e3 0.779210
+ 0xe4e4 0.786843
+ 0xe5e5 0.794499
+ 0xe6e6 0.802178
+ 0xe7e7 0.809878
+ 0xe8e8 0.817600
+ 0xe9e9 0.825343
+ 0xeaea 0.833107
+ 0xebeb 0.840891
+ 0xecec 0.848694
+ 0xeded 0.856517
+ 0xeeee 0.864358
+ 0xefef 0.872217
+ 0xf0f0 0.880093
+ 0xf1f1 0.887987
+ 0xf2f2 0.895898
+ 0xf3f3 0.903824
+ 0xf4f4 0.911766
+ 0xf5f5 0.919723
+ 0xf6f6 0.927695
+ 0xf7f7 0.935680
+ 0xf8f8 0.943679
+ 0xf9f9 0.951691
+ 0xfafa 0.959715
+ 0xfbfb 0.967750
+ 0xfcfc 0.975797
+ 0xfdfd 0.983855
+ 0xfefe 0.991923
+ 0xffff 1.00000
+ INTENSITY_TBL_END
+ INTENSITY_PROFILE_END
+
+SCREENDATA_END
diff --git a/datafiles/sample2.dcc b/datafiles/sample2.dcc
new file mode 100644
index 0000000..4dc9c7e
--- /dev/null
+++ b/datafiles/sample2.dcc
@@ -0,0 +1,843 @@
+/*
+ * (c) Copyright 1990 1991 Tektronix Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix be liable for any special, indirect or consequential damages or
+ * any damages whatsoever resulting from loss of use, data or profits,
+ * whether in an action of contract, negligence or other tortious action,
+ * arising out of or in connection with the use or performance of this
+ * software.
+ *
+ *
+ * NAME
+ * sample2.dcc
+ *
+ * DESCRIPTION
+ * Sample Screen Color Characterization Data File
+ *
+ * IMPORTANT NOTICE
+ * This sample file is provided solely for the purpose of
+ * presenting the format of input files accepted by the
+ * 'cmsdb' utility -- a sample mechanism for placing Screen
+ * Color Characterization Data into root window properties
+ * in accordance with the X Device Color Characterization
+ * Convention (XDCCC). The data in this file is tailored
+ * specifically for the Tektronix monitor (part number
+ * 119-3916-00). These monitors have been built by the
+ * monitor vendor to Tektronix specifications that typically
+ * differ from monitors provided by the same vendor to other
+ * companies. Therefore, for accurate color rendition this
+ * sample file should only be used in conjunction with the
+ * specified Tektronix monitor. To be XCMS compatible,
+ * X workstation and X terminal vendors must provide screen
+ * characterization data for their own monitors.
+ */
+SCREENDATA_BEGIN 0.3
+
+ NAME Tektronix 19" (Panasonic) CRT
+ PART_NUMBER 119-3916-00
+ MODEL XP27
+ SCREEN_CLASS VIDEO_RGB
+ REVISION 2.0
+
+ COLORIMETRIC_BEGIN
+ XYZtoRGB_MATRIX_BEGIN
+ 4.075911 -1.820444 -0.627311
+ -1.102477 1.935176 0.037364
+ 0.059967 -0.206788 0.885717
+ XYZtoRGB_MATRIX_END
+ RGBtoXYZ_MATRIX_BEGIN
+ 0.333300 0.337244 0.221834
+ 0.189464 0.706136 0.104400
+ 0.021668 0.142028 1.138384
+ RGBtoXYZ_MATRIX_END
+ COLORIMETRIC_END
+
+ INTENSITY_PROFILE_BEGIN 0 3
+ INTENSITY_TBL_BEGIN RED 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000000
+ 0x0b0b 0.000000
+ 0x0c0c 0.000000
+ 0x0d0d 0.000000
+ 0x0e0e 0.000000
+ 0x0f0f 0.000000
+ 0x1010 0.000000
+ 0x1111 0.000000
+ 0x1212 0.000000
+ 0x1313 0.000000
+ 0x1414 0.000000
+ 0x1515 0.000000
+ 0x1616 0.000000
+ 0x1717 0.000000
+ 0x1818 0.000000
+ 0x1919 0.000000
+ 0x1a1a 0.000000
+ 0x1b1b 0.000000
+ 0x1c1c 0.000000
+ 0x1d1d 0.000000
+ 0x1e1e 0.000000
+ 0x1f1f 0.000152
+ 0x2020 0.000303
+ 0x2121 0.000455
+ 0x2222 0.000607
+ 0x2323 0.000759
+ 0x2424 0.000910
+ 0x2525 0.001062
+ 0x2626 0.001213
+ 0x2727 0.001365
+ 0x2828 0.001516
+ 0x2929 0.001683
+ 0x2a2a 0.001850
+ 0x2b2b 0.002017
+ 0x2c2c 0.002184
+ 0x2d2d 0.002350
+ 0x2e2e 0.002581
+ 0x2f2f 0.002813
+ 0x3030 0.003044
+ 0x3131 0.003275
+ 0x3232 0.003506
+ 0x3333 0.003902
+ 0x3434 0.004298
+ 0x3535 0.004694
+ 0x3636 0.005090
+ 0x3737 0.005487
+ 0x3838 0.006029
+ 0x3939 0.006571
+ 0x3a3a 0.007114
+ 0x3b3b 0.007656
+ 0x3c3c 0.008198
+ 0x3d3d 0.008998
+ 0x3e3e 0.009799
+ 0x3f3f 0.010599
+ 0x4040 0.011399
+ 0x4141 0.012200
+ 0x4242 0.012987
+ 0x4343 0.013775
+ 0x4444 0.014563
+ 0x4545 0.015350
+ 0x4646 0.016138
+ 0x4747 0.017156
+ 0x4848 0.018174
+ 0x4949 0.019191
+ 0x4a4a 0.020209
+ 0x4b4b 0.021227
+ 0x4c4c 0.022418
+ 0x4d4d 0.023609
+ 0x4e4e 0.024800
+ 0x4f4f 0.025991
+ 0x5050 0.027181
+ 0x5151 0.028690
+ 0x5252 0.030198
+ 0x5353 0.031707
+ 0x5454 0.033215
+ 0x5555 0.034724
+ 0x5656 0.036212
+ 0x5757 0.037700
+ 0x5858 0.039187
+ 0x5959 0.040675
+ 0x5a5a 0.042163
+ 0x5b5b 0.043903
+ 0x5c5c 0.045642
+ 0x5d5d 0.047382
+ 0x5e5e 0.049121
+ 0x5f5f 0.050861
+ 0x6060 0.052846
+ 0x6161 0.054830
+ 0x6262 0.056815
+ 0x6363 0.058800
+ 0x6464 0.060785
+ 0x6565 0.062914
+ 0x6666 0.065043
+ 0x6767 0.067173
+ 0x6868 0.069302
+ 0x6969 0.071431
+ 0x6a6a 0.073965
+ 0x6b6b 0.076498
+ 0x6c6c 0.079032
+ 0x6d6d 0.081565
+ 0x6e6e 0.084099
+ 0x6f6f 0.086704
+ 0x7070 0.089310
+ 0x7171 0.091916
+ 0x7272 0.094521
+ 0x7373 0.097127
+ 0x7474 0.100051
+ 0x7575 0.102975
+ 0x7676 0.105899
+ 0x7777 0.108823
+ 0x7878 0.111747
+ 0x7979 0.114750
+ 0x7a7a 0.117752
+ 0x7b7b 0.120755
+ 0x7c7c 0.123757
+ 0x7d7d 0.126760
+ 0x7e7e 0.130326
+ 0x7f7f 0.133893
+ 0x8080 0.137459
+ 0x8181 0.141026
+ 0x8282 0.144592
+ 0x8383 0.147992
+ 0x8484 0.151391
+ 0x8585 0.154791
+ 0x8686 0.158190
+ 0x8787 0.161590
+ 0x8888 0.165460
+ 0x8989 0.169329
+ 0x8a8a 0.173199
+ 0x8b8b 0.177068
+ 0x8c8c 0.180938
+ 0x8d8d 0.185355
+ 0x8e8e 0.189773
+ 0x8f8f 0.194190
+ 0x9090 0.198608
+ 0x9191 0.203025
+ 0x9292 0.207218
+ 0x9393 0.211412
+ 0x9494 0.215605
+ 0x9595 0.219799
+ 0x9696 0.223992
+ 0x9797 0.228504
+ 0x9898 0.233016
+ 0x9999 0.237527
+ 0x9a9a 0.242039
+ 0x9b9b 0.246551
+ 0x9c9c 0.251762
+ 0x9d9d 0.256974
+ 0x9e9e 0.262185
+ 0x9f9f 0.267397
+ 0xa0a0 0.272608
+ 0xa1a1 0.277726
+ 0xa2a2 0.282845
+ 0xa3a3 0.287963
+ 0xa4a4 0.293082
+ 0xa5a5 0.298200
+ 0xa6a6 0.303506
+ 0xa7a7 0.308811
+ 0xa8a8 0.314117
+ 0xa9a9 0.319422
+ 0xaaaa 0.324728
+ 0xabab 0.330258
+ 0xacac 0.335788
+ 0xadad 0.341317
+ 0xaeae 0.346847
+ 0xafaf 0.352377
+ 0xb0b0 0.358593
+ 0xb1b1 0.364808
+ 0xb2b2 0.371024
+ 0xb3b3 0.377239
+ 0xb4b4 0.383455
+ 0xb5b5 0.389612
+ 0xb6b6 0.395769
+ 0xb7b7 0.401925
+ 0xb8b8 0.408082
+ 0xb9b9 0.414239
+ 0xbaba 0.420600
+ 0xbbbb 0.426961
+ 0xbcbc 0.433321
+ 0xbdbd 0.439682
+ 0xbebe 0.446043
+ 0xbfbf 0.453125
+ 0xc0c0 0.460207
+ 0xc1c1 0.467288
+ 0xc2c2 0.474370
+ 0xc3c3 0.481452
+ 0xc4c4 0.488288
+ 0xc5c5 0.495125
+ 0xc6c6 0.501961
+ 0xc7c7 0.508798
+ 0xc8c8 0.515634
+ 0xc9c9 0.522853
+ 0xcaca 0.530072
+ 0xcbcb 0.537292
+ 0xcccc 0.544511
+ 0xcdcd 0.551730
+ 0xcece 0.559584
+ 0xcfcf 0.567438
+ 0xd0d0 0.575292
+ 0xd1d1 0.583146
+ 0xd2d2 0.591000
+ 0xd3d3 0.598768
+ 0xd4d4 0.606535
+ 0xd5d5 0.614303
+ 0xd6d6 0.622070
+ 0xd7d7 0.629838
+ 0xd8d8 0.637745
+ 0xd9d9 0.645652
+ 0xdada 0.653558
+ 0xdbdb 0.661465
+ 0xdcdc 0.669372
+ 0xdddd 0.678403
+ 0xdede 0.687433
+ 0xdfdf 0.696464
+ 0xe0e0 0.705494
+ 0xe1e1 0.714525
+ 0xe2e2 0.723065
+ 0xe3e3 0.731605
+ 0xe4e4 0.740146
+ 0xe5e5 0.748686
+ 0xe6e6 0.757226
+ 0xe7e7 0.766178
+ 0xe8e8 0.775130
+ 0xe9e9 0.784082
+ 0xeaea 0.793034
+ 0xebeb 0.801986
+ 0xecec 0.811624
+ 0xeded 0.821262
+ 0xeeee 0.830901
+ 0xefef 0.840539
+ 0xf0f0 0.850177
+ 0xf1f1 0.859991
+ 0xf2f2 0.869804
+ 0xf3f3 0.879618
+ 0xf4f4 0.889431
+ 0xf5f5 0.899245
+ 0xf6f6 0.909217
+ 0xf7f7 0.919188
+ 0xf8f8 0.929160
+ 0xf9f9 0.939131
+ 0xfafa 0.949103
+ 0xfbfb 0.959282
+ 0xfcfc 0.969462
+ 0xfdfd 0.979641
+ 0xfefe 0.989821
+ 0xffff 1.000000
+ INTENSITY_TBL_END
+ INTENSITY_TBL_BEGIN GREEN 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000000
+ 0x0b0b 0.000000
+ 0x0c0c 0.000000
+ 0x0d0d 0.000000
+ 0x0e0e 0.000000
+ 0x0f0f 0.000000
+ 0x1010 0.000000
+ 0x1111 0.000000
+ 0x1212 0.000000
+ 0x1313 0.000000
+ 0x1414 0.000000
+ 0x1515 0.000022
+ 0x1616 0.000044
+ 0x1717 0.000066
+ 0x1818 0.000087
+ 0x1919 0.000109
+ 0x1a1a 0.000131
+ 0x1b1b 0.000152
+ 0x1c1c 0.000173
+ 0x1d1d 0.000195
+ 0x1e1e 0.000216
+ 0x1f1f 0.000307
+ 0x2020 0.000398
+ 0x2121 0.000489
+ 0x2222 0.000580
+ 0x2323 0.000671
+ 0x2424 0.000804
+ 0x2525 0.000937
+ 0x2626 0.001070
+ 0x2727 0.001203
+ 0x2828 0.001336
+ 0x2929 0.001514
+ 0x2a2a 0.001691
+ 0x2b2b 0.001869
+ 0x2c2c 0.002046
+ 0x2d2d 0.002224
+ 0x2e2e 0.002604
+ 0x2f2f 0.002985
+ 0x3030 0.003365
+ 0x3131 0.003746
+ 0x3232 0.004127
+ 0x3333 0.004618
+ 0x3434 0.005110
+ 0x3535 0.005602
+ 0x3636 0.006094
+ 0x3737 0.006586
+ 0x3838 0.007191
+ 0x3939 0.007797
+ 0x3a3a 0.008402
+ 0x3b3b 0.009008
+ 0x3c3c 0.009613
+ 0x3d3d 0.010399
+ 0x3e3e 0.011185
+ 0x3f3f 0.011971
+ 0x4040 0.012757
+ 0x4141 0.013543
+ 0x4242 0.014529
+ 0x4343 0.015516
+ 0x4444 0.016502
+ 0x4545 0.017488
+ 0x4646 0.018475
+ 0x4747 0.019641
+ 0x4848 0.020808
+ 0x4949 0.021975
+ 0x4a4a 0.023141
+ 0x4b4b 0.024308
+ 0x4c4c 0.025678
+ 0x4d4d 0.027049
+ 0x4e4e 0.028419
+ 0x4f4f 0.029789
+ 0x5050 0.031159
+ 0x5151 0.032730
+ 0x5252 0.034301
+ 0x5353 0.035872
+ 0x5454 0.037443
+ 0x5555 0.039014
+ 0x5656 0.040697
+ 0x5757 0.042380
+ 0x5858 0.044063
+ 0x5959 0.045747
+ 0x5a5a 0.047430
+ 0x5b5b 0.049363
+ 0x5c5c 0.051295
+ 0x5d5d 0.053228
+ 0x5e5e 0.055161
+ 0x5f5f 0.057094
+ 0x6060 0.059316
+ 0x6161 0.061539
+ 0x6262 0.063761
+ 0x6363 0.065983
+ 0x6464 0.068206
+ 0x6565 0.070521
+ 0x6666 0.072836
+ 0x6767 0.075151
+ 0x6868 0.077466
+ 0x6969 0.079781
+ 0x6a6a 0.082294
+ 0x6b6b 0.084808
+ 0x6c6c 0.087321
+ 0x6d6d 0.089835
+ 0x6e6e 0.092348
+ 0x6f6f 0.095312
+ 0x7070 0.098276
+ 0x7171 0.101240
+ 0x7272 0.104204
+ 0x7373 0.107168
+ 0x7474 0.110134
+ 0x7575 0.113100
+ 0x7676 0.116067
+ 0x7777 0.119033
+ 0x7878 0.121999
+ 0x7979 0.125235
+ 0x7a7a 0.128471
+ 0x7b7b 0.131708
+ 0x7c7c 0.134944
+ 0x7d7d 0.138180
+ 0x7e7e 0.141796
+ 0x7f7f 0.145412
+ 0x8080 0.149029
+ 0x8181 0.152645
+ 0x8282 0.156261
+ 0x8383 0.159971
+ 0x8484 0.163681
+ 0x8585 0.167392
+ 0x8686 0.171102
+ 0x8787 0.174812
+ 0x8888 0.178720
+ 0x8989 0.182628
+ 0x8a8a 0.186536
+ 0x8b8b 0.190444
+ 0x8c8c 0.194352
+ 0x8d8d 0.198687
+ 0x8e8e 0.203023
+ 0x8f8f 0.207358
+ 0x9090 0.211694
+ 0x9191 0.216029
+ 0x9292 0.220412
+ 0x9393 0.224795
+ 0x9494 0.229179
+ 0x9595 0.233562
+ 0x9696 0.237945
+ 0x9797 0.242618
+ 0x9898 0.247291
+ 0x9999 0.251965
+ 0x9a9a 0.256638
+ 0x9b9b 0.261311
+ 0x9c9c 0.266561
+ 0x9d9d 0.271812
+ 0x9e9e 0.277062
+ 0x9f9f 0.282313
+ 0xa0a0 0.287563
+ 0xa1a1 0.292687
+ 0xa2a2 0.297811
+ 0xa3a3 0.302936
+ 0xa4a4 0.308060
+ 0xa5a5 0.313184
+ 0xa6a6 0.318485
+ 0xa7a7 0.323787
+ 0xa8a8 0.329088
+ 0xa9a9 0.334390
+ 0xaaaa 0.339691
+ 0xabab 0.345238
+ 0xacac 0.350785
+ 0xadad 0.356332
+ 0xaeae 0.361879
+ 0xafaf 0.367426
+ 0xb0b0 0.373596
+ 0xb1b1 0.379766
+ 0xb2b2 0.385935
+ 0xb3b3 0.392105
+ 0xb4b4 0.398275
+ 0xb5b5 0.404379
+ 0xb6b6 0.410483
+ 0xb7b7 0.416586
+ 0xb8b8 0.422690
+ 0xb9b9 0.428794
+ 0xbaba 0.435099
+ 0xbbbb 0.441405
+ 0xbcbc 0.447710
+ 0xbdbd 0.454016
+ 0xbebe 0.460321
+ 0xbfbf 0.467525
+ 0xc0c0 0.474729
+ 0xc1c1 0.481932
+ 0xc2c2 0.489136
+ 0xc3c3 0.496340
+ 0xc4c4 0.503722
+ 0xc5c5 0.511105
+ 0xc6c6 0.518487
+ 0xc7c7 0.525870
+ 0xc8c8 0.533252
+ 0xc9c9 0.540159
+ 0xcaca 0.547066
+ 0xcbcb 0.553972
+ 0xcccc 0.560879
+ 0xcdcd 0.567786
+ 0xcece 0.576112
+ 0xcfcf 0.584437
+ 0xd0d0 0.592763
+ 0xd1d1 0.601088
+ 0xd2d2 0.609414
+ 0xd3d3 0.617043
+ 0xd4d4 0.624672
+ 0xd5d5 0.632302
+ 0xd6d6 0.639931
+ 0xd7d7 0.647560
+ 0xd8d8 0.655408
+ 0xd9d9 0.663255
+ 0xdada 0.671103
+ 0xdbdb 0.678950
+ 0xdcdc 0.686798
+ 0xdddd 0.695334
+ 0xdede 0.703869
+ 0xdfdf 0.712405
+ 0xe0e0 0.720940
+ 0xe1e1 0.729476
+ 0xe2e2 0.737757
+ 0xe3e3 0.746039
+ 0xe4e4 0.754320
+ 0xe5e5 0.762602
+ 0xe6e6 0.770883
+ 0xe7e7 0.779637
+ 0xe8e8 0.788391
+ 0xe9e9 0.797145
+ 0xeaea 0.805899
+ 0xebeb 0.814653
+ 0xecec 0.824068
+ 0xeded 0.833483
+ 0xeeee 0.842899
+ 0xefef 0.852314
+ 0xf0f0 0.861729
+ 0xf1f1 0.870730
+ 0xf2f2 0.879730
+ 0xf3f3 0.888731
+ 0xf4f4 0.897731
+ 0xf5f5 0.906732
+ 0xf6f6 0.915706
+ 0xf7f7 0.924680
+ 0xf8f8 0.933653
+ 0xf9f9 0.942627
+ 0xfafa 0.951601
+ 0xfbfb 0.961281
+ 0xfcfc 0.970961
+ 0xfdfd 0.980640
+ 0xfefe 0.990320
+ 0xffff 1.000000
+ INTENSITY_TBL_END
+ INTENSITY_TBL_BEGIN BLUE 256
+ 0x0000 0.000000
+ 0x0101 0.000000
+ 0x0202 0.000000
+ 0x0303 0.000000
+ 0x0404 0.000000
+ 0x0505 0.000000
+ 0x0606 0.000000
+ 0x0707 0.000000
+ 0x0808 0.000000
+ 0x0909 0.000000
+ 0x0a0a 0.000000
+ 0x0b0b 0.000000
+ 0x0c0c 0.000000
+ 0x0d0d 0.000000
+ 0x0e0e 0.000000
+ 0x0f0f 0.000000
+ 0x1010 0.000000
+ 0x1111 0.000000
+ 0x1212 0.000000
+ 0x1313 0.000000
+ 0x1414 0.000000
+ 0x1515 0.000000
+ 0x1616 0.000000
+ 0x1717 0.000000
+ 0x1818 0.000000
+ 0x1919 0.000000
+ 0x1a1a 0.000000
+ 0x1b1b 0.000000
+ 0x1c1c 0.000000
+ 0x1d1d 0.000000
+ 0x1e1e 0.000000
+ 0x1f1f 0.000000
+ 0x2020 0.000000
+ 0x2121 0.000000
+ 0x2222 0.000000
+ 0x2323 0.000000
+ 0x2424 0.000201
+ 0x2525 0.000402
+ 0x2626 0.000603
+ 0x2727 0.000804
+ 0x2828 0.001005
+ 0x2929 0.001606
+ 0x2a2a 0.002206
+ 0x2b2b 0.002807
+ 0x2c2c 0.003408
+ 0x2d2d 0.004008
+ 0x2e2e 0.004413
+ 0x2f2f 0.004818
+ 0x3030 0.005224
+ 0x3131 0.005629
+ 0x3232 0.006034
+ 0x3333 0.006034
+ 0x3434 0.006034
+ 0x3535 0.006034
+ 0x3636 0.006034
+ 0x3737 0.006034
+ 0x3838 0.006835
+ 0x3939 0.007637
+ 0x3a3a 0.008439
+ 0x3b3b 0.009240
+ 0x3c3c 0.010042
+ 0x3d3d 0.010837
+ 0x3e3e 0.011632
+ 0x3f3f 0.012428
+ 0x4040 0.013223
+ 0x4141 0.014018
+ 0x4242 0.014820
+ 0x4343 0.015621
+ 0x4444 0.016423
+ 0x4545 0.017225
+ 0x4646 0.018026
+ 0x4747 0.019032
+ 0x4848 0.020038
+ 0x4949 0.021044
+ 0x4a4a 0.022049
+ 0x4b4b 0.023055
+ 0x4c4c 0.024262
+ 0x4d4d 0.025469
+ 0x4e4e 0.026675
+ 0x4f4f 0.027882
+ 0x5050 0.029089
+ 0x5151 0.030491
+ 0x5252 0.031893
+ 0x5353 0.033296
+ 0x5454 0.034698
+ 0x5555 0.036100
+ 0x5656 0.037715
+ 0x5757 0.039330
+ 0x5858 0.040945
+ 0x5959 0.042560
+ 0x5a5a 0.044175
+ 0x5b5b 0.045982
+ 0x5c5c 0.047790
+ 0x5d5d 0.049597
+ 0x5e5e 0.051405
+ 0x5f5f 0.053212
+ 0x6060 0.055409
+ 0x6161 0.057607
+ 0x6262 0.059805
+ 0x6363 0.062002
+ 0x6464 0.064200
+ 0x6565 0.066412
+ 0x6666 0.068625
+ 0x6767 0.070837
+ 0x6868 0.073050
+ 0x6969 0.075262
+ 0x6a6a 0.077664
+ 0x6b6b 0.080065
+ 0x6c6c 0.082467
+ 0x6d6d 0.084868
+ 0x6e6e 0.087270
+ 0x6f6f 0.090083
+ 0x7070 0.092896
+ 0x7171 0.095710
+ 0x7272 0.098523
+ 0x7373 0.101336
+ 0x7474 0.104353
+ 0x7575 0.107370
+ 0x7676 0.110388
+ 0x7777 0.113405
+ 0x7878 0.116422
+ 0x7979 0.119640
+ 0x7a7a 0.122858
+ 0x7b7b 0.126077
+ 0x7c7c 0.129295
+ 0x7d7d 0.132513
+ 0x7e7e 0.135920
+ 0x7f7f 0.139328
+ 0x8080 0.142735
+ 0x8181 0.146143
+ 0x8282 0.149550
+ 0x8383 0.153165
+ 0x8484 0.156780
+ 0x8585 0.160394
+ 0x8686 0.164009
+ 0x8787 0.167624
+ 0x8888 0.171436
+ 0x8989 0.175249
+ 0x8a8a 0.179061
+ 0x8b8b 0.182874
+ 0x8c8c 0.186686
+ 0x8d8d 0.190910
+ 0x8e8e 0.195134
+ 0x8f8f 0.199358
+ 0x9090 0.203582
+ 0x9191 0.207806
+ 0x9292 0.212219
+ 0x9393 0.216632
+ 0x9494 0.221045
+ 0x9595 0.225458
+ 0x9696 0.229871
+ 0x9797 0.234696
+ 0x9898 0.239520
+ 0x9999 0.244345
+ 0x9a9a 0.249169
+ 0x9b9b 0.253994
+ 0x9c9c 0.258998
+ 0x9d9d 0.264003
+ 0x9e9e 0.269007
+ 0x9f9f 0.274012
+ 0xa0a0 0.279016
+ 0xa1a1 0.284045
+ 0xa2a2 0.289073
+ 0xa3a3 0.294102
+ 0xa4a4 0.299130
+ 0xa5a5 0.304159
+ 0xa6a6 0.309779
+ 0xa7a7 0.315399
+ 0xa8a8 0.321018
+ 0xa9a9 0.326638
+ 0xaaaa 0.332258
+ 0xabab 0.338293
+ 0xacac 0.344327
+ 0xadad 0.350362
+ 0xaeae 0.356396
+ 0xafaf 0.362431
+ 0xb0b0 0.368651
+ 0xb1b1 0.374872
+ 0xb2b2 0.381092
+ 0xb3b3 0.387313
+ 0xb4b4 0.393533
+ 0xb5b5 0.399567
+ 0xb6b6 0.405602
+ 0xb7b7 0.411636
+ 0xb8b8 0.417671
+ 0xb9b9 0.423705
+ 0xbaba 0.430127
+ 0xbbbb 0.436548
+ 0xbcbc 0.442970
+ 0xbdbd 0.449391
+ 0xbebe 0.455813
+ 0xbfbf 0.463033
+ 0xc0c0 0.470253
+ 0xc1c1 0.477472
+ 0xc2c2 0.484692
+ 0xc3c3 0.491912
+ 0xc4c4 0.499138
+ 0xc5c5 0.506364
+ 0xc6c6 0.513591
+ 0xc7c7 0.520817
+ 0xc8c8 0.528043
+ 0xc9c9 0.535269
+ 0xcaca 0.542495
+ 0xcbcb 0.549722
+ 0xcccc 0.556948
+ 0xcdcd 0.564174
+ 0xcece 0.572009
+ 0xcfcf 0.579845
+ 0xd0d0 0.587680
+ 0xd1d1 0.595516
+ 0xd2d2 0.603351
+ 0xd3d3 0.611379
+ 0xd4d4 0.619407
+ 0xd5d5 0.627434
+ 0xd6d6 0.635462
+ 0xd7d7 0.643490
+ 0xd8d8 0.651512
+ 0xd9d9 0.659533
+ 0xdada 0.667555
+ 0xdbdb 0.675576
+ 0xdcdc 0.683598
+ 0xdddd 0.692650
+ 0xdede 0.701701
+ 0xdfdf 0.710753
+ 0xe0e0 0.719804
+ 0xe1e1 0.728856
+ 0xe2e2 0.737496
+ 0xe3e3 0.746136
+ 0xe4e4 0.754777
+ 0xe5e5 0.763417
+ 0xe6e6 0.772057
+ 0xe7e7 0.781091
+ 0xe8e8 0.790124
+ 0xe9e9 0.799158
+ 0xeaea 0.808191
+ 0xebeb 0.817225
+ 0xecec 0.826660
+ 0xeded 0.836096
+ 0xeeee 0.845531
+ 0xefef 0.854967
+ 0xf0f0 0.864402
+ 0xf1f1 0.873235
+ 0xf2f2 0.882067
+ 0xf3f3 0.890900
+ 0xf4f4 0.899732
+ 0xf5f5 0.908565
+ 0xf6f6 0.917806
+ 0xf7f7 0.927047
+ 0xf8f8 0.936287
+ 0xf9f9 0.945528
+ 0xfafa 0.954769
+ 0xfbfb 0.963815
+ 0xfcfc 0.972861
+ 0xfdfd 0.981908
+ 0xfefe 0.990954
+ 0xffff 1.000000
+ INTENSITY_TBL_END
+ INTENSITY_PROFILE_END
+
+SCREENDATA_END
diff --git a/loadData.c b/loadData.c
new file mode 100644
index 0000000..5082e83
--- /dev/null
+++ b/loadData.c
@@ -0,0 +1,1787 @@
+/* $Xorg: loadData.c,v 1.4 2000/08/17 19:54:13 cpqbld Exp $ */
+
+/*
+ * (c) Copyright 1990 Tektronix Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix be liable for any special, indirect or consequential damages or
+ * any damages whatsoever resulting from loss of use, data or profits,
+ * whether in an action of contract, negligence or other tortious action,
+ * arising out of or in connection with the use or performance of this
+ * software.
+ *
+ *
+ * NAME
+ * LoadSCCData.c
+ *
+ * DESCRIPTION
+ * TekCMS API routine that reads screen data from a file
+ * and then loads the data on the root window of the screen.
+ *
+ *
+ *
+ */
+
+/*
+ * INCLUDES
+ */
+
+#include <X11/Xos.h>
+#include <sys/stat.h>
+#include <stdio.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include "SCCDFile.h"
+
+
+/*
+ * EXTERNS
+ * External declarations required locally to this package
+ * that are not already declared in any of the included header
+ * files (external includes or internal includes).
+ */
+
+#ifdef X_NOT_STDC_ENV
+extern char *strtok();
+extern char *strchr();
+#endif
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#else
+char *calloc();
+#endif
+
+/*
+ * LOCAL TYPEDEFS
+ * typedefs local to this package (for use with local vars).
+ *
+ */
+
+typedef struct _DefineEntry {
+ char *pString;
+ int define;
+} DefineEntry;
+
+
+/*
+ * LOCAL VARIABLES
+ */
+static int linenum = 0;
+
+static DefineEntry KeyTbl[] = {
+ SC_BEGIN_KEYWORD, SC_BEGIN,
+ SC_END_KEYWORD, SC_END,
+ COMMENT_KEYWORD, COMMENT,
+ NAME_KEYWORD, NAME,
+ MODEL_KEYWORD, MODEL,
+ PART_NUMBER_KEYWORD, PART_NUMBER,
+ SERIAL_NUMBER_KEYWORD, SERIAL_NUMBER,
+ REVISION_KEYWORD, REVISION,
+ SCREEN_CLASS_KEYWORD, SCREEN_CLASS,
+ COLORIMETRIC_BEGIN_KEYWORD, COLORIMETRIC_BEGIN,
+ COLORIMETRIC_END_KEYWORD, COLORIMETRIC_END,
+ XYZTORGBMAT_BEGIN_KEYWORD, XYZTORGBMAT_BEGIN,
+ XYZTORGBMAT_END_KEYWORD, XYZTORGBMAT_END,
+ WHITEPT_XYZ_BEGIN_KEYWORD, WHITEPT_XYZ_BEGIN,
+ WHITEPT_XYZ_END_KEYWORD, WHITEPT_XYZ_END,
+ RGBTOXYZMAT_BEGIN_KEYWORD, RGBTOXYZMAT_BEGIN,
+ RGBTOXYZMAT_END_KEYWORD, RGBTOXYZMAT_END,
+ IPROFILE_BEGIN_KEYWORD, IPROFILE_BEGIN,
+ IPROFILE_END_KEYWORD, IPROFILE_END,
+ ITBL_BEGIN_KEYWORD, ITBL_BEGIN,
+ ITBL_END_KEYWORD, ITBL_END,
+ "", -1
+};
+
+static DefineEntry ScrnClassTbl[] = {
+ VIDEO_RGB_KEYWORD, VIDEO_RGB,
+#ifdef GRAY
+ VIDEO_GRAY_KEYWORD, VIDEO_GRAY,
+#endif /* GRAY */
+ "", -1
+};
+
+#define KEY_VISUALID 1
+#define KEY_DEPTH 2
+#define KEY_CLASS 3
+#define KEY_RED_MASK 4
+#define KEY_GREEN_MASK 5
+#define KEY_BLUE_MASK 6
+#define KEY_COLORMAP_SIZE 7
+#define KEY_BITS_PER_RGB 8
+
+static DefineEntry VisualOptKeyTbl[] = {
+ "visualid", KEY_VISUALID,
+ "depth", KEY_DEPTH,
+ "class", KEY_CLASS,
+ "red_mask", KEY_RED_MASK,
+ "green_mask", KEY_GREEN_MASK,
+ "blue_mask", KEY_BLUE_MASK,
+ "colormap_size", KEY_COLORMAP_SIZE,
+ "bits_per_rgb", KEY_BITS_PER_RGB,
+ "", -1
+};
+static DefineEntry VisualClassTbl[] = {
+ "StaticGray", StaticGray,
+ "GrayScale", GrayScale,
+ "StaticColor", StaticColor,
+ "PseudoColor", PseudoColor,
+ "TrueColor", TrueColor,
+ "DirectColor", DirectColor,
+ "", -1
+};
+
+
+/************************************************************************
+ * *
+ * PRIVATE ROUTINES *
+ * *
+ ************************************************************************/
+
+/*
+ * NAME
+ * StrToDefine - convert a string to a define
+ *
+ * SYNOPSIS
+ */
+static int
+StrToDefine(pde,pstring)
+ DefineEntry pde[]; /* IN: table of X string-define pairs */
+ /* last entry must contain pair "", 0 */
+ char *pstring; /* IN: string to be looked up in that table */
+/*
+ * DESCRIPTION
+ * Converts a string to an integer define.
+ *
+ * Looks up the string in the table and returns the integer
+ * associated with the string.
+ *
+ * Later may need similar function for unsigned long define.
+ *
+ *
+ *
+ * RETURNS
+ * The int equivalent of the defined string.
+ * -1 if the string is not found in table
+ *
+ */
+{
+ while( strcmp(pde->pString,"") != 0 ){
+ if( strcmp(pde->pString,pstring) == 0){
+ return(pde->define);
+ }
+ pde++;
+ }
+ return(-1);
+}
+
+/*
+ * NAME
+ * DefineToStr
+ *
+ * SYNOPSIS
+ */
+static char *
+DefineToStr(pde,id)
+ DefineEntry pde[]; /* IN: table of X string-define pairs */
+ /* last entry must contain pair "", 0 */
+ int id; /* IN: id to be looked up in that table */
+/*
+ * DESCRIPTION
+ * Converts a string to an integer define.
+ *
+ * Looks up the string in the table and returns the integer
+ * associated with the string.
+ *
+ * Later may need similar function for unsigned long define.
+ *
+ *
+ *
+ * RETURNS
+ * The int equivalent of the defined string.
+ * -1 if the string is not found in table
+ *
+ */
+{
+ while(pde->define != -1) {
+ if (pde->define == id) {
+ return(pde->pString);
+ }
+ pde++;
+ }
+ return(NULL);
+}
+
+/*
+ * NAME
+ * SCKeyOf - convert keyword into key ID
+ *
+ * SYNOPSIS
+ */
+static int
+SCKeyOf(string)
+ char *string;
+/*
+ * DESCRIPTION
+ * Converts a string to an integer define.
+ *
+ * Looks up the string in the table and returns the integer
+ * associated with the string.
+ *
+ * Later may need similar function for unsigned long define.
+ *
+ *
+ *
+ * RETURNS
+ * The int equivalent of the defined string.
+ * -1 if the string is not found in table
+ *
+ */
+{
+ return(StrToDefine(KeyTbl, string));
+}
+
+
+/*
+ * NAME
+ * SCScrnClassOf - convert screen class string into class ID
+ *
+ * SYNOPSIS
+ */
+static int
+SCScrnClassOf(string)
+ char *string;
+/*
+ * DESCRIPTION
+ * Converts a string to an integer define.
+ *
+ * Looks up the string in the table and returns the integer
+ * associated with the string.
+ *
+ * Later may need similar function for unsigned long define.
+ *
+ *
+ *
+ * RETURNS
+ * The int equivalent of the defined string.
+ * -1 if the string is not found in table
+ *
+ */
+{
+ return(StrToDefine(ScrnClassTbl, string));
+}
+
+
+/*
+ * NAME
+ * SCScrnClassStringOf - convert screen class id into class string
+ *
+ * SYNOPSIS
+ */
+static char *
+SCScrnClassStringOf(id)
+ int id;
+/*
+ * DESCRIPTION
+ * Converts a id to astring
+ *
+ * RETURNS
+ * Pointer to string if found; otherwise NULL.
+ *
+ */
+{
+ return(DefineToStr(ScrnClassTbl, id));
+}
+
+/* close the stream and return any memory allocated. */
+/*ARGSUSED*/
+static void
+closeS(stream, pCorrection)
+ FILE *stream;
+ XDCCC_Correction* pCorrection;
+{
+ XDCCC_Correction* pNext;
+ if (stream) {
+ fclose (stream);
+ }
+ while (pCorrection) {
+ pNext = pCorrection->next;
+ free(pCorrection);
+ pCorrection = pNext;
+ }
+}
+
+/*
+ * Get a line of text from the stream.
+ */
+static char *
+nextline(buf, maxch, stream)
+ char *buf;
+ int maxch;
+ FILE *stream;
+{
+ linenum++;
+ return (fgets(buf, maxch, stream));
+}
+
+
+static int
+ProcessColorimetric(stream, pMatrix, VisualFlag)
+ FILE *stream;
+ XDCCC_Matrix* pMatrix;
+ int VisualFlag;
+{
+ char buf[BUFSIZ];
+ char keyword[BUFSIZ];
+ char token[BUFSIZ], *ptoken;
+ int ntok;
+ unsigned int matrices_processed = 0;
+ /* bit 0 for XYZtoRGB matrix */
+ /* bit 1 for RGBtoXYZ matrix */
+ int state = 0;
+ /* 0 -- looking for matrix */
+ /* 1 -- processing data from matrix */
+ /* 2 -- both matrices processed */
+ /* Note: the order of the matrices is not important. */
+ int count;
+ XcmsFloat *pElement;
+
+ while ((nextline(buf, BUFSIZ, stream)) != NULL) {
+ if ((ntok = sscanf(buf, "%s %s", keyword, token)) > 0) {
+ switch (SCKeyOf(keyword)) {
+ case XYZTORGBMAT_BEGIN :
+ if (VisualFlag != VIDEO_RGB) {
+ fprintf(stderr,
+ "Line %d: Keyword XYZTORGBMAT_BEGIN mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if (state != 0) {
+ fprintf(stderr,
+ "Line %d: Extraneous keyword %s.\n",
+ linenum, keyword);
+ return (0);
+ }
+ state = 1;
+ count = 0;
+ pElement = (XcmsFloat *) pMatrix->XYZtoRGBmatrix;
+ break;
+ case XYZTORGBMAT_END :
+ if (VisualFlag != VIDEO_RGB) {
+ fprintf(stderr,
+ "Line %d: Keyword XYZTORGBMAT_END mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if ((state != 1) || (count != 9)) {
+ fprintf(stderr,
+ "Line %d: Incomplete XYZtoRGB matrix -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ matrices_processed |= 0x1;
+ if (matrices_processed == 3) {
+ state = 2;
+ } else {
+ state = 0;
+ }
+ break;
+ case RGBTOXYZMAT_BEGIN :
+ if (VisualFlag != VIDEO_RGB) {
+ fprintf(stderr,
+ "Line %d: Keyword RGBTOXYZMAT_BEGIN mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if (state != 0) {
+ fprintf(stderr, "Line %d: Extraneous keyword %s.\n",
+ linenum, keyword);
+ return (0);
+ }
+ state = 1;
+ count = 0;
+ pElement = (XcmsFloat *) pMatrix->RGBtoXYZmatrix;
+ break;
+ case RGBTOXYZMAT_END :
+ if (VisualFlag != VIDEO_RGB) {
+ fprintf(stderr,
+ "Line %d: Keyword RGBTOXYZMAT_END mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if ((state != 1) || (count != 9)) {
+ fprintf(stderr,
+ "Line %d: Incomplete RGBtoXYZ matrix -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ matrices_processed |= 0x2;
+ if (matrices_processed == 3) {
+ state = 2;
+ } else {
+ state = 0;
+ }
+ break;
+#ifdef GRAY
+ case WHITEPT_XYZ_BEGIN :
+ if (VisualFlag != VIDEO_GRAY) {
+ fprintf(stderr,
+ "Line %d: Keyword WHITEPT_XYZ_BEGIN mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if (state != 0) {
+ fprintf(stderr,
+ "Line %d: Extraneous keyword %s.\n",
+ linenum, keyword);
+ return (0);
+ }
+ state = 1;
+ count = 0;
+ pElement = (XcmsFloat *) pMatrix->XYZtoRGBmatrix;
+ break;
+ case WHITEPT_XYZ_END :
+ if (VisualFlag != VIDEO_GRAY) {
+ fprintf(stderr,
+ "Line %d: Keyword WHITEPT_XYZ_END mismatch for visual %s.\n",
+ linenum, SCScrnClassStringOf(VisualFlag));
+ return (0);
+ }
+ if ((state != 1) || (count != 3)) {
+ fprintf(stderr,
+ "Line %d: Incomplete white point -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ state = 2;
+ break;
+#endif /* GRAY */
+ case DATA :
+ for (ptoken = strtok(buf, DATA_DELIMS); ptoken != NULL;
+ ptoken = strtok(NULL, DATA_DELIMS)) {
+ if (sscanf(ptoken, "%lf", pElement) != 1) {
+ if (VisualFlag == VIDEO_RGB) {
+ fprintf(stderr,
+ "Line %d: Invalid matrix value %s.",
+ linenum, ptoken);
+ } else {
+ fprintf(stderr,
+ "Line %d: Invalid CIEXYZ value %s.\n",
+ linenum, ptoken);
+ }
+ return (0);
+ }
+ pElement++;
+ if (VisualFlag == VIDEO_RGB) {
+ if (++count > 9) {
+ fprintf(stderr,
+ "Line %d: Extra matrix value %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+ } else {
+ if (++count > 3) {
+ fprintf(stderr,
+ "Line %d: Extra CIEXYZ value %s.\n",
+ linenum, ptoken);
+ return (0);
+ }
+ }
+ }
+ break;
+ case COLORIMETRIC_BEGIN :
+ fprintf(stderr,
+ "Line %d: Extraneous keyword %s.\n",
+ linenum, keyword);
+ return (0);
+/* NOTREACHED */break;
+ case COLORIMETRIC_END :
+ if (state != 2) {
+ fprintf(stderr,
+ "Line %d: Incomplete Colorimetric data -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ return (1);
+ case COMMENT :
+ /* Currently, do nothing. */
+ break;
+ default :
+ fprintf(stderr,
+ "Line %d: Unexpected keyword %s\n",
+ linenum, keyword);
+ return (0);
+/* NOTREACHED */break;
+ }
+ } else if (ntok < 0) {
+ /* mismatch */
+ fprintf(stderr, "Line %d: Unrecognized keyword\n", linenum);
+ return (0);
+/* NOTREACHED */break;
+ }
+ }
+ return (0);
+}
+
+static int
+ProcessIProfile(stream, pCorrection)
+ FILE *stream;
+ XDCCC_Correction* pCorrection;
+{
+ char buf[BUFSIZ];
+ char *keyword;
+ char *tableStr, *sizeStr, *ptoken;
+ int size;
+ int state = 0;
+ /************************************************
+ * 0 -- Looking for Intensity Table(s) *
+ * 1 -- Processing Intensity Table(s) *
+ ************************************************/
+ int nTbl = 0;
+ int count = 0;
+ IntensityRec *pIRec = NULL;
+
+ while ((nextline(buf, BUFSIZ, stream)) != NULL) {
+ ptoken = keyword = strtok(buf, DATA_DELIMS);
+ if (keyword != (char*)NULL) {
+ switch (SCKeyOf(keyword)) {
+ case ITBL_BEGIN :
+ if (state != 0) {
+ fprintf(stderr,"Line %d: unexpected keyword %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ tableStr = strtok((char*)NULL, DATA_DELIMS);
+ sizeStr = strtok((char*)NULL, DATA_DELIMS);
+ if ((sizeStr == (char*)NULL) ||
+ sscanf(sizeStr, "%d", &size) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid Intensity Table size, %s.\n",
+ linenum, sizeStr);
+ return (0);
+ }
+ if (size < 0) {
+ fprintf(stderr,
+ "Line %d: count %d < 0 for Intensity Table.\n",
+ linenum, size);
+ return (0);
+ }
+ if (strcmp(tableStr, "GREEN") == 0) {
+ if (pCorrection->nTables != 3) {
+ fprintf(stderr,"Line %d: incorrect number of tables\n",
+ linenum);
+ return (0);
+ }
+ if (pCorrection->pGreenTbl->pBase != NULL) {
+ fprintf(stderr,
+ "Line %d: multiple GREEN Intensity Profiles\n",
+ linenum);
+ return (0);
+ }
+ pCorrection->pGreenTbl->nEntries = size;
+ pCorrection->pGreenTbl->pBase =
+ (IntensityRec *) calloc (size, sizeof(IntensityRec));
+ if (!pCorrection->pGreenTbl->pBase) {
+ fprintf(stderr,
+ "Line %d: Unable to allocate space for GREEN Intensity Profile\n", linenum);
+ return (0);
+ }
+ pIRec = pCorrection->pGreenTbl->pBase;
+ } else if (strcmp(tableStr, "BLUE") == 0) {
+ if (pCorrection->nTables != 3) {
+ fprintf(stderr,
+ "Line %d: incorrect number of tables\n",
+ linenum);
+ return (0);
+ }
+ if (pCorrection->pBlueTbl->pBase != NULL) {
+ fprintf(stderr,
+ "Line %d: multiple BLUE Intensity Profiles\n",
+ linenum);
+ return (0);
+ }
+ pCorrection->pBlueTbl->nEntries = size;
+ pCorrection->pBlueTbl->pBase =
+ (IntensityRec *) calloc (size, sizeof(IntensityRec));
+ if (!pCorrection->pBlueTbl->pBase) {
+ fprintf(stderr,
+ "Line %d: Unable to allocate space for BLUE Intensity Profile\n", linenum);
+ return (0);
+ }
+ pIRec = pCorrection->pBlueTbl->pBase;
+ } else {
+ if (!strcmp(tableStr, "RGB") && pCorrection->nTables != 1) {
+ fprintf(stderr,"Line %d: multiple RGB Intensity Tables",
+ linenum);
+ return (0);
+ }
+ if (pCorrection->pRedTbl->pBase != NULL) {
+ fprintf(stderr,
+ "Line %d: multiple RED or GREEN or BLUE Intensity Tables\n",
+ linenum);
+ return (0);
+ }
+ pCorrection->pRedTbl->nEntries = size;
+ pCorrection->pRedTbl->pBase =
+ (IntensityRec *) calloc (size, sizeof(IntensityRec));
+ if (!pCorrection->pRedTbl->pBase) {
+ fprintf(stderr,
+ "Line %d: Unable to allocate space for intensity table\n", linenum);
+ return (0);
+ }
+ pIRec = pCorrection->pRedTbl->pBase;
+ }
+ state = 1;
+ count = 0;
+ break;
+ case ITBL_END :
+ if ((state != 1) || (count != size)) {
+ fprintf(stderr,
+ "Line %d: incomplete Intensity Table -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ nTbl++;
+ state = 0;
+ break;
+ case DATA :
+ do {
+ /********************************************************
+ * Note: tableType should only be 0 or 1 at this point.
+ * 0 indicates value and intensity stored.
+ * 1 indicates only intensity stored.
+ ********************************************************/
+ if (pCorrection->tableType) {
+ if (sscanf(ptoken, "%lf", &pIRec->intensity) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid Intensity Profile value %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+ /* With tableType 1 only store the intensity. */
+ pIRec++;
+ } else {
+#if __STDC__
+ /* Note ansi C can handle 0x preceeding hex number */
+ if (sscanf(ptoken, "%hi", &pIRec->value) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid Intensity Profile value %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+#else
+ if (*ptoken == '0' &&
+ ((*(ptoken+1) == 'x') || (*(ptoken+1) == 'X') ))
+ ptoken += 2;
+ if (sscanf(ptoken, "%hx", &pIRec->value) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid Intensity Profile value %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+#endif
+ if ((ptoken = strtok(NULL, DATA_DELIMS)) == NULL) {
+ fprintf(stderr,
+ "Line %d: missing Intensity Profile value\n",
+ linenum);
+ return (0);
+ }
+ if (sscanf(ptoken, "%lf", &pIRec->intensity) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid Intensity Profile intensity %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+ /* With tableType 0 only store both value & intensity*/
+ pIRec++;
+ }
+ if (++count > size) {
+ fprintf(stderr,
+ "Line %d: extra Intensity value %s\n",
+ linenum, ptoken);
+ return (0);
+ }
+ ptoken = strtok(NULL, DATA_DELIMS);
+ } while(ptoken != NULL);
+ break;
+ case IPROFILE_BEGIN :
+ fprintf(stderr,"Line %d: extraneous keyword %s\n",
+ linenum, keyword);
+ return (0);
+/* NOTREACHED */break;
+ case IPROFILE_END :
+ if ((state != 0) || (nTbl != pCorrection->nTables)) {
+ fprintf(stderr,
+ "Line %d: incomplete Intensity Profile data -- Premature %s\n",
+ linenum, keyword);
+ return (0);
+ }
+ return (1);
+ case COMMENT :
+ /* ignore line */
+ break;
+ default :
+ fprintf(stderr,"Line %d: unexpected keyword %s\n",
+ linenum, keyword);
+ return (0);
+/* NOTREACHED */break;
+ }
+ } /* else its was just a blank line */
+ }
+ return (0);
+}
+
+static void
+PutTableType0Card8(pTbl, pCard8)
+ IntensityTbl *pTbl;
+ unsigned char **pCard8;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard8 = count - 1;
+ *pCard8 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard8 = pIRec->value >> 8;
+ *pCard8 += 1;
+ **pCard8 = pIRec->intensity * 255.0;
+ *pCard8 += 1;
+ }
+}
+
+static void
+PutTableType1Card8(pTbl, pCard8)
+ IntensityTbl *pTbl;
+ unsigned char **pCard8;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard8 = count - 1;
+ *pCard8 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard8 = pIRec->intensity * 255.0;
+ *pCard8 += 1;
+ }
+}
+
+static void
+PutTableType0Card16(pTbl, pCard16)
+ IntensityTbl *pTbl;
+ unsigned short **pCard16;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard16 = count - 1;
+ *pCard16 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard16 = pIRec->value;
+ *pCard16 += 1;
+ **pCard16 = pIRec->intensity * 65535.0;
+ *pCard16 += 1;
+ }
+}
+
+static void
+PutTableType1Card16(pTbl, pCard16)
+ IntensityTbl *pTbl;
+ unsigned short **pCard16;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard16 = count - 1;
+ *pCard16 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard16 = pIRec->intensity * 65535.0;
+ *pCard16 += 1;
+ }
+}
+
+static void
+PutTableType0Card32(pTbl, pCard32)
+ IntensityTbl *pTbl;
+ unsigned long **pCard32;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard32 = count - 1;
+ *pCard32 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard32 = pIRec->value;
+ *pCard32 += 1;
+ **pCard32 = pIRec->intensity * 4294967295.0;
+ *pCard32 += 1;
+ }
+}
+
+static void
+PutTableType1Card32(pTbl, pCard32)
+ IntensityTbl *pTbl;
+ unsigned long **pCard32;
+{
+ unsigned int count;
+ IntensityRec *pIRec;
+
+ pIRec = pTbl->pBase;
+ count = pTbl->nEntries;
+ **pCard32 = count - 1;
+ *pCard32 += 1;
+ for (; count; count--, pIRec++) {
+ **pCard32 = pIRec->intensity * 4294967295.0;
+ *pCard32 += 1;
+ }
+}
+
+
+static void
+LoadMatrix(pDpy, root, pMatrix)
+ Display *pDpy;
+ Window root;
+ XDCCC_Matrix *pMatrix;
+{
+ int count;
+ unsigned long *pCard32;
+ unsigned long Card32Array[18];
+ Atom MatricesAtom;
+ XcmsFloat *pValue;
+
+ /*
+ * Store the XDCCC_LINEAR_RGB_MATRICES
+ */
+ pCard32 = Card32Array;
+ pValue = (XcmsFloat *)pMatrix->XYZtoRGBmatrix;
+ for (count = 0; count < 9; count++) {
+ *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER);
+ }
+ pValue = (XcmsFloat *)pMatrix->RGBtoXYZmatrix;
+ for (count = 0; count < 9; count++) {
+ *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER);
+ }
+ MatricesAtom = XInternAtom (pDpy, XDCCC_MATRIX_ATOM_NAME, False);
+ XChangeProperty (pDpy, root, MatricesAtom, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *)Card32Array, 18);
+}
+
+
+static int
+LoadCorrections(pDpy, root, pCorrection, targetFormat)
+ Display *pDpy;
+ Window root;
+ XDCCC_Correction *pCorrection;
+ int targetFormat;
+{
+ unsigned char *pCard8;
+ unsigned char *pCard8Array = (unsigned char *)NULL;
+ unsigned short *pCard16;
+ unsigned short *pCard16Array = (unsigned short *)NULL;
+ unsigned long *pCard32;
+ unsigned long *pCard32Array = (unsigned long *)NULL;
+ Atom CorrectAtom;
+ int total;
+ int i;
+
+ /*
+ * Store each XDCCC_CORRECTION into XDCCC_LINEAR_RGB_CORRECTION property
+ */
+ CorrectAtom = XInternAtom (pDpy, XDCCC_CORRECT_ATOM_NAME, False);
+
+ for (i = 0; pCorrection; i++, pCorrection = pCorrection->next) {
+ if ((pCorrection->tableType != 0) && (pCorrection->tableType != 1)) {
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: Invalid intensity table type %d.\n",
+ pCorrection->visual_info.visualid,
+ pCorrection->tableType);
+ } else {
+ fprintf(stderr,"Global RGB Correction: Invalid intensity table type %d.\n",
+ pCorrection->tableType);
+ }
+ return(0);
+ }
+
+ if (pCorrection->nTables != 1 && pCorrection->nTables != 3) {
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: %d invalid number of tables.\n",
+ pCorrection->visual_info.visualid,
+ pCorrection->nTables);
+ } else {
+ fprintf(stderr,"Global RGB Correction: %d invalid number of tables.\n",
+ pCorrection->nTables);
+ }
+ return(0);
+ }
+
+ if (pCorrection->nTables == 1) {
+ if (pCorrection->pRedTbl->nEntries < 2) {
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: Illegal number of entries in table\n",
+ pCorrection->visual_info.visualid);
+ } else {
+ fprintf(stderr,"Global RGB Correction: Illegal number of entries in table\n");
+ }
+ return (0);
+ }
+ switch (targetFormat) {
+ case 8:
+ total = 7 + (pCorrection->pRedTbl->nEntries *
+ (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard8 = pCard8Array = (unsigned char *) calloc (total,
+ sizeof (unsigned char))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard8++ = (pCorrection->visual_info.visualid >> 24) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid >> 16) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid >> 8) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid) & 0xFF;
+ *pCard8++ = pCorrection->tableType; /* type */
+ *pCard8++ = 1; /* number of tables = 1 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card8(pCorrection->pRedTbl, &pCard8);
+ } else {
+ PutTableType1Card8(pCorrection->pRedTbl, &pCard8);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard8Array, total);
+ free(pCard8Array);
+ break;
+ case 16:
+ total = 5 + (pCorrection->pRedTbl->nEntries *
+ (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard16 = pCard16Array = (unsigned short *) calloc (total,
+ sizeof (unsigned short))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard16++ = (pCorrection->visual_info.visualid >> 16) & 0xFFFF;
+ *pCard16++ = (pCorrection->visual_info.visualid) & 0xFFFF;
+ *pCard16++ = pCorrection->tableType; /* type */
+ *pCard16++ = 1; /* number of tables = 1 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card16(pCorrection->pRedTbl, &pCard16);
+ } else {
+ PutTableType1Card16(pCorrection->pRedTbl, &pCard16);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard16Array, total);
+ free(pCard16Array);
+ break;
+ case 32:
+ total = 4 + (pCorrection->pRedTbl->nEntries *
+ (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard32 = pCard32Array =
+ (unsigned long *) calloc (total,
+ sizeof (unsigned long))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard32++ = pCorrection->visual_info.visualid;
+ *pCard32++ = pCorrection->tableType; /* type */
+ *pCard32++ = 1; /* number of tables = 1 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card32(pCorrection->pRedTbl, &pCard32);
+ } else {
+ PutTableType1Card32(pCorrection->pRedTbl, &pCard32);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard32Array, total);
+ free(pCard32Array);
+ break;
+ default:
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: Invalid property format\n",
+ pCorrection->visual_info.visualid);
+ } else {
+ fprintf(stderr,"Global RGB Correction: Invalid property format\n");
+ }
+ return (0);
+ }
+ } else { /* pCorrection->nTables == 3 */
+ if ((pCorrection->pRedTbl->nEntries < 2) ||
+ (pCorrection->pGreenTbl->nEntries < 2) ||
+ (pCorrection->pBlueTbl->nEntries < 2)) {
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: Illegal number of entries in table\n",
+ pCorrection->visual_info.visualid);
+ } else {
+ fprintf(stderr,"Global RGB Correction: Illegal number of entries in table\n");
+ }
+ return (0);
+ }
+ switch (targetFormat) {
+ case 8:
+ total = 9 + /* visualID, type, and 3 lengths */
+ (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard8 = pCard8Array =
+ (unsigned char *) calloc (total,
+ sizeof (unsigned char))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard8++ = (pCorrection->visual_info.visualid >> 24) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid >> 16) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid >> 8) & 0xFF;
+ *pCard8++ = (pCorrection->visual_info.visualid) & 0xFF;
+ *pCard8++ = pCorrection->tableType; /* type */
+ *pCard8++ = 3; /* number of tables = 3 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card8(pCorrection->pRedTbl, &pCard8);
+ PutTableType0Card8(pCorrection->pGreenTbl, &pCard8);
+ PutTableType0Card8(pCorrection->pBlueTbl, &pCard8);
+ } else {
+ PutTableType1Card8(pCorrection->pRedTbl, &pCard8);
+ PutTableType1Card8(pCorrection->pGreenTbl, &pCard8);
+ PutTableType1Card8(pCorrection->pBlueTbl, &pCard8);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard8Array, total);
+ free(pCard8Array);
+ break;
+ case 16:
+ total = 7 + /* visualID, type, and 3 lengths */
+ (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard16 = pCard16Array =
+ (unsigned short *) calloc (total,
+ sizeof (unsigned short))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard16++ = (pCorrection->visual_info.visualid >> 16) & 0xFFFF;
+ *pCard16++ = (pCorrection->visual_info.visualid) & 0xFFFF;
+ *pCard16++ = pCorrection->tableType; /* type = 0 */
+ *pCard16++ = 3; /* number of tables = 3 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card16(pCorrection->pRedTbl, &pCard16);
+ PutTableType0Card16(pCorrection->pGreenTbl, &pCard16);
+ PutTableType0Card16(pCorrection->pBlueTbl, &pCard16);
+ } else {
+ PutTableType1Card16(pCorrection->pRedTbl, &pCard16);
+ PutTableType1Card16(pCorrection->pGreenTbl, &pCard16);
+ PutTableType1Card16(pCorrection->pBlueTbl, &pCard16);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard16Array, total);
+ free(pCard16Array);
+ break;
+ case 32:
+ total = 6 + /* visualID, type, and 3 lengths */
+ (pCorrection->pRedTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pGreenTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1)) +
+ (pCorrection->pBlueTbl->nEntries * (pCorrection->tableType == 0 ? 2 : 1));
+ if ((pCard32 = pCard32Array =
+ (unsigned long *) calloc (total,
+ sizeof (unsigned long))) == NULL) {
+ fprintf(stderr,"Unable allocate array of ints\n");
+ return (0);
+ }
+ *pCard32++ = pCorrection->visual_info.visualid;
+ *pCard32++ = pCorrection->tableType; /* type */
+ *pCard32++ = 3; /* number of tables = 3 */
+ if (pCorrection->tableType == 0) {
+ PutTableType0Card32(pCorrection->pRedTbl, &pCard32);
+ PutTableType0Card32(pCorrection->pGreenTbl, &pCard32);
+ PutTableType0Card32(pCorrection->pBlueTbl, &pCard32);
+ } else {
+ PutTableType1Card32(pCorrection->pRedTbl, &pCard32);
+ PutTableType1Card32(pCorrection->pGreenTbl, &pCard32);
+ PutTableType1Card32(pCorrection->pBlueTbl, &pCard32);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32,
+ i ? PropModeAppend : PropModeReplace,
+ (unsigned char *)pCard32Array, total);
+ free(pCard32Array);
+ break;
+ default:
+ if (pCorrection->visual_info.visualid) {
+ fprintf(stderr,"RGB Correction for visualid %d: Invalid property format\n",
+ pCorrection->visual_info.visualid);
+ } else {
+ fprintf(stderr,"Global RGB Correction: Invalid property format\n");
+ }
+ return (0);
+ }
+ }
+ }
+
+ return (1);
+}
+
+#ifdef GRAY
+
+static int
+LoadDataGray(pDpy, root, tableType, pScreenData, targetFormat)
+ Display *pDpy;
+ Window root;
+ LINEAR_RGB_SCCData *pScreenData;
+ int targetFormat;
+{
+ unsigned char *ret_prop;
+ int count;
+ int nLevels;
+ unsigned char *pCard8;
+ unsigned char *pCard8Array = (unsigned char *)NULL;
+ unsigned short *pCard16;
+ unsigned short *pCard16Array = (unsigned short *)NULL;
+ unsigned long *pCard32;
+ unsigned long *pCard32Array = (unsigned long *)NULL;
+ unsigned long Card32Array[18];
+ int ret_format;
+ unsigned long ret_len, ret_after;
+ Atom MatricesAtom, CorrectAtom, ret_atom;
+ XcmsFloat *pValue;
+ int total;
+
+ /* Now store the XDCCC_SCREENWHITEPT */
+ pCard32 = Card32Array;
+ pValue = (XcmsFloat *)pScreenData->XYZtoRGBmatrix;
+ for (count = 0; count < 3; count++) {
+ *pCard32++ = (unsigned long) (*pValue++ * (XcmsFloat) XDCCC_NUMBER);
+ }
+ MatricesAtom = XInternAtom (pDpy,XDCCC_SCREENWHITEPT_ATOM_NAME,False);
+ XChangeProperty (pDpy, root, MatricesAtom, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *)Card32Array, 3);
+
+ /* Now store the XDCCC_GRAY_CORRECTION */
+ CorrectAtom = XInternAtom (pDpy, XDCCC_GRAY_CORRECT_ATOM_NAME, False);
+
+ if (tableType == CORR_TYPE_NONE) {
+ XGetWindowProperty (pDpy, root, CorrectAtom,
+ 0, 5, False, XA_INTEGER,
+ &ret_atom, &ret_format, &ret_len, &ret_after,
+ &ret_prop);
+ if (ret_format != 0) {
+ XDeleteProperty (pDpy, root, CorrectAtom);
+ XFree ((char *)ret_prop);
+ }
+ return (1);
+ }
+ nLevels = pScreenData->pRedTbl->nEntries;
+ if (nLevels < 2) {
+ fprintf(stderr,"Illegal number of entries in table\n");
+ return (0);
+ }
+ switch (targetFormat) {
+ case 8:
+ total = 6 /* visualID, type, length */
+ + (nLevels * (tableType == 0 ? 2 : 1));
+ if ((pCard8 = pCard8Array = (unsigned char *)
+ calloc (total, sizeof (unsigned char))) == NULL) {
+ fprintf(stderr,"Unable allocate array of Card8\n");
+ return (0);
+ }
+ *pCard8++ = 0; /* VisualID = 0 */
+ *pCard8++ = 0; /* VisualID = 0 */
+ *pCard8++ = 0; /* VisualID = 0 */
+ *pCard8++ = 0; /* VisualID = 0 */
+ *pCard8++ = tableType; /* type */
+ if (tableType == 0) {
+ PutTableType0Card8(pScreenData->pRedTbl, &pCard8);
+ } else { /* tableType == 1 */
+ PutTableType1Card8(pScreenData->pRedTbl, &pCard8);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 8,
+ PropModeReplace, (unsigned char *)pCard8Array,
+ total);
+ free (pCard8Array);
+ break;
+ case 16:
+ total = 4 /* visualID, type, length */
+ + (nLevels * (tableType == 0 ? 2 : 1));
+ if ((pCard16 = pCard16Array = (unsigned short *)
+ calloc (total, sizeof (unsigned short))) == NULL) {
+ fprintf(stderr,"Unable allocate array of Card16\n");
+ return (0);
+ }
+ *pCard16++ = 0; /* VisualID = 0 */
+ *pCard16++ = 0; /* VisualID = 0 */
+ *pCard16++ = tableType; /* type */
+ if (tableType == 0) {
+ PutTableType0Card16(pScreenData->pRedTbl, &pCard16);
+ } else { /* tableType == 1 */
+ PutTableType1Card16(pScreenData->pRedTbl, &pCard16);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 16,
+ PropModeReplace, (unsigned char *)pCard16Array,
+ total);
+ free (pCard16Array);
+ break;
+ case 32:
+ total = 3 /* visualID, type, length */
+ + (nLevels * (tableType == 0 ? 2 : 1));
+ if ((pCard32 = pCard32Array = (unsigned long *)
+ calloc (total, sizeof (unsigned long))) == NULL) {
+ fprintf(stderr,"Unable allocate array of Card32\n");
+ return (0);
+ }
+ *pCard32++ = 0; /* VisualID = 0 */
+ *pCard32++ = tableType; /* type */
+ if (tableType == 0) {
+ PutTableType0Card32(pScreenData->pRedTbl, &pCard32);
+ } else { /* tableType == 1 */
+ PutTableType1Card32(pScreenData->pRedTbl, &pCard32);
+ }
+ XChangeProperty (pDpy, root, CorrectAtom, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *)pCard32Array,
+ total);
+ free (pCard32Array);
+ break;
+ default:
+ fprintf(stderr,"Invalid property format\n");
+ return (0);
+ }
+ return (1);
+}
+#endif /* GRAY */
+
+
+static void
+PrintVisualOptions(pCorrection)
+ XDCCC_Correction *pCorrection;
+{
+ if (pCorrection->visual_info_mask & VisualIDMask) {
+ fprintf(stderr, "\t%s:0x%x\n",
+ DefineToStr(VisualOptKeyTbl, KEY_VISUALID),
+ pCorrection->visual_info.visualid);
+ }
+ if (pCorrection->visual_info_mask & VisualDepthMask) {
+ fprintf(stderr, "\t%s:%d\n",
+ DefineToStr(VisualOptKeyTbl, KEY_DEPTH),
+ pCorrection->visual_info.depth);
+ }
+ if (pCorrection->visual_info_mask & VisualClassMask) {
+ fprintf(stderr, "\t%s:%s\n",
+ DefineToStr(VisualOptKeyTbl, KEY_CLASS),
+ DefineToStr(VisualClassTbl, pCorrection->visual_info.class));
+ }
+ if (pCorrection->visual_info_mask & VisualRedMaskMask) {
+ fprintf(stderr, "\t%s:0x%x\n",
+ DefineToStr(VisualOptKeyTbl, KEY_RED_MASK),
+ pCorrection->visual_info.red_mask);
+ }
+ if (pCorrection->visual_info_mask & VisualGreenMaskMask) {
+ fprintf(stderr, "\t%s:0x%x\n",
+ DefineToStr(VisualOptKeyTbl, KEY_GREEN_MASK),
+ pCorrection->visual_info.green_mask);
+ }
+ if (pCorrection->visual_info_mask & VisualBlueMaskMask) {
+ fprintf(stderr, "\t%s:0x%x\n",
+ DefineToStr(VisualOptKeyTbl, KEY_BLUE_MASK),
+ pCorrection->visual_info.blue_mask);
+ }
+ if (pCorrection->visual_info_mask & VisualColormapSizeMask) {
+ fprintf(stderr, "\t%s:0x%x\n",
+ DefineToStr(VisualOptKeyTbl, KEY_COLORMAP_SIZE),
+ pCorrection->visual_info.colormap_size);
+ }
+ if (pCorrection->visual_info_mask & VisualBitsPerRGBMask) {
+ fprintf(stderr, "\t%s:%d\n",
+ DefineToStr(VisualOptKeyTbl, KEY_BITS_PER_RGB),
+ pCorrection->visual_info.bits_per_rgb);
+ }
+}
+
+
+static int
+ParseVisualOptions(pDpy, pCorrection, pbuf)
+ Display *pDpy;
+ XDCCC_Correction *pCorrection;
+ char *pbuf;
+{
+ char *key;
+ char *value;
+ XVisualInfo *vinfo;
+ int n_matches;
+ char delims[8];
+
+ strcpy(delims, DATA_DELIMS);
+ strcat(delims, ":");
+ pCorrection->visual_info_mask = VisualNoMask;
+ key = strtok(pbuf, delims);
+ do {
+ value = strtok((char*)NULL, delims);
+ if ((key == (char*)NULL) || (value == (char*)NULL)) {
+ return (0);
+ }
+ switch (StrToDefine(VisualOptKeyTbl, key)) {
+ case KEY_VISUALID:
+ if (sscanf(value, "%li", &pCorrection->visual_info.visualid) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid VisualID specified, %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualIDMask;
+ break;
+ case KEY_DEPTH:
+ if (sscanf(value, "%i", &pCorrection->visual_info.depth) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid depth specified, %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualDepthMask;
+ break;
+ case KEY_CLASS:
+ switch (pCorrection->visual_info.class =
+ StrToDefine(VisualClassTbl, value)) {
+ case StaticColor:
+ break;
+ case PseudoColor:
+ break;
+ case TrueColor:
+ break;
+ case DirectColor:
+ break;
+ case StaticGray:
+ /* invalid, fall through */
+ case GrayScale:
+ /* invalid, fall through */
+ default:
+ fprintf(stderr,
+ "Line %d: invalid Visual Class -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualClassMask;
+ break;
+ case KEY_RED_MASK:
+ if (sscanf(value, "%li", &pCorrection->visual_info.red_mask) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid red_mask specified -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualRedMaskMask;
+ break;
+ case KEY_GREEN_MASK:
+ if (sscanf(value, "%li", &pCorrection->visual_info.green_mask) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid green_mask specified -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualGreenMaskMask;
+ break;
+ case KEY_BLUE_MASK:
+ if (sscanf(value, "%li", &pCorrection->visual_info.blue_mask) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid blue_mask specified -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualBlueMaskMask;
+ break;
+ case KEY_COLORMAP_SIZE:
+ if (sscanf(value, "%i", &pCorrection->visual_info.colormap_size) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid colormap_size specified -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualColormapSizeMask;
+ break;
+ case KEY_BITS_PER_RGB:
+ if (sscanf(value, "%i", &pCorrection->visual_info.bits_per_rgb) != 1) {
+ fprintf(stderr,
+ "Line %d: invalid bits_per_rgb specified -- %s\n",
+ linenum, value);
+ return (0);
+ }
+ pCorrection->visual_info_mask |= VisualBitsPerRGBMask;
+ break;
+ default:
+ fprintf(stderr,
+ "Line %d: invalid keyword %s\n", linenum, key);
+ return (0);
+ }
+ key = strtok((char*)NULL, delims);
+ } while (key != (char *)NULL);
+
+ vinfo = XGetVisualInfo(pDpy,
+ pCorrection->visual_info_mask,
+ &pCorrection->visual_info,
+ &n_matches);
+
+ if (!n_matches) {
+ fprintf(stderr, "Line %d: Cannot find visual matching ...\n", linenum);
+ PrintVisualOptions(pCorrection);
+ fprintf(stderr, "\n");
+ return(0);
+ }
+ if (n_matches > 1) {
+ fprintf(stderr, "Line %d: Found more than one visual matching ...\n", linenum);
+ PrintVisualOptions(pCorrection);
+ fprintf(stderr, " Using VisualId 0x%x\n", vinfo->visualid);
+ }
+ memcpy((char*)&pCorrection->visual_info, (char*)vinfo,
+ sizeof(XVisualInfo));
+ return (1);
+}
+
+
+/************************************************************************
+ * *
+ * PUBLIC ROUTINES *
+ * *
+ ************************************************************************/
+
+/*
+ * NAME
+ * LoadSCCData - Read and store the screen data
+ *
+ * SYNOPSIS
+ */
+int
+LoadSCCData(pDpy, screenNumber, filename, targetFormat)
+ Display *pDpy;
+ int screenNumber;
+ char *filename;
+ int targetFormat;
+
+/*
+ * DESCRIPTION
+ * Using the X Device Color Characterization Convention (XDCCC)
+ * read the screen data and store it on the root window of the
+ * screen.
+ *
+ * RETURNS
+ * Returns 0 if failed; otherwise 1.
+ *
+ */
+{
+ FILE *stream;
+ char *pStr;
+ char buf[BUFSIZ];
+ char *keyword, *token1, *token2, *token3;
+ int state = 0;
+ int VisualFlag = -2;
+ Window root;
+ XDCCC_Matrix matrix;
+ XDCCC_Correction* CorrectionTail = (XDCCC_Correction*)NULL;
+ XDCCC_Correction* CorrectionHead = (XDCCC_Correction*)NULL;
+ XDCCC_Correction* pCurrent;
+
+ if (screenNumber < 0) {
+ fprintf(stderr,"Invalid Screen Number %d\n", screenNumber);
+ return(0);
+ }
+ root = RootWindow(pDpy, screenNumber);
+
+ if (!root) {
+ /* if no root window is available then return an error */
+ fprintf(stderr,"Could not open root window supplied.\n ");
+ return (0);
+ }
+ /*
+ * Open the file, determine its size, then read it into memory.
+ */
+ if (filename == NULL) {
+ stream = stdin;
+ filename = "stdin";
+ } else if ((stream = fopen(filename, "r")) == NULL) {
+ fprintf(stderr,"Could not open file %s.\n", filename);
+ return (0);
+ }
+
+ /*
+ * Advance to starting keyword
+ * Anything before this keyword is just treated as comments.
+ */
+
+ while((pStr = nextline(buf, BUFSIZ, stream)) != NULL) {
+ keyword = strtok(buf, DATA_DELIMS);
+ if (keyword != (char *)NULL &&
+ (strcmp(keyword, SC_BEGIN_KEYWORD) == 0)) {
+ break;
+ } /* else ignore the line */
+ }
+
+ if (pStr == NULL) {
+ fprintf(stderr,"File %s is missing %s\n", filename, SC_BEGIN_KEYWORD);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ token1 = strtok((char*)NULL, DATA_DELIMS);
+ if ((strcmp(token1, TXT_FORMAT_VERSION) != 0) &&
+ (strcmp(token1, "0.3") != 0)) {
+ fprintf(stderr,
+ "Screen data format version mismatch in file %s-- expected %s, found %s\n",
+ filename, TXT_FORMAT_VERSION, token1);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ while ((pStr = nextline(buf, BUFSIZ, stream)) != NULL) {
+ token1 = token2 = token3 = (char*)NULL;
+ keyword = strtok(buf, DATA_DELIMS);
+ if (keyword != (char*)NULL) {
+ switch (SCKeyOf(keyword)) {
+ case COMMENT :
+ case NAME :
+ case PART_NUMBER :
+ case MODEL :
+ case SERIAL_NUMBER :
+ case REVISION :
+ /* Do nothing */
+ break;
+ case SCREEN_CLASS :
+ token1 = strtok((char*)NULL, DATA_DELIMS);
+ token2 = strtok((char*)NULL, DATA_DELIMS);
+ if ((token1 == (char*)NULL)
+ || ((VisualFlag = SCScrnClassOf(token1)) == -1)) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ /*include code to handle screen number input*/
+ if (token2 != (char*)NULL) {
+ screenNumber = atoi(token2);
+
+ if (screenNumber < 0) {
+ fprintf(stderr,"Invalid Screen Number %d\n",
+ screenNumber);
+ }
+ else {
+ root = RootWindow(pDpy, screenNumber);
+ if (!root) {
+ /* if no root window is available then return an error */
+ fprintf(stderr,
+ "Could not open root window supplied.\n ");
+ return (0);
+ }
+ }
+ }
+ break;
+ case COLORIMETRIC_BEGIN :
+ if (VisualFlag == -2) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ if (!ProcessColorimetric(stream,
+ &matrix, VisualFlag)) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ state |= 0x02;
+ break;
+ case IPROFILE_BEGIN :
+ if (VisualFlag == -2) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ token1 = strtok((char*)NULL, DATA_DELIMS);
+ token2 = strtok((char*)NULL, DATA_DELIMS);
+ if ((token1 == (char*)NULL) || (token2 == (char*)NULL)) {
+ fprintf(stderr,
+ "Line %d: Intensity profile missing TableType and/or nTables.",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ if ((pCurrent = (XDCCC_Correction *)
+ calloc(1, sizeof(XDCCC_Correction))) ==NULL) {
+ fprintf(stderr,
+ "Line %d: Could not allocate memory for intensity profile.",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ if (sscanf(token1, "%d", &pCurrent->tableType) != 1 ||
+ (pCurrent->tableType < 0 || pCurrent->tableType > 1)) {
+ fprintf(stderr,
+ "Line %d: invalid table type specified -- %s\n",
+ linenum, buf);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ if ((VisualFlag == VIDEO_RGB) && (token2 == (char *)NULL)) {
+ fprintf(stderr,
+ "Line %d: invalid number of tables specified -- %s\n",
+ linenum, buf);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+
+ if (VisualFlag == VIDEO_RGB) {
+ if (sscanf(token2, "%d", &pCurrent->nTables) != 1 ||
+ (pCurrent->nTables != 0 && pCurrent->nTables != 1
+ && pCurrent->nTables != 3)) {
+ fprintf(stderr,
+ "Line %d: invalid number of tables (must be 0, 1, or 3)\n",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ } else {
+ pCurrent->nTables = 0;
+ }
+
+ token3 = strtok((char*)NULL, "\n");
+ if (token3 != (char*)NULL) {
+ if (!ParseVisualOptions(pDpy, pCurrent, token3)) {
+ goto ByPassThisIProfile;
+ }
+ }
+
+ switch (pCurrent->nTables) {
+ case 3 :
+ if (!(pCurrent->pRedTbl = (IntensityTbl *)
+ calloc (1, sizeof (IntensityTbl)))) {
+ fprintf(stderr,
+ "Line %d: Could not allocate Red Intensity Table\n",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ if (!(pCurrent->pGreenTbl = (IntensityTbl *)
+ calloc (1, sizeof (IntensityTbl)))) {
+ fprintf(stderr,
+ "Line %d: Could not allocate Green Intensity Table\n",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ if (!(pCurrent->pBlueTbl = (IntensityTbl *)
+ calloc (1, sizeof (IntensityTbl)))) {
+ fprintf(stderr,
+ "Line %d: Could not allocate Blue Intensity Table",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ if (!ProcessIProfile(stream, pCurrent)) {
+ goto ByPassThisIProfile;
+ }
+ break;
+ case 1 :
+ if (!(pCurrent->pRedTbl = (IntensityTbl *)
+ calloc (1, sizeof (IntensityTbl)))) {
+ fprintf(stderr,
+ "Line %d: Could not allocate Red Intensity Table",
+ linenum);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ pCurrent->pGreenTbl = pCurrent->pRedTbl;
+ pCurrent->pBlueTbl = pCurrent->pRedTbl;
+ if (!ProcessIProfile(stream, pCurrent)) {
+ goto ByPassThisIProfile;
+ }
+ break;
+ default :
+ /* do nothing */
+ break;
+ }
+
+ if (CorrectionHead == NULL) {
+ CorrectionHead = CorrectionTail = pCurrent;
+ } else {
+ CorrectionTail->next = pCurrent;
+ CorrectionTail = pCurrent;
+ }
+ state |= 0x04;
+ break;
+ByPassThisIProfile:
+ /* read till INTENSITY_PROFILE_END */
+ while ((pStr = nextline(buf, BUFSIZ, stream)) != NULL) {
+ keyword = strtok(buf, DATA_DELIMS);
+ if (keyword != (char*)NULL) {
+ switch (SCKeyOf(keyword)) {
+ case ITBL_BEGIN:
+ case ITBL_END:
+ case COMMENT:
+ case DATA:
+ break;
+ case IPROFILE_END:
+ goto IProfileProcessed;
+ default:
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ }
+ }
+ free(pCurrent);
+IProfileProcessed:
+ state |= 0x04;
+ break;
+ case SC_END :
+ if (!(state & 0x02)) {
+ fprintf(stderr,
+ "File %s is missing Colorimetric data.\n",
+ filename);
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+ if (!(state & 0x04)) {
+ fprintf(stderr,
+ "File %s is missing Intensity Profile Data.\n",
+ filename);
+ }
+ if (VisualFlag == VIDEO_RGB) {
+ LoadMatrix(pDpy, root, &matrix);
+ if (!LoadCorrections(pDpy, root, CorrectionHead,
+ targetFormat)) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+#ifdef GRAY
+ } else if (VisualFlag == VIDEO_GRAY) {
+ if (!LoadDataGray(pDpy, root,
+ pCurrent->tableType, pScreenData, targetFormat)) {
+ closeS (stream, CorrectionHead);
+ return (0);
+ }
+#endif /* GRAY */
+ } else {
+ fprintf(stderr,"File %s Visual missing.", filename);
+ }
+ closeS (stream, CorrectionHead);
+ return (1);
+/* NOTREACHED */ break;
+ default :
+ fprintf(stderr,"Line %d: extraneous keyword %s\n",
+ linenum, keyword);
+ closeS (stream, CorrectionHead);
+ return (0);
+
+ }
+ } /* else it was just a blank line */
+ }
+ closeS (stream, CorrectionHead);
+ return (1);
+}
diff --git a/xcmsdb.c b/xcmsdb.c
new file mode 100644
index 0000000..441e567
--- /dev/null
+++ b/xcmsdb.c
@@ -0,0 +1,888 @@
+/* $Xorg: xcmsdb.c,v 1.3 2000/08/17 19:54:13 cpqbld Exp $ */
+
+/*
+ * (c) Copyright 1990 Tektronix Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix be liable for any special, indirect or consequential damages or
+ * any damages whatsoever resulting from loss of use, data or profits,
+ * whether in an action of contract, negligence or other tortious action,
+ * arising out of or in connection with the use or performance of this
+ * software.
+ *
+ *
+ * NAME
+ * xcmsdb.c
+ *
+ * DESCRIPTION
+ * Program to load, query or remove the Screen Color
+ * Characterization Data from the root window of the screen.
+ *
+ */
+
+/*
+ * INCLUDES
+ */
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include <ctype.h>
+
+#include "SCCDFile.h"
+
+static unsigned long _XcmsGetElement();
+static int _XcmsGetProperty();
+
+char *ProgramName;
+
+void Syntax ()
+{
+ fprintf (stderr,
+ "usage: %s [-options ...] [filename]\n\n",
+ ProgramName);
+ fprintf (stderr,
+ "where options include:\n");
+ fprintf (stderr,
+ " -display host:dpy[.scrn] display to use\n");
+ fprintf (stderr,
+ " -format [ 32 | 16 | 8 ] property format\n");
+ fprintf (stderr,
+ " -query query Screen Color Characterization Data\n");
+ fprintf (stderr,
+ " -remove remove Screen Color Characterization Data\n");
+#ifdef GRAY
+ fprintf (stderr,
+ " -color use color as default\n");
+ fprintf (stderr,
+ " -gray use gray-scale as default\n");
+#endif /* GRAY */
+ fprintf (stderr,
+ "\n");
+ exit (1);
+}
+
+static Bool optionmatch (opt, arg, minlen)
+ char *opt;
+ char *arg;
+ int minlen;
+{
+ int arglen;
+
+ if (strcmp(opt, arg) == 0) {
+ return(True);
+ }
+
+ if ((arglen = strlen(arg)) >= (int)strlen(opt) || arglen < minlen) {
+ return(False);
+ }
+
+ if (strncmp (opt, arg, arglen) == 0) {
+ return(True);
+ }
+
+ return(False);
+}
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ Display *dpy;
+ int i;
+ char *displayname = NULL;
+ char *filename = NULL;
+ int query = 0;
+ int remove = 0;
+ int load = 0;
+ int color = -1;
+ int targetFormat = 32;
+
+ ProgramName = argv[0];
+
+ for (i = 1; i < argc; i++) {
+ char *arg = argv[i];
+
+ if (arg[0] == '-') {
+ if (arg[1] == '\0') {
+ filename = NULL;
+ continue;
+ } else if (optionmatch ("-help", arg, 1)) {
+ Syntax ();
+ /* doesn't return */
+ } else if (optionmatch ("-display", arg, 1)) {
+ if (++i >= argc) Syntax ();
+ displayname = argv[i];
+ continue;
+ } else if (optionmatch ("-format", arg, 1)) {
+ if (++i >= argc) Syntax ();
+ targetFormat = atoi(argv[i]);
+ if (targetFormat != 32 && targetFormat != 16 &&
+ targetFormat != 8) Syntax();
+ continue;
+ } else if (optionmatch ("-query", arg, 1)) {
+ query = 1;
+ continue;
+ } else if (optionmatch ("-remove", arg, 1)) {
+ remove = 1;
+ continue;
+#ifdef GRAY
+ } else if (optionmatch ("-color", arg, 1)) {
+ color = 1;
+ continue;
+ } else if (optionmatch ("-gray", arg, 1)) {
+ color = 0;
+ continue;
+#endif /* GRAY */
+ }
+ Syntax ();
+ } else {
+ load = 1;
+ filename = arg;
+ }
+ }
+
+ /* Open display */
+ if (!(dpy = XOpenDisplay (displayname))) {
+ fprintf (stderr, "%s: Can't open display '%s'\n",
+ ProgramName, XDisplayName(displayname));
+ exit (1);
+ }
+
+ if (load && query) {
+ load = 0;
+ }
+ if (load && remove) {
+ load = 0;
+ }
+
+ if (!query && !remove) {
+ LoadSCCData(dpy, DefaultScreen(dpy), filename, targetFormat);
+ }
+
+ if (query) {
+ if (color != 0)
+ QuerySCCDataRGB(dpy, RootWindow(dpy, DefaultScreen(dpy)));
+#ifdef GRAY
+ if (color != 1)
+ QuerySCCDataGray(dpy, RootWindow(dpy, DefaultScreen(dpy)));
+#endif /* GRAY */
+ }
+
+ if (remove) {
+ RemoveSCCData(dpy, RootWindow(dpy, DefaultScreen(dpy)), color);
+ }
+
+ XCloseDisplay(dpy);
+ exit (0);
+ /*NOTREACHED*/
+}
+
+
+Atom
+ParseAtom (dpy, name, only_flag)
+ Display *dpy;
+ char *name;
+ int only_flag;
+{
+ return(XInternAtom(dpy, name, only_flag));
+}
+
+
+/*
+ * NAME
+ * PrintTableType0
+ *
+ * SYNOPSIS
+ */
+static void
+PrintTableType0(format, pChar, pCount)
+ int format;
+ char **pChar;
+ unsigned long *pCount;
+/*
+ * DESCRIPTION
+ *
+ * RETURNS
+ * XcmsFailure if failed.
+ * XcmsSuccess if succeeded.
+ *
+ */
+{
+ unsigned int nElements;
+ unsigned short hValue;
+ XcmsFloat fValue;
+
+ nElements = _XcmsGetElement(format, pChar, pCount) + 1;
+ printf ("\t length:%d\n", nElements);
+
+ switch (format) {
+ case 8:
+ while (nElements--) {
+ /* 0xFFFF/0xFF = 0x101 */
+ hValue = _XcmsGetElement (format, pChar, pCount) * 0x101;
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)255.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ case 16:
+ while (nElements--) {
+ hValue = _XcmsGetElement (format, pChar, pCount);
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)65535.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ case 32:
+ while (nElements--) {
+ hValue = _XcmsGetElement (format, pChar, pCount);
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)4294967295.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ default:
+ return;
+ }
+}
+
+
+/*
+ * NAME
+ * PrintTableType1
+ *
+ * SYNOPSIS
+ */
+static void
+PrintTableType1(format, pChar, pCount)
+ int format;
+ char **pChar;
+ unsigned long *pCount;
+/*
+ * DESCRIPTION
+ *
+ * RETURNS
+ * XcmsFailure if failed.
+ * XcmsSuccess if succeeded.
+ *
+ */
+{
+ int count;
+ unsigned int max_index;
+ unsigned short hValue;
+ XcmsFloat fValue;
+
+ max_index = _XcmsGetElement(format, pChar, pCount);
+ printf ("\t length:%d\n", max_index + 1);
+
+ switch (format) {
+ case 8:
+ for (count = 0; count < max_index+1; count++) {
+ hValue = (count * 65535) / max_index;
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)255.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ case 16:
+ for (count = 0; count < max_index+1; count++) {
+ hValue = (count * 65535) / max_index;
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)65535.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ case 32:
+ for (count = 0; count < max_index+1; count++) {
+ hValue = (count * 65535) / max_index;
+ fValue = _XcmsGetElement (format, pChar, pCount)
+ / (XcmsFloat)4294967295.0;
+ printf ("\t\t0x%x\t%8.5lf\n", hValue, fValue);
+ }
+ break;
+ default:
+ return;
+ }
+}
+
+
+/*
+ * NAME
+ * QuerySCCData - Query for the SCC data on the root window
+ *
+ * SYNOPSIS
+ */
+int
+QuerySCCDataRGB(dpy, root)
+ Display *dpy;
+ Window root;
+/*
+ * DESCRIPTION
+ *
+ * RETURNS
+ * None
+ */
+{
+ char *property_return, *pChar;
+ int i, j;
+ int count, format, cType, nTables;
+ unsigned long nitems, nbytes_return;
+ Atom MatricesAtom, CorrectAtom;
+ VisualID visualID;
+ XVisualInfo vinfo_template, *vinfo_ret;
+ int nvis;
+ static char *visual_strings[] = {
+ "StaticGray",
+ "GrayScale",
+ "StaticColor",
+ "PseudoColor",
+ "TrueColor",
+ "DirectColor"
+ };
+
+ /*
+ * Get Matrices
+ */
+ MatricesAtom = ParseAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);
+ if (MatricesAtom != None) {
+ if (_XcmsGetProperty (dpy, root, MatricesAtom, &format, &nitems,
+ &nbytes_return, &property_return) == XcmsFailure) {
+ format = 0;
+ } else if (nitems != 18) {
+ printf ("Property %s had invalid length of %d\n",
+ XDCCC_MATRIX_ATOM_NAME, nitems);
+ if (property_return) {
+ XFree (property_return);
+ }
+ return;
+ }
+ }
+ if (MatricesAtom == None || !format) {
+ printf ("Could not find property %s\n", XDCCC_MATRIX_ATOM_NAME);
+ } else if (format != 32) {
+ printf ("Data in property %s not in 32 bit format\n",
+ XDCCC_MATRIX_ATOM_NAME);
+ } else {
+ pChar = property_return;
+ printf ("Screen: %d\n", DefaultScreen(dpy));
+ printf ("Querying property %s\n", XDCCC_MATRIX_ATOM_NAME);
+ printf ("\tXYZtoRGB matrix :\n");
+ for (i = 0; i < 3; i++) {
+ printf ("\t");
+ for (j = 0; j < 3; j++) {
+ printf ("\t%8.5lf",
+ (long)_XcmsGetElement(format, &pChar, &nitems)
+ / (XcmsFloat) XDCCC_NUMBER);
+ }
+ printf ("\n");
+ }
+ printf ("\tRGBtoXYZ matrix :\n");
+ for (i = 0; i < 3; i++) {
+ printf ("\t");
+ for (j = 0; j < 3; j++) {
+ printf ("\t%8.5lf",
+ (long) _XcmsGetElement(format, &pChar, &nitems)
+ / (XcmsFloat) XDCCC_NUMBER);
+ }
+ printf ("\n");
+ }
+ XFree (property_return);
+ }
+
+
+ /*
+ * Get Intensity Tables
+ */
+ CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);
+ if (CorrectAtom != None) {
+ if (_XcmsGetProperty (dpy, root, CorrectAtom, &format, &nitems,
+ &nbytes_return, &property_return) == XcmsFailure) {
+ format = 0;
+ } else if (nitems <= 0) {
+ printf ("Property %s had invalid length of %d\n",
+ XDCCC_CORRECT_ATOM_NAME, nitems);
+ if (property_return) {
+ XFree (property_return);
+ }
+ return;
+ }
+ }
+ if (CorrectAtom == None || !format) {
+ printf ("Could not find property %s\n", XDCCC_CORRECT_ATOM_NAME);
+ } else {
+ printf ("\nQuerying property %s\n", XDCCC_CORRECT_ATOM_NAME);
+ pChar = property_return;
+
+ while (nitems) {
+ switch (format) {
+ case 8:
+ /*
+ * Must have at least:
+ * VisualID0
+ * VisualID1
+ * VisualID2
+ * VisualID3
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 9) {
+ goto IntensityTblError;
+ }
+ count = 3;
+ break;
+ case 16:
+ /*
+ * Must have at least:
+ * VisualID0
+ * VisualID3
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 7) {
+ goto IntensityTblError;
+ }
+ count = 1;
+ break;
+ case 32:
+ /*
+ * Must have at least:
+ * VisualID0
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 6) {
+ goto IntensityTblError;
+ }
+ count = 0;
+ break;
+ default:
+ goto IntensityTblError;
+ }
+
+ /*
+ * Get VisualID
+ */
+ visualID = _XcmsGetElement(format, &pChar, &nitems);
+ /* add the depth, class, and bits info in output */
+ vinfo_template.visualid = visualID;
+ vinfo_ret = XGetVisualInfo(dpy, VisualIDMask, &vinfo_template,
+ &nvis);
+ while (count--) {
+ visualID = visualID << format;
+ visualID |= _XcmsGetElement(format, &pChar, &nitems);
+ }
+
+ if (vinfo_ret != NULL) {
+ printf
+ ("\n\tVisualID: 0x%lx class: %s depth: %d bits_per_rgb: %d\n",
+ visualID, visual_strings[vinfo_ret->class],
+ vinfo_ret->depth, vinfo_ret->bits_per_rgb);
+ }
+ else
+ printf ("\n\tVisualID: 0x%lx\n", visualID);
+ XFree(vinfo_ret);
+ cType = _XcmsGetElement(format, &pChar, &nitems);
+ printf ("\ttype: %d\n", cType);
+ nTables = _XcmsGetElement(format, &pChar, &nitems);
+ printf ("\tcount: %d\n", nTables);
+
+ switch (cType) {
+ case 0:
+ /* Red Table should always exist */
+ printf ("\tRed Conversion Table:\n");
+ PrintTableType0(format, &pChar, &nitems);
+ if (nTables > 1) {
+ printf ("\tGreen Conversion Table:\n");
+ PrintTableType0(format, &pChar, &nitems);
+ printf ("\tBlue Conversion Table:\n");
+ PrintTableType0(format, &pChar, &nitems);
+ }
+ break;
+ case 1:
+ /* Red Table should always exist */
+ printf ("\tRed Conversion Table:\n");
+ PrintTableType1(format, &pChar, &nitems);
+ if (nTables > 1) {
+ printf ("\tGreen Conversion Table:\n");
+ PrintTableType1(format, &pChar, &nitems);
+ printf ("\tBlue Conversion Table:\n");
+ PrintTableType1(format, &pChar, &nitems);
+ }
+ break;
+ default:
+ goto IntensityTblError;
+ }
+ }
+ XFree (property_return);
+ }
+ return;
+
+IntensityTblError:
+ XFree (property_return);
+ printf("Fatal error in %s property\n", XDCCC_CORRECT_ATOM_NAME);
+}
+
+
+#ifdef GRAY
+
+/*
+ * NAME
+ * QuerySCCDataGray - Query for the SCC data on the root window
+ *
+ * SYNOPSIS
+ */
+int
+QuerySCCDataGray(dpy, root)
+ Display *dpy;
+ Window root;
+/*
+ * DESCRIPTION
+ *
+ * RETURNS
+ * None
+ */
+{
+ char *property_return, *pChar;
+ int j;
+ int count, format, cType;
+ unsigned long nitems, nbytes_return;
+ Atom MatricesAtom, CorrectAtom;
+ VisualID visualID;
+
+ MatricesAtom = ParseAtom (dpy, XDCCC_SCREENWHITEPT_ATOM_NAME, True);
+ if (MatricesAtom != None) {
+ if (_XcmsGetProperty (dpy, root, MatricesAtom, &format, &nitems,
+ &nbytes_return, &property_return) == XcmsFailure) {
+ format = 0;
+ } else if (nitems != 3) {
+ printf ("Property %s had invalid length of %d\n",
+ XDCCC_SCREENWHITEPT_ATOM_NAME, nitems);
+ if (property_return) {
+ XFree (property_return);
+ }
+ return;
+ }
+ }
+ if (MatricesAtom == None || !format) {
+ printf ("Could not find property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
+ } else {
+ pChar = property_return;
+ printf ("\nQuerying property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
+ printf ("\tWhite Point XYZ :\n");
+ printf ("\t");
+ for (j = 0; j < 3; j++) {
+ printf ("\t%8.5lf",
+ (long) _XcmsGetElement(format, &pChar, &nitems) /
+ (XcmsFloat) XDCCC_NUMBER);
+ }
+ printf ("\n");
+ XFree (property_return);
+ }
+
+ CorrectAtom = XInternAtom (dpy, XDCCC_GRAY_CORRECT_ATOM_NAME, True);
+ if (CorrectAtom != None) {
+ if (_XcmsGetProperty (dpy, root, CorrectAtom, &format, &nitems,
+ &nbytes_return, &property_return) == XcmsFailure) {
+ format = 0;
+ } else if (nitems <= 0) {
+ printf ("Property %s had invalid length of %d\n",
+ XDCCC_GRAY_CORRECT_ATOM_NAME, nitems);
+ if (property_return) {
+ XFree (property_return);
+ }
+ return;
+ }
+ }
+ if (CorrectAtom == None || !format) {
+ printf ("Could not find property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
+ } else {
+ printf ("\nQuerying property %s\n\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
+ pChar = property_return;
+
+ while (nitems) {
+ switch (format) {
+ case 8:
+ /*
+ * Must have at least:
+ * VisualID0
+ * VisualID1
+ * VisualID2
+ * VisualID3
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 9) {
+ goto IntensityTblError;
+ }
+ count = 3;
+ break;
+ case 16:
+ /*
+ * Must have at least:
+ * VisualID0
+ * VisualID3
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 7) {
+ goto IntensityTblError;
+ }
+ count = 1;
+ break;
+ case 32:
+ /*
+ * Must have at least:
+ * VisualID0
+ * type
+ * count
+ * length
+ * intensity1
+ * intensity2
+ */
+ if (nitems < 6) {
+ goto IntensityTblError;
+ }
+ count = 0;
+ break;
+ default:
+ goto IntensityTblError;
+ break;
+ }
+
+ /*
+ * Get VisualID
+ */
+ visualID = _XcmsGetElement(format, &pChar, &nitems);
+ while (count--) {
+ visualID = visualID << format;
+ visualID |= _XcmsGetElement(format, &pChar, &nitems);
+ }
+
+ printf ("\n\tVisualID: 0x%lx\n", visualID);
+ cType = _XcmsGetElement(format, &pChar, &nitems);
+ printf ("\ttype: %d\n", cType);
+ printf ("\tGray Conversion Table:\n");
+ switch (cType) {
+ case 0:
+ PrintTableType0(format, &pChar, &nitems);
+ break;
+ case 1:
+ PrintTableType1(format, &pChar, &nitems);
+ break;
+ default:
+ goto IntensityTblError;
+ }
+ }
+ XFree (property_return);
+ }
+ return;
+IntensityTblError:
+ XFree (property_return);
+ printf("Fatal error in %s property\n", XDCCC_CORRECT_ATOM_NAME);
+}
+#endif /* GRAY */
+
+
+/*
+ * NAME
+ * RemoveSCCData - Remove for the SCC data on the root window
+ *
+ * SYNOPSIS
+ */
+int
+RemoveSCCData(dpy, root, colorFlag)
+ Display *dpy;
+ Window root;
+ int colorFlag;
+/*
+ * DESCRIPTION
+ *
+ * RETURNS
+ * None
+ */
+{
+ unsigned char *ret_prop;
+ unsigned long ret_len, ret_after;
+ int ret_format;
+ Atom MatricesAtom, CorrectAtom, ret_atom;
+
+ if (colorFlag != 0) {
+ MatricesAtom = ParseAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);
+ if (MatricesAtom != None) {
+ XGetWindowProperty (dpy, root, MatricesAtom, 0, 8192, False,
+ XA_INTEGER, &ret_atom, &ret_format, &ret_len,
+ &ret_after, &ret_prop);
+ }
+ if (MatricesAtom == None || !ret_format) {
+ printf ("Could not find property %s\n", XDCCC_MATRIX_ATOM_NAME);
+ } else {
+ printf ("Deleting property %s\n", XDCCC_MATRIX_ATOM_NAME);
+ XDeleteProperty (dpy, root, MatricesAtom);
+ XFree ((char *)ret_prop);
+ }
+
+ CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);
+ if (CorrectAtom != None) {
+ XGetWindowProperty (dpy, root, CorrectAtom, 0, 8192, False,
+ XA_INTEGER, &ret_atom, &ret_format, &ret_len,
+ &ret_after, &ret_prop);
+ }
+ if (CorrectAtom == None || !ret_format) {
+ printf ("Could not find property %s\n", XDCCC_CORRECT_ATOM_NAME);
+ } else {
+ printf ("Deleting property %s\n", XDCCC_CORRECT_ATOM_NAME);
+ XDeleteProperty (dpy, root, CorrectAtom);
+ XFree ((char *)ret_prop);
+ }
+ }
+#ifdef GRAY
+ if (colorFlag != 1) {
+ MatricesAtom = ParseAtom (dpy, XDCCC_SCREENWHITEPT_ATOM_NAME, True);
+ if (MatricesAtom != None) {
+ XGetWindowProperty (dpy, root, MatricesAtom, 0, 8192, False,
+ XA_INTEGER, &ret_atom, &ret_format, &ret_len,
+ &ret_after, &ret_prop);
+ }
+ if (MatricesAtom == None || !ret_format) {
+ printf ("Could not find property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
+ } else {
+ printf ("Deleting property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
+ XDeleteProperty (dpy, root, MatricesAtom);
+ XFree ((char *)ret_prop);
+ }
+
+ CorrectAtom = XInternAtom (dpy, XDCCC_GRAY_CORRECT_ATOM_NAME, True);
+ if (CorrectAtom != None) {
+ XGetWindowProperty (dpy, root, CorrectAtom, 0, 8192, False,
+ XA_INTEGER, &ret_atom, &ret_format, &ret_len,
+ &ret_after, &ret_prop);
+ }
+ if (CorrectAtom == None || !ret_format) {
+ printf ("Could not find property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
+ } else {
+ printf ("Deleting property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
+ XDeleteProperty (dpy, root, CorrectAtom);
+ XFree ((char *)ret_prop);
+ }
+ }
+#endif /* GRAY */
+}
+
+static unsigned long
+_XcmsGetElement (format, pValue, pCount)
+ int format;
+ char **pValue;
+ unsigned long *pCount;
+/*
+ * DESCRIPTION
+ * Get the next element from the property and return it.
+ * Also increment the pointer the amount needed.
+ *
+ * Returns
+ * unsigned long
+ */
+{
+ unsigned long value;
+
+ switch (format) {
+ case 32:
+ value = *((unsigned long *)(*pValue)) & 0xFFFFFFFF;
+ *pValue += sizeof(unsigned long);
+ *pCount -= 1;
+ break;
+ case 16:
+ value = *((unsigned short *)(*pValue));
+ *pValue += sizeof(unsigned short);
+ *pCount -= 1;
+ break;
+ case 8:
+ value = *((unsigned char *) (*pValue));
+ *pValue += 1;
+ *pCount -= 1;
+ break;
+ default:
+ value = 0;
+ break;
+ }
+ return(value);
+}
+
+
+/*
+ * NAME
+ * _XcmsGetProperty -- Determine the existance of a property
+ *
+ * SYNOPSIS
+ */
+static int
+_XcmsGetProperty (pDpy, w, property, pFormat, pNItems, pNBytes, pValue)
+ Display *pDpy;
+ Window w;
+ Atom property;
+ int *pFormat;
+ unsigned long *pNItems;
+ unsigned long *pNBytes;
+ char **pValue;
+/*
+ * DESCRIPTION
+ *
+ * Returns
+ * 0 if property does not exist.
+ * 1 if property exists.
+ */
+{
+ char *prop_ret;
+ int format_ret;
+ long len = 6516;
+ unsigned long nitems_ret, after_ret;
+ Atom atom_ret;
+
+ while (XGetWindowProperty (pDpy, w, property, 0, len, False,
+ XA_INTEGER, &atom_ret, &format_ret,
+ &nitems_ret, &after_ret,
+ (unsigned char **)&prop_ret)) {
+ if (after_ret > 0) {
+ len += nitems_ret * (format_ret >> 3);
+ XFree (prop_ret);
+ } else {
+ break;
+ }
+ }
+ if (format_ret == 0 || nitems_ret == 0) {
+ /* the property does not exist or is of an unexpected type */
+ return(XcmsFailure);
+ }
+
+ *pFormat = format_ret;
+ *pNItems = nitems_ret;
+ *pNBytes = nitems_ret * (format_ret >> 3);
+ *pValue = prop_ret;
+ return(XcmsSuccess);
+}
diff --git a/xcmsdb.man b/xcmsdb.man
new file mode 100644
index 0000000..6c7942d
--- /dev/null
+++ b/xcmsdb.man
@@ -0,0 +1,93 @@
+.\" $Xorg: xcmsdb.man,v 1.4 2001/02/09 02:05:39 xorgcvs Exp $
+.\" Copyright 1990, Tektronix Inc.
+.\" Copyright 1993, 1998 The Open Group
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software and its
+.\" documentation for any purpose is hereby granted without fee, provided that
+.\" the above copyright notice appear in all copies and that both that
+.\" copyright notice and this permission notice appear in supporting
+.\" documentation.
+.\"
+.\" The above copyright notice and this permission notice shall be included in
+.\" all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+.\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+.\" THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+.\" WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+.\" OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+.\" SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of The Open Group shall not
+.\" be used in advertising or otherwise to promote the sale, use or other
+.\" dealing in this Software without prior written authorization from the
+.\" The Open Group.
+.TH XCMSDB 1 "Release 6.4" "X Version 11"
+.SH NAME
+xcmsdb \- Device Color Characterization utility for X Color Management System
+.SH SYNOPSIS
+.B xcmsdb
+[ \fB\-query\fP ] [ \fB\-remove\fP ]
+[ \fB\-format\032\fP|\fB16\fP|\fB8\fP ]
+[ \fIfilename\fP ]
+.SH DESCRIPTION
+.I xcmsdb
+is used to load, query, or remove Device Color Characterization data
+stored in properties on the root window of the screen as specified
+in section 7, Device Color Characterization, of the ICCCM.
+Device Color Characterization data (also called the Device Profile)
+is an integral part of Xlib's X Color Management System (Xcms), necessary
+for proper conversion of color specification between device-independent
+and device-dependent forms.
+Xcms uses 3x3 matrices stored in the XDCCC_LINEAR_RGB_MATRICES property to
+convert color specifications between CIEXYZ and RGB Intensity (XcmsRGBi, also
+referred to as linear RGB).
+Xcms then uses display gamma information stored in the
+XDCCC_LINEAR_RGB_CORRECTION property to convert color specifications between
+RGBi and RGB device (XcmsRGB, also referred to as device RGB).
+.LP
+Note that Xcms allows clients to register \fIfunction sets\fP
+in addition to its
+built-in function set for CRT color monitors. Additional function sets
+may store their device profile information in other properties in function
+set specific format.
+This utility is unaware of these non-standard properties.
+.LP
+The ASCII readable contents of
+.I filename
+(or the standard input if no input file is given)
+are appropriately transformed for storage in properties, provided the
+.B \-query
+or
+.B \-remove
+options are not specified.
+.SH "OPTIONS"
+.I xcmsdb
+program accepts the following options:
+.TP 8
+.B \-query
+This option attempts to read the XDCCC properties off the screen's root
+window.
+If successful, it transforms the data into a more readable format, then
+sends the data to standard out.
+.TP 8
+.B \-remove
+This option attempts to remove the XDCCC properties on the screen's root
+window.
+.TP 8
+\fB\-format\032\fP|\fB16\fP|\fB8\fP
+Specifies the property format (32, 16, or 8 bits per entry) for the
+XDCCC_LINEAR_RGB_CORRECTION property.
+Precision of encoded floating point values increases with the increase
+in bits per entry.
+The default is 32 bits per entry.
+.SH "SEE ALSO"
+xprop(1), Xlib documentation
+.SH ENVIRONMENT
+.TP 8
+.B DISPLAY
+to figure out which display and screen to use.
+.SH AUTHOR
+Chuck Adams, Tektronix Inc.
+Al Tabayoyon, SynChromatics Inc. (added multi-visual support)