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

📄 xcmslrgb.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
static StatusLINEAR_RGB_InitSCCData(dpy, screenNumber, pPerScrnInfo)    Display *dpy;    int screenNumber;    XcmsPerScrnInfo *pPerScrnInfo;/* *	DESCRIPTION * *	RETURNS *		XcmsFailure if failed. *		XcmsSuccess if succeeded. * */{    Atom  CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);    Atom  MatrixAtom  = XInternAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);    int	  format_return, count, cType, nTables;    unsigned long nitems, nbytes_return;    char *property_return, *pChar;    XcmsFloat *pValue;#ifdef ALLDEBUG    IntensityRec *pIRec;#endif /* ALLDEBUG */    VisualID visualID;    LINEAR_RGB_SCCData *pScreenData, *pScreenDefaultData;    XcmsIntensityMap *pNewMap;    /*     * Allocate memory for pScreenData     */    if (!(pScreenData = pScreenDefaultData = (LINEAR_RGB_SCCData *) 		      Xcalloc (1, sizeof(LINEAR_RGB_SCCData)))) {	return(XcmsFailure);    }    /*      *  1. Get the XYZ->RGB and RGB->XYZ matrices     */    if (MatrixAtom == None ||	!_XcmsGetProperty (dpy, RootWindow(dpy, screenNumber), MatrixAtom, 	   &format_return, &nitems, &nbytes_return, &property_return) ||	   nitems != 18 || format_return != 32) {	/*	 * As per the XDCCC, there must be 18 data items and each must be	 * in 32 bits !	 */	goto FreeSCCData;    } else {	/*	 * RGBtoXYZ and XYZtoRGB matrices	 */	pValue = (XcmsFloat *) pScreenData;	pChar = property_return;	for (count = 0; count < 18; count++) {	    *pValue++ = (long)_XcmsGetElement(format_return, &pChar,		    &nitems) / (XcmsFloat)XDCCC_NUMBER;	}	XFree (property_return);	pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X =		pScreenData->RGBtoXYZmatrix[0][0] +		pScreenData->RGBtoXYZmatrix[0][1] +		pScreenData->RGBtoXYZmatrix[0][2];	pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y =		pScreenData->RGBtoXYZmatrix[1][0] +		pScreenData->RGBtoXYZmatrix[1][1] +		pScreenData->RGBtoXYZmatrix[1][2];	pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z =		pScreenData->RGBtoXYZmatrix[2][0] +		pScreenData->RGBtoXYZmatrix[2][1] +		pScreenData->RGBtoXYZmatrix[2][2];	/*	 * Compute the Screen White Point	 */	if ((pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y < (1.0 - EPS) )		|| (pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y > (1.0 + EPS))) {	    goto FreeSCCData;	} else {	    pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y = 1.0;	}	pPerScrnInfo->screenWhitePt.format = XcmsCIEXYZFormat;	pPerScrnInfo->screenWhitePt.pixel = 0;#ifdef PDEBUG	printf ("RGB to XYZ Matrix values:\n");	printf ("       %f %f %f\n       %f %f %f\n       %f %f %f\n",		pScreenData->RGBtoXYZmatrix[0][0],		pScreenData->RGBtoXYZmatrix[0][1],		pScreenData->RGBtoXYZmatrix[0][2],		pScreenData->RGBtoXYZmatrix[1][0],		pScreenData->RGBtoXYZmatrix[1][1],		pScreenData->RGBtoXYZmatrix[1][2],		pScreenData->RGBtoXYZmatrix[2][0],		pScreenData->RGBtoXYZmatrix[2][1],		pScreenData->RGBtoXYZmatrix[2][2]);	printf ("XYZ to RGB Matrix values:\n");	printf ("       %f %f %f\n       %f %f %f\n       %f %f %f\n",		pScreenData->XYZtoRGBmatrix[0][0],		pScreenData->XYZtoRGBmatrix[0][1],		pScreenData->XYZtoRGBmatrix[0][2],		pScreenData->XYZtoRGBmatrix[1][0],		pScreenData->XYZtoRGBmatrix[1][1],		pScreenData->XYZtoRGBmatrix[1][2],		pScreenData->XYZtoRGBmatrix[2][0],		pScreenData->XYZtoRGBmatrix[2][1],		pScreenData->XYZtoRGBmatrix[2][2]);	printf ("Screen White Pt value: %f %f %f\n",		pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X,		pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y,		pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z);#endif /* PDEBUG */    }    /*     *	2. Get the Intensity Profile     */    if (CorrectAtom == None ||	!_XcmsGetProperty (dpy, RootWindow(dpy, screenNumber), CorrectAtom,	   &format_return, &nitems, &nbytes_return, &property_return)) {	XFree (property_return);	goto FreeSCCData;    }    pChar = property_return;    while (nitems) {	switch (format_return) {	  case 8:	    /*	     * Must have at least:	     *		VisualID0	     *		VisualID1	     *		VisualID2	     *		VisualID3	     *		type	     *		count	     *		length	     *		intensity1	     *		intensity2	     */	    if (nitems < 9) {		XFree (property_return);		goto FreeSCCData;	    }	    count = 3;	    break;	  case 16:	    /*	     * Must have at least:	     *		VisualID0	     *		VisualID3	     *		type	     *		count	     *		length	     *		intensity1	     *		intensity2	     */	    if (nitems < 7) {		XFree (property_return);		goto FreeSCCData;	    }	    count = 1;	    break;	  case 32:	    /*	     * Must have at least:	     *		VisualID0	     *		type	     *		count	     *		length	     *		intensity1	     *		intensity2	     */	    if (nitems < 6) {		XFree (property_return);		goto FreeSCCData;	    }	    count = 0;	    break;	  default:	    XFree (property_return);	    goto FreeSCCData;	}	/*	 * Get VisualID	 */	visualID = _XcmsGetElement(format_return, &pChar, &nitems);	while (count--) {	    visualID = visualID << format_return;	    visualID |= _XcmsGetElement(format_return, &pChar, &nitems);	}	if (visualID == 0) {	    /*	     * This is a shared intensity table	     */	    pScreenData = pScreenDefaultData;	} else {	    /*	     * This is a per-Visual intensity table	     */	    if (!(pScreenData = (LINEAR_RGB_SCCData *) 			      Xcalloc (1, sizeof(LINEAR_RGB_SCCData)))) {		return(XcmsFailure);	    }	    /* copy matrices */	    bcopy((char *)pScreenDefaultData, (char *)pScreenData,		    18 * sizeof(XcmsFloat));	    /* Create, initialize, and add map */	    if (!(pNewMap = (XcmsIntensityMap *) 			      Xcalloc (1, sizeof(XcmsIntensityMap)))) {		Xfree(pScreenData);		return(XcmsFailure);	    }	    pNewMap->visualID = visualID;	    pNewMap->screenData = (XPointer)pScreenData;	    pNewMap->pFreeScreenData = LINEAR_RGB_FreeSCCData;	    pNewMap->pNext =		    (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;	    dpy->cms.perVisualIntensityMaps = (XPointer)pNewMap;	    dpy->free_funcs->intensityMaps = _XcmsFreeIntensityMaps;	}	cType = _XcmsGetElement(format_return, &pChar, &nitems);	nTables = _XcmsGetElement(format_return, &pChar, &nitems);	if (cType == 0) {	    /* Red Intensity Table */	    if (!(pScreenData->pRedTbl = (IntensityTbl *)		    Xcalloc (1, sizeof(IntensityTbl)))) {		goto FreeSCCData;	    }	    if (_XcmsGetTableType0(pScreenData->pRedTbl, format_return, &pChar,		    &nitems) == XcmsFailure) {		goto FreeRedTbl;	    }	    if (nTables == 1) {		/* Green Intensity Table */		pScreenData->pGreenTbl = pScreenData->pRedTbl;		/* Blue Intensity Table */		pScreenData->pBlueTbl = pScreenData->pRedTbl;	    } else {		/* Green Intensity Table */		if (!(pScreenData->pGreenTbl = (IntensityTbl *)			Xcalloc (1, sizeof(IntensityTbl)))) {		    goto FreeRedTblElements;		}		if (_XcmsGetTableType0(pScreenData->pGreenTbl, format_return, &pChar,			&nitems) == XcmsFailure) {		    goto FreeGreenTbl;		}		/* Blue Intensity Table */		if (!(pScreenData->pBlueTbl = (IntensityTbl *)			Xcalloc (1, sizeof(IntensityTbl)))) {		    goto FreeGreenTblElements;		}		if (_XcmsGetTableType0(pScreenData->pBlueTbl, format_return, &pChar,			&nitems) == XcmsFailure) {		    goto FreeBlueTbl;		}	    }	    	} else if (cType == 1) {	    /* Red Intensity Table */	    if (!(pScreenData->pRedTbl = (IntensityTbl *)		    Xcalloc (1, sizeof(IntensityTbl)))) {		goto FreeSCCData;	    }	    if (_XcmsGetTableType1(pScreenData->pRedTbl, format_return, &pChar,		    &nitems) == XcmsFailure) {		goto FreeRedTbl;	    }	    if (nTables == 1) {		/* Green Intensity Table */		pScreenData->pGreenTbl = pScreenData->pRedTbl;		/* Blue Intensity Table */		pScreenData->pBlueTbl = pScreenData->pRedTbl;	    } else {		/* Green Intensity Table */		if (!(pScreenData->pGreenTbl = (IntensityTbl *)			Xcalloc (1, sizeof(IntensityTbl)))) {		    goto FreeRedTblElements;		}		if (_XcmsGetTableType1(pScreenData->pGreenTbl, format_return, &pChar,			&nitems) == XcmsFailure) {		    goto FreeGreenTbl;		}		/* Blue Intensity Table */		if (!(pScreenData->pBlueTbl = (IntensityTbl *)			Xcalloc (1, sizeof(IntensityTbl)))) {		    goto FreeBlueTblElements;		}		if (_XcmsGetTableType1(pScreenData->pBlueTbl, format_return, &pChar,			&nitems) == XcmsFailure) {		    goto FreeBlueTbl;		}	    }	} else {	    XFree (property_return);	    goto FreeSCCData;	}#ifdef ALLDEBUG	printf ("Intensity Table  RED    %d\n", pScreenData->pRedTbl->nEntries);	pIRec = (IntensityRec *) pScreenData->pRedTbl->pBase;	for (count = 0; count < pScreenData->pRedTbl->nEntries; count++, pIRec++) {	    printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);	}	if (pScreenData->pGreenTbl->pBase != pScreenData->pRedTbl->pBase) {	    printf ("Intensity Table  GREEN  %d\n", pScreenData->pGreenTbl->nEntries);	    pIRec = (IntensityRec *)pScreenData->pGreenTbl->pBase;	    for (count = 0; count < pScreenData->pGreenTbl->nEntries; count++, pIRec++) {		printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);	    }	}	if (pScreenData->pBlueTbl->pBase != pScreenData->pRedTbl->pBase) {	    printf ("Intensity Table  BLUE   %d\n", pScreenData->pBlueTbl->nEntries);	    pIRec = (IntensityRec *) pScreenData->pBlueTbl->pBase;	    for (count = 0; count < pScreenData->pBlueTbl->nEntries; count++, pIRec++) {		printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);	    }	}#endif /* ALLDEBUG */    }    XFree (property_return);    /* Free the old memory and use the new structure created. */    LINEAR_RGB_FreeSCCData((LINEAR_RGB_SCCData *) pPerScrnInfo->screenData);    pPerScrnInfo->functionSet = (XPointer) &XcmsLinearRGBFunctionSet;    pPerScrnInfo->screenData = (XPointer) pScreenData;    pPerScrnInfo->state = XcmsInitSuccess;    return(XcmsSuccess);FreeBlueTblElements:    free(pScreenData->pBlueTbl->pBase);FreeBlueTbl:    free(pScreenData->pBlueTbl);FreeGreenTblElements:    free(pScreenData->pBlueTbl->pBase);FreeGreenTbl:    free(pScreenData->pGreenTbl);FreeRedTblElements:    free(pScreenData->pRedTbl->pBase);FreeRedTbl:    free(pScreenData->pRedTbl);FreeSCCData:    free(pScreenData);    pPerScrnInfo->state = XcmsInitNone;    return(XcmsFailure);}/* *	NAME *		LINEAR_RGB_FreeSCCData() * *	SYNOPSIS */static voidLINEAR_RGB_FreeSCCData(pScreenDataTemp)    XPointer pScreenDataTemp;/* *	DESCRIPTION * *	RETURNS *		0 if failed. *		1 if succeeded with no modifications. * */{    LINEAR_RGB_SCCData *pScreenData = (LINEAR_RGB_SCCData *) pScreenDataTemp;    if (pScreenData && pScreenData != &Default_RGB_SCCData) {	if (pScreenData->pRedTbl) {	    if (pScreenData->pGreenTbl) {		if (pScreenData->pRedTbl->pBase != 		    pScreenData->pGreenTbl->pBase) {		    if (pScreenData->pGreenTbl->pBase) {			free (pScreenData->pGreenTbl->pBase);		    }		}		if (pScreenData->pGreenTbl != pScreenData->pRedTbl) {		    free (pScreenData->pGreenTbl);		}	    }	    if (pScreenData->pBlueTbl) {		if (pScreenData->pRedTbl->pBase != 		    pScreenData->pBlueTbl->pBase) {		    if (pScreenData->pBlueTbl->pBase) {			free (pScreenData->pBlueTbl->pBase);		    }		}		if (pScreenData->pBlueTbl != pScreenData->pRedTbl) {		    free (pScreenData->pBlueTbl);		}	    }	    if (pScreenData->pRedTbl->pBase) {		free (pScreenData->pRedTbl->pBase);	    }	    free (pScreenData->pRedTbl);	}	free (pScreenData);    }}/************************************************************************ *									* *			API PRIVATE ROUTINES				* *									* ************************************************************************//* *	NAME *		_XcmsGetTableType0 * *	SYNOPSIS */Status_XcmsGetTableType0(pTbl, format, pChar, pCount)    IntensityTbl *pTbl;    int	  format;    char **pChar;    unsigned long *pCount;/* *	DESCRIPTION * *	RETURNS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -