KCMS Application Developer's Guide

Example


Example 4-11 KcsSetAttribute()

#include "kcms_utils.h"
 #define SAMPLE_WORDS "A profile created using kcms_create"

 KcsProfileId					profileid;
 KcsStatusId					status;
 KcsAttributeValue					attrValue;
 KcsAttributeValue					*attrValue2;
 KcsAttributeValue					*attrValuePtr;
 KcsErrDesc					errDesc;
 int					sizemeas, size, nvalues, i, j;
 time_t					clocktime;
 struct tm					*datetime;
 size_t					rc;
 char					*description;
 char					attr[256];
 double					test_double[3];

 /* Fill out the measurement structures - The illuminant must be D50 */
 test_double[0] = 0.9642;
 test_double[1] = 1.0;
 test_double[2] = 0.8249;

 /*  open or create a profile, then set some attributes */
 if ((description = (char *)malloc(strlen(SAMPLE_WORDS) + 1)) == NULL) {
 	perror("malloc failed : ");
 	KcsFreeProfile(profileid);
 	exit(1);
 }
 memset(description, 0, strlen(SAMPLE_WORDS) + 1);
 strcpy(description, SAMPLE_WORDS);
 /* the function used below can be found in kcms_utils.c in appendix */
 if ((attrValue2 = string2icTextAttrValue(description)) == NULL) {
 	fprintf(stderr, "conversion to AttrValue failed \n");
 	KcsFreeProfile(profileid);
 	exit(1);
 }
 if (KcsSetAttribute(profileid, icSigProfileDescriptionTag, attrValue2)
 	!= KCS_SUCCESS) {
 	KcsGetLastError(&errDesc);
 	printf("Set Attribute error: %s\n", errDesc.desc);
 	exit(1);
 }
 free(attrValue2);
 free(description);
 size = sizeof(KcsAttributeBase) + sizeof(icHeader);
 attrValuePtr = (KcsAttributeValue *)malloc(size);

 /* Build the header */
 attrValuePtr->base.type = icSigHeaderType;
 attrValuePtr->base.sizeOfType = sizeof(icHeader);
 attrValuePtr->base.countSupplied = 1;
 KcsGetAttribute(profileid, icSigHeaderTag, attrValuePtr);
 attrValuePtr->val.icHeader.size = 0;

 /* The following three values do not have to be set if you do a
  * GetAttribute on the header, since the Create should set them for you.
  * If you do not do a GetAttribute of the header, you must set these:
  *   attrValuePtr->val.icHeader.cmmId = 0x4b434d53;
  *   attrValuePtr->val.icHeader.version =icVersionNumber;
  *   attrValuePtr->val.icHeader.magic = icMagicNumber;
 */
 attrValuePtr->val.icHeader.deviceClass = icSigDisplayClass;
 attrValuePtr->val.icHeader.colorSpace = icSigRgbData;
 attrValuePtr->val.icHeader.pcs = icSigXYZData;

 /* Get the time from the system */
 clocktime = time(NULL);
 datetime = localtime(&clocktime);

 attrValuePtr->val.icHeader.date.seconds =
 		(icUInt16Number)datetime->tm_sec;
 attrValuePtr->val.icHeader.date.minutes =
 		(icUInt16Number)datetime->tm_min;
 attrValuePtr->val.icHeader.date.hours =
 		(icUInt16Number)datetime->tm_hour;
 attrValuePtr->val.icHeader.date.day =
 		(icUInt16Number)datetime->tm_mday;
 attrValuePtr->val.icHeader.date.month =
 		(icUInt16Number)datetime->tm_mon + 1;
 attrValuePtr->val.icHeader.date.year =
 		(icUInt16Number)datetime->tm_year;
 attrValuePtr->val.icHeader.platform = icSigSolaris;
 attrValuePtr->val.icHeader.flags =
 		icEmbeddedProfileFalse || icUseAnywhere;
 strcpy(description,"SUNW ");
 memcpy(&attrValuePtr->val.icHeader.manufacturer, description, 4);
 attrValuePtr->val.icHeader.model = 0;
 attrValuePtr->val.icHeader.attributes[0] = 0;
 attrValuePtr->val.icHeader.attributes[1] = 0;
 attrValuePtr->val.icHeader.renderingIntent = icPerceptual;
 attrValuePtr->val.icHeader.illuminant.X =
 		double2icfixed(test_double[0], icSigS15Fixed16ArrayType);
 attrValuePtr->val.icHeader.illuminant.Y =
 		double2icfixed(test_double[1], icSigS15Fixed16ArrayType);
 attrValuePtr->val.icHeader.illuminant.Z =
 		double2icfixed(test_double[2], icSigS15Fixed16ArrayType);
 rc = KcsSetAttribute(profileid, icSigHeaderTag, attrValuePtr);
 if(rc != KCS_SUCCESS) {
 	rc =KcsGetLastError(&errDesc);
 	fprintf(stderr, "unable to set header: %s\n", errDesc.desc);
 	KcsFreeProfile(profileid);
 	return(-1)