📄 xcmslrgb.c
字号:
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 + -