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

📄 xcmsint.c

📁 早期freebsd实现
💻 C
字号:
/* $XConsortium: XcmsInt.c,v 1.9 92/01/02 19:27:32 rws Exp $" *//* * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc. * 	All Rights Reserved *  * This file is a component of an X Window System-specific implementation * of Xcms based on the TekColor Color Management System.  Permission is * hereby granted to use, copy, modify, sell, and otherwise distribute this * software and its documentation for any purpose and without fee, provided * that this copyright, permission, and disclaimer notice is reproduced in * all copies of this software and in supporting documentation.  TekColor * is a trademark of Tektronix, Inc. *  * Tektronix makes no representation about the suitability of this software * for any purpose.  It is provided "as is" and with all faults. *  * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE, * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR THE PERFORMANCE OF THIS SOFTWARE. * * *	NAME *		XcmsInt.c - Xcms API utility routines * *	DESCRIPTION *		Xcms Application Program Interface (API) utility *		routines for hanging information directly onto *		the Display structure. * * *//* #define NEED_EVENTS */#include <stdio.h>#include "Xlibint.h"#include "Xcmsint.h"#ifndef XCMSCOMPPROC#  define XCMSCOMPPROC	XcmsTekHVCClipC#endif/* *      EXTERNS */extern XcmsColorSpace **_XcmsDIColorSpaces;extern XcmsFunctionSet **_XcmsSCCFuncSets;static void _XcmsFreeDefaultCCCs();/* *      GLOBALS *//************************************************************************ *									* *			   API PRIVATE ROUTINES				* *									* ************************************************************************//* *	NAME *		_XcmsCopyPointerArray * *	SYNOPSIS */XPointer *_XcmsCopyPointerArray(pap)    XPointer *pap;/* *	DESCRIPTION *		Copies an array of NULL terminated pointers. * *	RETURNS *		Returns NULL if failed; otherwise the address to *		the copy. * */{    XPointer *newArray;    char **tmp;    int n;    for (tmp = pap, n = 0; *tmp != NULL; tmp++, n++);    n++; /* add 1 to include the NULL pointer */    if (newArray = (XPointer *)Xmalloc(n * sizeof(XPointer))) {	bcopy((char *)pap, (char *)newArray, (unsigned)(n * sizeof(XPointer)));    }    return((XPointer *)newArray);}/* *	NAME *		_XcmsFreePointerArray * *	SYNOPSIS */void_XcmsFreePointerArray(pap)    XPointer *pap;/* *	DESCRIPTION *		Frees an array of NULL terminated pointers. * *	RETURNS *		void * */{    Xfree(pap);}/* *	NAME *		_XcmsPushPointerArray * *	SYNOPSIS */XPointer *_XcmsPushPointerArray(pap, p, papNoFree)    XPointer *pap;    XPointer p;    XPointer *papNoFree;/* *	DESCRIPTION *		Places the specified pointer at the head of an array of NULL *		terminated pointers. * *	RETURNS *		Returns NULL if failed; otherwise the address to *		the head of the array. * */{    XPointer *newArray;    char **tmp;    int n;    for (tmp = pap, n = 0; *tmp != NULL; tmp++, n++);    /* add 2: 1 for the new pointer and another for the NULL pointer */    n += 2;    if (newArray = (XPointer *)Xmalloc(n * sizeof(XPointer))) {	bcopy((char *)pap, (char *)(newArray+1),		(unsigned)((n-1) * sizeof(XPointer)));	*newArray = p;    }    if (pap != papNoFree) {        _XcmsFreePointerArray(pap);    }    return((XPointer *)newArray);}/* *	NAME *		_XcmsInitDefaultCCCs * *	SYNOPSIS */int_XcmsInitDefaultCCCs(dpy)    Display *dpy;/* *	DESCRIPTION *		Initializes the Xcms per Display Info structure *		(XcmsPerDpyInfo). * *	RETURNS *		Returns 0 if failed; otherwise non-zero. * */{    int nScrn = ScreenCount(dpy);    int i;    XcmsCCC ccc;    if (nScrn <= 0) {	return(0);    }    /*     * Create an array of XcmsCCC structures, one for each screen.     * They serve as the screen's default CCC.     */    if (!(ccc = (XcmsCCC)	    Xcalloc((unsigned)nScrn, (unsigned) sizeof(XcmsCCCRec)))) {	return(0);    }     dpy->cms.defaultCCCs = (XPointer)ccc;    dpy->free_funcs->defaultCCCs = _XcmsFreeDefaultCCCs;    for (i = 0; i < nScrn; i++, ccc++) {	ccc->dpy = dpy;	ccc->screenNumber = i;	ccc->visual = DefaultVisual(dpy, i);	/*	 * Used calloc to allocate memory so:	 *	ccc->clientWhitePt->format == XcmsUndefinedFormat	 *	ccc->gamutCompProc == NULL	 *	ccc->whitePtAdjProc == NULL	 *	ccc->pPerScrnInfo = NULL	 *	 * Don't need to create XcmsPerScrnInfo and its functionSet and	 * pScreenData components until the default CCC is accessed.	 * Note that the XcmsDefaultCCC routine calls _XcmsInitScrnInto	 * to do this.	 */	ccc->gamutCompProc = XCMSCOMPPROC;    }    return(1);}/* *	NAME *		_XcmsFreeDefaultCCCs - Free Default CCCs and its PerScrnInfo * *	SYNOPSIS */static void_XcmsFreeDefaultCCCs(dpy)    Display *dpy;/* *	DESCRIPTION *		This routine frees the default XcmsCCC's associated with *		each screen and its associated substructures as neccessary. * *	RETURNS *		void * * */{    int nScrn = ScreenCount(dpy);    XcmsCCC ccc;    int i;    /*     * Free Screen data in each DefaultCCC     *		Do not use XcmsFreeCCC here because it will not free     *		DefaultCCC's.     */    ccc = (XcmsCCC)dpy->cms.defaultCCCs;    for (i = nScrn; i--; ccc++) {	/*	 * Check if XcmsPerScrnInfo exists.	 *	 * This is the only place where XcmsPerScrnInfo structures	 * are freed since there is only one allocated per Screen.	 * It just so happens that we place its reference in the	 * default CCC.	 */	if (ccc->pPerScrnInfo) {	    /* Check if SCCData exists */	    if ((ccc->pPerScrnInfo->state == XcmsInitSuccess ||		    ccc->pPerScrnInfo->state == XcmsInitDefault)		    && ccc->pPerScrnInfo->screenData) {		(*((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->screenFreeProc)			(ccc->pPerScrnInfo->screenData);	    }	    Xfree(ccc->pPerScrnInfo);	}    }    /*     * Free the array of XcmsCCC structures     */    Xfree(dpy->cms.defaultCCCs);    dpy->cms.defaultCCCs = (XPointer)NULL;}/* *	NAME *		_XcmsInitScrnInfo * *	SYNOPSIS */int_XcmsInitScrnInfo(dpy, screenNumber)    register Display *dpy;    int screenNumber;/* *	DESCRIPTION *		Given a display and screen number, this routine attempts *		to initialize the Xcms per Screen Info structure *		(XcmsPerScrnInfo). * *	RETURNS *		Returns zero if initialization failed; non-zero otherwise. */{    XcmsFunctionSet **papSCCFuncSet = _XcmsSCCFuncSets;    XcmsCCC defaultccc;    /*     * Check if the XcmsCCC's for each screen has been created.     * Really dont need to be created until some routine uses the Xcms     * API routines.     */    if ((XcmsCCC)dpy->cms.defaultCCCs == NULL) {	if (!_XcmsInitDefaultCCCs(dpy)) {	    return(0);	}    }    defaultccc = (XcmsCCC)dpy->cms.defaultCCCs + screenNumber;    /*     * For each SCCFuncSet, try its pInitScrnFunc.     *	If the function succeeds, then we got it!     */    if (!defaultccc->pPerScrnInfo) {	/*	 * This is one of two places where XcmsPerScrnInfo structures	 * are allocated.  There is one allocated per Screen that is	 * shared among visuals that do not have specific intensity	 * tables.  Other XcmsPerScrnInfo structures are created	 * for the latter (see XcmsCreateCCC).  The ones created	 * here are referenced by the default CCC.	 */	if (!(defaultccc->pPerScrnInfo = (XcmsPerScrnInfo *)		Xcalloc(1, (unsigned) sizeof(XcmsPerScrnInfo)))) {	    return(0);	} 	defaultccc->pPerScrnInfo->state = XcmsInitNone;    }    while (*papSCCFuncSet != NULL) {	if ((*(*papSCCFuncSet)->screenInitProc)(dpy, screenNumber,		defaultccc->pPerScrnInfo)) {	    defaultccc->pPerScrnInfo->state = XcmsInitSuccess;	    return(1);	}	papSCCFuncSet++;    }    /*     * Use Default SCCData     */    return(_XcmsLRGB_InitScrnDefault(dpy, screenNumber, defaultccc->pPerScrnInfo));}/* *	NAME *		_XcmsFreeIntensityMaps * *	SYNOPSIS */void_XcmsFreeIntensityMaps(dpy)    Display *dpy;/* *	DESCRIPTION *		Frees all XcmsIntensityMap structures in the linked list *		and sets dpy->cms.perVisualIntensityMaps to NULL. * *	RETURNS *		void * */{    XcmsIntensityMap *pNext, *pFree;    pNext = (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;    while (pNext != NULL) {	pFree = pNext;	pNext = pNext->pNext;	(*pFree->pFreeScreenData)(pFree->screenData);	/* Now free the XcmsIntensityMap structure */	Xfree(pFree);    }    dpy->cms.perVisualIntensityMaps = (XPointer)NULL;}/* *	NAME *		_XcmsGetIntensityMap * *	SYNOPSIS */XcmsIntensityMap *_XcmsGetIntensityMap(dpy, visual)    Display *dpy;    Visual *visual;/* *	DESCRIPTION *		Attempts to return a per-Visual intensity map. * *	RETURNS *		Pointer to the XcmsIntensityMap structure if found; *		otherwise NULL * */{    VisualID targetID = visual->visualid;    XcmsIntensityMap *pNext;    pNext = (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;    while (pNext != NULL) {	if (targetID == pNext->visualID) {	    return(pNext);	}	pNext = pNext->pNext;    }    return((XcmsIntensityMap *)NULL);}

⌨️ 快捷键说明

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