📄 xcmslrgb.c
字号:
pColor->pixel = 0; return (XcmsSuccess);}/* * NAME * XcmsLRGB_RGBi_ParseString * * SYNOPSIS */intXcmsLRGB_RGBi_ParseString(spec, pColor) register char *spec; XcmsColor *pColor;/* * DESCRIPTION * This routines takes a string and attempts to convert * it into a XcmsColor structure with XcmsRGBiFormat. * The assumed RGBi string syntax is: * RGBi:<r>/<g>/<b> * Where r, g, and b are in string input format for floats * consisting of: * a. an optional sign * b. a string of numbers possibly containing a decimal point, * c. an optional exponent field containing an 'E' or 'e' * followed by a possibly signed integer string. * * RETURNS * 0 if failed, non-zero otherwise. */{ int n; char *pchar; if ((pchar = strchr(spec, ':')) == NULL) { return(XcmsFailure); } n = (int)(pchar - spec); /* * Check for proper prefix. */ if (strncmp(spec, XcmsRGBi_prefix, n) != 0) { return(XcmsFailure); } /* * Attempt to parse the value portion. */ if (sscanf(spec + n + 1, "%lf/%lf/%lf", &pColor->spec.RGBi.red, &pColor->spec.RGBi.green, &pColor->spec.RGBi.blue) != 3) { return(XcmsFailure); } /* * Succeeded ! */ pColor->format = XcmsRGBiFormat; pColor->pixel = 0; return (XcmsSuccess);}/* * NAME * XcmsCIEXYZToRGBi - convert CIE XYZ to RGB * * SYNOPSIS *//* ARGSUSED */Status XcmsCIEXYZToRGBi(ccc, pXcmsColors_in_out, nColors, pCompressed) XcmsCCC ccc; XcmsColor *pXcmsColors_in_out;/* pointer to XcmsColors to convert */ unsigned int nColors; /* Number of colors */ Bool *pCompressed; /* pointer to an array of Bool *//* * DESCRIPTION * Converts color specifications in an array of XcmsColor * structures from RGB format to RGBi format. * * RETURNS * XcmsFailure if failed, * XcmsSuccess if succeeded without gamut compression. * XcmsSuccessWithCompression if succeeded with gamut * compression. */{ LINEAR_RGB_SCCData *pScreenData; XcmsFloat tmp[3]; int hasCompressed = 0; unsigned int i; XcmsColor *pColor = pXcmsColors_in_out; if (ccc == NULL) { return(XcmsFailure); } pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData; /* * XcmsColors should be White Point Adjusted, if necessary, by now! */ /* * NEW!!! for extended gamut compression * * 1. Need to zero out pCompressed * * 2. Need to save initial address of pColor * * 3. Need to save initial address of pCompressed */ for (i = 0; i < nColors; i++) { /* Make sure format is XcmsCIEXYZFormat */ if (pColor->format != XcmsCIEXYZFormat) { return(XcmsFailure); } /* Multiply [A]-1 * [XYZ] to get RGB intensity */ _XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix, (XcmsFloat *) &pColor->spec, tmp); if ((MIN3 (tmp[0], tmp[1], tmp[2]) < -EPS) || (MAX3 (tmp[0], tmp[1], tmp[2]) > (1.0 + EPS))) { /* * RGBi out of screen's gamut */ if (ccc->gamutCompProc == NULL) { /* * Aha!! Here's that little trick that will allow * gamut compression routines to get the out of bound * RGBi. */ bcopy((char *)tmp, (char *)&pColor->spec, sizeof(tmp)); pColor->format = XcmsRGBiFormat; return(XcmsFailure); } else if ((*ccc->gamutCompProc)(ccc, pXcmsColors_in_out, nColors, i, pCompressed) == 0) { return(XcmsFailure); } /* * The gamut compression function should return colors in CIEXYZ * Also check again to if the new color is within gamut. */ if (pColor->format != XcmsCIEXYZFormat) { return(XcmsFailure); } _XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix, (XcmsFloat *) &pColor->spec, tmp); if ((MIN3 (tmp[0], tmp[1], tmp[2]) < -EPS) || (MAX3 (tmp[0], tmp[1], tmp[2]) > (1.0 + EPS))) { return(XcmsFailure); } hasCompressed++; } bcopy((char *)tmp, (char *)&pColor->spec, sizeof(tmp)); /* These if statements are done to ensure the fudge factor is */ /* is taken into account. */ if (pColor->spec.RGBi.red < 0.0) { pColor->spec.RGBi.red = 0.0; } else if (pColor->spec.RGBi.red > 1.0) { pColor->spec.RGBi.red = 1.0; } if (pColor->spec.RGBi.green < 0.0) { pColor->spec.RGBi.green = 0.0; } else if (pColor->spec.RGBi.green > 1.0) { pColor->spec.RGBi.green = 1.0; } if (pColor->spec.RGBi.blue < 0.0) { pColor->spec.RGBi.blue = 0.0; } else if (pColor->spec.RGBi.blue > 1.0) { pColor->spec.RGBi.blue = 1.0; } (pColor++)->format = XcmsRGBiFormat; } return (hasCompressed ? XcmsSuccessWithCompression : XcmsSuccess);}/* * NAME * LINEAR_RGBi_to_CIEXYZ - convert RGBi to CIEXYZ * * SYNOPSIS *//* ARGSUSED */Status XcmsRGBiToCIEXYZ(ccc, pXcmsColors_in_out, nColors, pCompressed) XcmsCCC ccc; XcmsColor *pXcmsColors_in_out;/* pointer to XcmsColors to convert */ unsigned int nColors; /* Number of colors */ Bool *pCompressed; /* pointer to a bit array *//* * DESCRIPTION * Converts color specifications in an array of XcmsColor * structures from RGBi format to CIEXYZ format. * * RETURNS * XcmsFailure if failed, * XcmsSuccess if succeeded. */{ LINEAR_RGB_SCCData *pScreenData; XcmsFloat tmp[3]; /* * pCompressed ignored in this function. */ if (ccc == NULL) { return(XcmsFailure); } pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData; /* * XcmsColors should be White Point Adjusted, if necessary, by now! */ while (nColors--) { /* Multiply [A]-1 * [XYZ] to get RGB intensity */ _XcmsMatVec((XcmsFloat *) pScreenData->RGBtoXYZmatrix, (XcmsFloat *) &pXcmsColors_in_out->spec, tmp); bcopy((char *)tmp, (char *)&pXcmsColors_in_out->spec, sizeof(tmp)); (pXcmsColors_in_out++)->format = XcmsCIEXYZFormat; } return(XcmsSuccess);}/* * NAME * XcmsRGBiToRGB * * SYNOPSIS *//* ARGSUSED */Status XcmsRGBiToRGB(ccc, pXcmsColors_in_out, nColors, pCompressed) XcmsCCC ccc; XcmsColor *pXcmsColors_in_out;/* pointer to XcmsColors to convert */ unsigned int nColors; /* Number of colors */ Bool *pCompressed; /* pointer to a bit array *//* * DESCRIPTION * Converts color specifications in an array of XcmsColor * structures from RGBi format to RGB format. * * RETURNS * XcmsFailure if failed, * XcmsSuccess if succeeded without gamut compression. * XcmsSuccessWithCompression if succeeded with gamut * compression. */{ LINEAR_RGB_SCCData *pScreenData; XcmsRGB tmpRGB; IntensityRec keyIRec, answerIRec; /* * pCompressed ignored in this function. */ if (ccc == NULL) { return(XcmsFailure); } pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData; while (nColors--) { /* Make sure format is XcmsRGBiFormat */ if (pXcmsColors_in_out->format != XcmsRGBiFormat) { return(XcmsFailure); } keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.red; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pRedTbl->pBase, (unsigned)pScreenData->pRedTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsIntensityCmp, _XcmsIntensityInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGB.red = answerIRec.value; keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.green; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pGreenTbl->pBase, (unsigned)pScreenData->pGreenTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsIntensityCmp, _XcmsIntensityInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGB.green = answerIRec.value; keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.blue; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pBlueTbl->pBase, (unsigned)pScreenData->pBlueTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsIntensityCmp, _XcmsIntensityInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGB.blue = answerIRec.value; bcopy((char *)&tmpRGB, (char *)&pXcmsColors_in_out->spec, sizeof(XcmsRGB)); (pXcmsColors_in_out++)->format = XcmsRGBFormat; } return(XcmsSuccess);}/* * NAME * XcmsRGBToRGBi * * SYNOPSIS *//* ARGSUSED */Status XcmsRGBToRGBi(ccc, pXcmsColors_in_out, nColors, pCompressed) XcmsCCC ccc; XcmsColor *pXcmsColors_in_out;/* pointer to XcmsColors to convert */ unsigned int nColors; /* Number of colors */ Bool *pCompressed; /* pointer to a bit array *//* * DESCRIPTION * Converts color specifications in an array of XcmsColor * structures from RGB format to RGBi format. * * RETURNS * XcmsFailure if failed, * XcmsSuccess if succeeded. */{ LINEAR_RGB_SCCData *pScreenData; XcmsRGBi tmpRGBi; IntensityRec keyIRec, answerIRec; /* * pCompressed ignored in this function. */ if (ccc == NULL) { return(XcmsFailure); } pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData; while (nColors--) { /* Make sure format is XcmsRGBFormat */ if (pXcmsColors_in_out->format != XcmsRGBFormat) { return(XcmsFailure); } keyIRec.value = pXcmsColors_in_out->spec.RGB.red; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pRedTbl->pBase, (unsigned)pScreenData->pRedTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsValueCmp, _XcmsValueInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGBi.red = answerIRec.intensity; keyIRec.value = pXcmsColors_in_out->spec.RGB.green; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pGreenTbl->pBase, (unsigned)pScreenData->pGreenTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsValueCmp, _XcmsValueInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGBi.green = answerIRec.intensity; keyIRec.value = pXcmsColors_in_out->spec.RGB.blue; if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb, (char *)pScreenData->pBlueTbl->pBase, (unsigned)pScreenData->pBlueTbl->nEntries, (unsigned)sizeof(IntensityRec), _XcmsValueCmp, _XcmsValueInterpolation, (char *)&answerIRec)) { return(XcmsFailure); } tmpRGBi.blue = answerIRec.intensity; bcopy((char *)&tmpRGBi, (char *)&pXcmsColors_in_out->spec, sizeof(XcmsRGBi)); (pXcmsColors_in_out++)->format = XcmsRGBiFormat; } return(XcmsSuccess);}/* * NAME * _XcmsInitScrnDefaultInfo * * SYNOPSIS *//* ARGSUSED */int_XcmsLRGB_InitScrnDefault(dpy, screenNumber, pPerScrnInfo) Display *dpy; int screenNumber; XcmsPerScrnInfo *pPerScrnInfo;/* * DESCRIPTION * Given a display and screen number, this routine attempts * to initialize the TekCMS per Screen Info structure * (XcmsPerScrnInfo) with defaults. * * RETURNS * Returns zero if initialization failed; non-zero otherwise. */{ pPerScrnInfo->screenData = (XPointer)&Default_RGB_SCCData; pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X = Default_RGB_SCCData.RGBtoXYZmatrix[0][0] + Default_RGB_SCCData.RGBtoXYZmatrix[0][1] + Default_RGB_SCCData.RGBtoXYZmatrix[0][2]; pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y = Default_RGB_SCCData.RGBtoXYZmatrix[1][0] + Default_RGB_SCCData.RGBtoXYZmatrix[1][1] + Default_RGB_SCCData.RGBtoXYZmatrix[1][2]; pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z = Default_RGB_SCCData.RGBtoXYZmatrix[2][0] + Default_RGB_SCCData.RGBtoXYZmatrix[2][1] + Default_RGB_SCCData.RGBtoXYZmatrix[2][2]; if ((pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y < (1.0 - EPS) ) || (pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y > (1.0 + EPS))) { pPerScrnInfo->screenData = (XPointer)NULL; pPerScrnInfo->state = XcmsInitNone; return(0); } pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y = 1.0; pPerScrnInfo->screenWhitePt.format = XcmsCIEXYZFormat; pPerScrnInfo->screenWhitePt.pixel = 0; pPerScrnInfo->functionSet = (XPointer)&XcmsLinearRGBFunctionSet; pPerScrnInfo->state = XcmsInitDefault; return(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -