typedef struct KcsAttributeValue_s { KcsAttributeBase base; union KcsAttributeValueValue_s { struct tm dateTimeVal; long longVal[KcsExtendableArray]; double doubleVal[KcsExtendableArray]; char byteVal[KcsExtendableArray]; unsigned char uByteVal[KcsExtendableArray]; short shortVal[KcsExtendableArray]; unsigned short uShortVal[KcsExtendableArray]; unsigned long uLongVal[KcsExtendableArray]; KcsPixelLayoutSpeeds layoutVal[KcsExtendablePixelLayout]; /* ICC 3.0 values */ icText icText; icData icData; icCurve icCurve; icUcrBg icUcrBg; icNamedColor2 icNamedColor2; icScreening icScreening; icSignature icSignature; icMeasurement icMeasurement; icDateTimeNumber icDateTime; icViewingCondition icViewingCondition; icTextDescription icTextDescription; icProfileSequenceDesc icProfileSequenceDescription; icXYZArray icXYZ; icInt8Array icInt8Array; icInt16Array icInt16Array; icInt32Array icInt32Array; icInt64Array icInt64Array; icUInt8Array icUInt8Array; icUInt16Array icUInt16Array; icUInt32Array icUInt32Array; icUInt64Array icUInt64Array; icS15Fixed16Array icS15Fixed16Array; icU16Fixed16Array icU16Fixed16Array icHeader icHeader } KcsAttributeValueValue; } KcsAttributeValue; |
The KcsAttributeValueValue data type is included in this type definition.
The KcsAttributeValue structure is the data type of one argument in:
KcsGetAttribute()
KcsSetAttribute()
A variable of data type KcsAttributeValue holds the value of an attribute. An attribute's value fits in a normal KcsAttributeValue structure. However, your application may have to extend the KcsAttributeValue structure if the number of values an attribute contains is greater than the number in the default size of the structure. The "C" API macro KCS_DEFAULT_ATTRIB_COUNT returns the values that a variable of this type can hold. (For more information on KCS_DEFAULT_ATTRIB_COUNT, see the description of KcsAttributeBase on "KcsAttributeBase".) For example, to have more values in an attribute than the value returned from the macro, your application can extend the structure by allocating more memory and then casting it as a pointer to a KcsAttributeValue structure. Because it is specified as an array at the end of the structure, and C does not check array bounds, your application can allocate a piece of memory larger than KcsAttributeValue and treat the extra memory as an extension of the val arrays. This allows your application to access the values using the array operator (myAttributeValuePtr->val.doubleVal[i]).
For example, the following code shows you how to get the colorant from a profile.
/* Get the colorants */ /* Red */ KcsAttributeValue *attrValuePtr; attrValuePtr = (KcsAttributeValue *)malloc(sizeof(KcsAttributeBase) + sizeof(icXYZNumber) ); attrValuePtr->base.type = icSigXYZArrayType; attrValuePtr->base.countSupplied = 1; status = KcsGetAttribute(profileid, icSigRedColorantTag, attrValuePtr); if(status != KCS_SUCCESS) { status = KcsGetLastError(&errDesc); printf("GetAttribute error: %s\n", errDesc.desc); KcsFreeProfile(profileid); exit(1); } XYZval = (icXYZNumber *)attrValuePtr->val.icXYZ.data; printf("Red X=%f Y=%f Z=%f\n", icfixed2double(XYZval->X, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Y, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Z, icSigS15Fixed16ArrayType)); /* Green */ status = KcsGetAttribute(profileid, icSigGreenColorantTag, attrValuePtr); if(status != KCS_SUCCESS) { status = KcsGetLastError(&errDesc); printf("SetAttribute error: %s\n", errDesc.desc); KcsFreeProfile(profileid); exit(1); } XYZval = (icXYZNumber *)attrValuePtr->val.icXYZ.data; printf("Green X=%f Y=%f Z=%f\n", icfixed2double(XYZval->X, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Y, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Z, icSigS15Fixed16ArrayType)); /* Blue */ status = KcsGetAttribute(profileid, icSigBlueColorantTag, attrValuePtr); if(status != KCS_SUCCESS) { status = KcsGetLastError(&errDesc); printf("SetAttribute error: %s\n", errDesc.desc); KcsFreeProfile(profileid); exit(1); } XYZval = (icXYZNumber *)attrValuePtr->val.icXYZ.data; printf("Blue X=%f Y=%f Z=%f\n", icfixed2double(XYZval->X, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Y, icSigS15Fixed16ArrayType), icfixed2double(XYZval->Z, icSigS15Fixed16ArrayType)); free(attrValuePtr); |
If an attribute returns just one long value, use the following code fragment:
KcsAttributeValue myAttributeValue; myAttributeValue.base.countSupplied = 1; KcsGetAttribute(myProfile, myAttributeName, &myAttributeValue); |