⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcmslrgb.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -