KCMS Application Developer's Guide

Example

To call KcsUpdateProfile() successfully, the profile must contain a small number of attributes that identify the type of device the profile represents. It is assumed that the profile already contains these attributes.

An example is given of how to allocate and fill out the arguments required to call KcsUpdateProfile().


Example 4-13 KcsUpdateProfile()

#pragma ident "@(#) kcms_update.c"
 /* kcs_update.c */
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <math.h>
 #include <kcms/kcs.h>
 #include <kcms/kcstypes.h>
 #include <kcms/kcsattrb.h>

 float			Luminance_float_out[3][256];

 /* test code to check profile calibration * /
 main(int argc, char **argv)
 {
 KcsCalibrationData									*calData;
 KcsProfileDesc									x_desc, desc;
 KcsProfileId									profileid;
 KcsStatusId									status;
 KcsAttributeValue									attrValue;
 KcsErrDesc									errDesc;
 int				levels = 256, channels = 3;
 int				sizemeas, nvalues, i, j;
 FILE				*simfile;
 float				input_val;
 size_t				rc;
 
 /* Read in the measured calibration data from a file */
 /* file lum_out should be located in demo directory with this program */

 if ((simfile = fopen("lum_out", "r")) == NULL) {
 	fprintf(stderr,"cannot open output luminance file\n");
 	exit(1);
 	}

 for (i=0; i<channels; i++)
 	for (j=0; j<levels; j++)
 			Luminance_float_out[i][j] = 0.0;
 nvalues = levels * channels;
 rc = fread(Luminance_float_out, sizeof(float), nvalues, simfile);
 fclose(simfile);

 /* Fill out the measurement structures */
 sizemeas = (int) (sizeof(KcsMeasurementBase) + sizeof(long) + levels);
 		
 calData = (KcsCalibrationData *) malloc(sizemeas);

 calData->base.countSupplied = levels;
 calData->base.numInComp = 3;
 calData->base.numOutComp = 3;
 calData->base.inputSpace = KcsRGB;
 calData->base.outputSpace = KcsRGB;
 for (i=0; i< levels; i++) {
 	calData->val.patch[i].weight = 1.0;
 	calData->val.patch[i].standardDeviation = 0.0;
 	calData->val.patch[i].sampleType = KcsChromatic;

 	calData->val.patch[i].input[KcsRGB_R] = (float)i/255;
 	calData->val.patch[i].input[KcsRGB_G] = (float)i/255;
 	calData->val.patch[i].input[KcsRGB_B] = (float)i/255;
 	calData->val.patch[i].input[3] = 0.0;

 	calData->val.patch[i].output[KcsRGB_R] = Luminance_float_out[0][i];
 	calData->val.patch[i].output[KcsRGB_G] = Luminance_float_out[1][i];
 	calData->val.patch[i].output[KcsRGB_B] = Luminance_float_out[2][i];
 	calData->val.patch[i].output[3] = 0.0;
 	}

 calData->val.patch[0].sampleType = KcsBlack;
 calData->val.patch[255].sampleType = KcsWhite;

 if (!argv[1]) {
 	fprintf(stderr, "Usage kcms_update profile_in [profile_out]\n");
 	exit(1);
 	}
  /* Let the library open the file */
 x_desc.type = KcsSolarisProfile;
 x_desc.desc.solarisFile.fileName = argv[optind];
 x_desc.desc.solarisFile.hostName = NULL;
 x_desc.desc.solarisFile.oflag = O_RDWR;
 x_desc.desc.solarisFile.mode = 0;

 status = KcsLoadProfile(&profileid, &x_desc, KcsLoadAllNow);
 if(status != KCS_SUCCESS) {
 	status = KcsGetLastError(&errDesc);
 	printf("LoadProfile error: %s\n", errDesc.desc);
 	}

 status = KcsUpdateProfile(profileid, NULL, calData, NULL);
 if(status != KCS_SUCCESS) {
 	status = KcsGetLastError(&errDesc);
 	printf("UpdateProfile error: %s\n", errDesc.desc);
 	KcsFreeProfile(profileid);
 	exit(1);
 	}

 if (argv[2]) {
 	/* Save to an output file */
 	desc.type = KcsSolarisProfile;
 	desc.desc.solarisFile.fileName = argv[2];
 	desc.desc.solarisFile.hostName = NULL;
 	desc.desc.solarisFile.oflag = O_RDWR|O_CREAT|O_TRUNC;