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

📄 cmap.c

📁 安装DDD之前
💻 C
📖 第 1 页 / 共 3 页
字号:
		{			myXtWarning("CmapWidget: FirstIndex (%d) cannot be more than greatest index (%d).	FirstIndex set to %d.",				CMAP(_new).firstIndex, CMAP(_new).availColors-1, CMAP(_new).availColors-1);			CMAP(_new).firstIndex = CMAP(_new).availColors-1;		}		needResize = TRUE;	}	if (CMAP(_new).lastIndex != CMAP(_current).lastIndex)	{		if (CMAP(_new).lastIndex < CMAP(_new).firstIndex)		{			myXtWarning("CmapWidget: LastIndex (%d) cannot be less than FirstIndex (%d).	LastIndex set to %d.",				CMAP(_new).lastIndex, CMAP(_new).firstIndex, CMAP(_new).firstIndex+1);			CMAP(_new).lastIndex = CMAP(_new).firstIndex + 1;		}		if (CMAP(_new).lastIndex > CMAP(_new).availColors-1)		{			myXtWarning("CmapWidget: LastIndex (%d) cannot be more than greatest index (%d).	LastIndex set to %d.",				CMAP(_new).lastIndex, CMAP(_new).availColors-1, CMAP(_new).availColors-1);			CMAP(_new).lastIndex = CMAP(_new).availColors-1;		}		needResize = TRUE;	}	if (needResize)	{		if (CMAP(_new).mappingTable == (Pixel *)NULL)			CMAP(_new).usedColors = MIN(CMAP(_new).lastIndex-CMAP(_new).firstIndex+1, CMAP(_new).availColors);		else			CMAP(_new).usedColors = CMAP(_new).lastIndex-CMAP(_new).firstIndex+1;		CMAP(_new).numX = (int)floor(sqrt((double)(CMAP(_new).usedColors)));		CMAP(_new).numY = CMAP(_new).usedColors / CMAP(_new).numX + (CMAP(_new).usedColors % CMAP(_new).numX ? 1 : 0);		redisplay = TRUE;	}	if (CMAP(_new).selected != CMAP(_current).selected)	{		if (CMAP(_new).selected < 0)		{			myXtWarning("CmapWidget: Selected pixel cannot be negative! Selected set to 0.");			CMAP(_new).selected = 0;		}		if (CMAP(_new).selected > CMAP(_new).usedColors-1)		{			myXtWarning("CmapWidget: Selected pixel (%d) is greater than %d. Selected set to %d.",				CMAP(_new).selected, CMAP(_new).usedColors-1, CMAP(_new).usedColors-1);			CMAP(_new).selected = CMAP(_new).lastIndex;		}		if (CMAP(_new).selected < 0)		{			myXtWarning("CmapWidget: Selected pixel (%d) cannot be negative. Selected set to 0.",				CMAP(_new).selected);			CMAP(_new).selected = 0;		}		drawLabel(_current, CMAP(_current).eraseGC);		if (CMAP(_new).mappingTable == (Pixel *)NULL)			CMAP(_new).selectedColor.pixel = CMAP(_new).selected+CMAP(_new).firstIndex;		else			CMAP(_new).selectedColor.pixel = ((Pixel *)CMAP(_new).mappingTable)[CMAP(_new).selected+CMAP(_new).firstIndex];		XQueryColor(display, _new->core.colormap, &CMAP(_new).selectedColor);		reString(_new);		drawLabel(_new, CMAP(_new).foregroundGC);		drawBox(_new, CMAP(_current).selected);		drawSelected(_new, CMAP(_new).selected);		XFlush(XtDisplay(_new));	}	if (CMAP(_new).mappingTable != CMAP(_current).mappingTable)		redisplay = TRUE;	if (CMAP(_new).margin != CMAP(_current).margin)	{		CMAP(_new).halfMargin = CMAP(_new).margin/2;		redisplay = TRUE;	}			gcValues.font = THE_FONT(_new)->fid; 	if (newErase)	{		XtReleaseGC((Widget)_new, CMAP(_new).eraseGC);		CMAP(_new).eraseGC = XtGetGC((Widget)_new, gcMask, &gcValues);	}	if (newSelected)	{		XtReleaseGC((Widget)_new, CMAP(_new).foregroundGC);		gcValues.foreground = FG(_new);		CMAP(_new).foregroundGC = XtGetGC((Widget)_new, GCFont | GCForeground, &gcValues);	}	if (HT(_new) != HT(_current))	{		if (HT(_current) > 0)			XtFree((char *)HRECT(_current));		if (HT(_new) > 0)			HRECT(_new) = (XRectangle *)XtMalloc(sizeof(XRectangle) * HT(_new));		redisplay = TRUE;	}	if ((CMAP(_new).boxHeight != CMAP(_current).boxHeight) ||			(CMAP(_new).boxWidth != CMAP(_current).boxWidth))		redisplay = TRUE;	if (redisplay)		reString(_new);	return redisplay;}static void reString(_cw)Widget _cw;{	sprintf(CMAP(_cw).label, RGB_STRING, CMAP(_cw).selectedColor.red, CMAP(_cw).selectedColor.green,		CMAP(_cw).selectedColor.blue, CMAP(_cw).selected+1, CMAP(_cw).usedColors);	CMAP(_cw).labelHeight = CMAP(_cw).font->ascent + CMAP(_cw).font->descent;	CMAP(_cw).labelWidth = XTextWidth(CMAP(_cw).font, CMAP(_cw).label, strlen(CMAP(_cw).label));	CMAP(_cw).labelPos.x = (TWIDTH(_cw)/2) - (CMAP(_cw).labelWidth)/2 + TX(_cw);	CMAP(_cw).labelPos.y = CMAP(_cw).drawPos.y + (CMAP(_cw).numY * CMAP(_cw).realBoxHeight) + CMAP(_cw).font->ascent +		CMAP(_cw).margin;}static int xYtoBox(_cw, _x, _y)Widget _cw; int _x; int _y;{	int trux, truy;	int twidth, theight;	trux = _x - CMAP(_cw).drawPos.x;	truy = _y - CMAP(_cw).drawPos.y;	twidth = CMAP(_cw).numX * CMAP(_cw).realBoxWidth;	theight = CMAP(_cw).numY * CMAP(_cw).realBoxHeight; 	if ((trux < 0) || (truy < 0) || (trux >= twidth) || (truy >= theight))		return -1;	return trux/CMAP(_cw).realBoxWidth + truy/CMAP(_cw).realBoxHeight * CMAP(_cw).numX;}static void left(_cw, _event, _argv, _argc)Widget _cw; XEvent *_event; String *_argv; Cardinal *_argc;{	int box;	Arg warg;	CmapCallbackStruct ccs;	if (*_argc != 0)		myXtWarning("CmapWidget: Left takes no paramaters.");	box = ((CMAP(_cw).selected - 1) < 0) ? CMAP(_cw).usedColors - 1 : CMAP(_cw).selected - 1;	XtSetArg(warg, XtNselected, box);	XtSetValues((Widget)_cw, &warg, 1);	ccs.reason = CMAP_LEFT;	ccs.event = _event;	ccs.color = CMAP(_cw).selectedColor;	XtCallCallbacks((Widget)_cw, XtNchangeCallback, &ccs);}static void right(_cw, _event, _argv, _argc)Widget _cw; XEvent *_event;String *_argv; Cardinal *_argc;{	int box;	Arg warg;	CmapCallbackStruct ccs;	if (*_argc != 0)		myXtWarning("CmapWidget: Right takes no paramaters.");	box = ((CMAP(_cw).selected + 1) == CMAP(_cw).usedColors ) ? 0	: CMAP(_cw).selected + 1;	XtSetArg(warg, XtNselected, box);	XtSetValues((Widget)_cw, &warg, 1);	ccs.reason = CMAP_RIGHT;	ccs.event = _event;	ccs.color = CMAP(_cw).selectedColor;	XtCallCallbacks((Widget)_cw, XtNchangeCallback, &ccs);}static void up(_cw, _event, _argv, _argc)Widget _cw; XEvent *_event;String *_argv;Cardinal *_argc;{	int box;	Arg warg;	CmapCallbackStruct ccs;	if (*_argc != 0)		myXtWarning("CmapWidget: Up takes no paramaters.");	box = CMAP(_cw).selected - CMAP(_cw).numX;	if (box < 0)	{		box += CMAP(_cw).numX * (CMAP(_cw).numY+1) + 1;		while (box > CMAP(_cw).usedColors-1)			box -= CMAP(_cw).numX;	}	XtSetArg(warg, XtNselected, box);	XtSetValues((Widget)_cw, &warg, 1);	ccs.reason = CMAP_UP;	ccs.event = _event;	ccs.color = CMAP(_cw).selectedColor;	XtCallCallbacks((Widget)_cw, XtNchangeCallback, &ccs);}static void down(_cw, _event, _argv, _argc)Widget _cw;XEvent *_event;String *_argv;Cardinal *_argc;{	int box;	Arg warg;	CmapCallbackStruct ccs;	if (*_argc != 0)		myXtWarning("CmapWidget: Down takes no paramaters.");	box = CMAP(_cw).selected + CMAP(_cw).numX;	if (box >= CMAP(_cw).usedColors)	{		box -= CMAP(_cw).numX * (CMAP(_cw).numY+1) + 1;		while (box < 0)			box += CMAP(_cw).numX;	} 	XtSetArg(warg, XtNselected, box);	XtSetValues((Widget)_cw, &warg, 1);	ccs.reason = CMAP_DOWN;	ccs.event = _event;	ccs.color = CMAP(_cw).selectedColor;	XtCallCallbacks((Widget)_cw, XtNchangeCallback, &ccs);}static void cselect(_cw, _event, _argv, _argc)Widget _cw;XEvent *_event;String *_argv;Cardinal *_argc;{	int box;	int x, y;	Arg warg;	CmapCallbackStruct ccs;	switch (_event->type)	{		case ButtonPress:		case ButtonRelease:			x = ((XButtonEvent *)_event)->x;			y = ((XButtonEvent *)_event)->y;			break;		case KeyPress:		case KeyRelease:			x = ((XKeyEvent *)_event)->x;			y = ((XKeyEvent *)_event)->y;			break;		case MotionNotify:			x = ((XMotionEvent *)_event)->x;			y = ((XMotionEvent *)_event)->y;			break;		default: return; break;	}	if ((box = xYtoBox(_cw, x, y)) < 0)		return;	if (XmProcessTraversal((Widget)_cw, XmTRAVERSE_CURRENT) == FALSE)		XmProcessTraversal((Widget)_cw, XmTRAVERSE_CURRENT);	if (box == CMAP(_cw).selected)		return;	if (box > CMAP(_cw).usedColors-1)		return;	XtSetArg(warg, XtNselected, box);	XtSetValues((Widget)_cw, &warg, 1);	ccs.reason = CMAP_SELECT;	ccs.event = _event;	ccs.color = CMAP(_cw).selectedColor;	XtCallCallbacks((Widget)_cw, XtNchangeCallback, &ccs);}#define MAXSTRING 300#ifdef __STDC__static voidmyXtWarning(char *_format, ...){	va_list parms;	char dest[MAXSTRING];	va_start(parms, _format);#elsestatic void myXtWarning(_format, va_alist)char *_format; va_dcl	 /* stupid define already has a ; on it */{	va_list parms;	char dest[MAXSTRING];	va_start(parms);#endif	vsprintf(dest, _format, parms);	va_end(parms);	XtWarning(dest);}/* External routines *//* If you have** an application that plays with the colormap, you ** must verify that the label is correct for that ** color (ie, the r,g,b values are correct.** * NOTE * The event is NULL in the callback.*/void CmapVerifySelectedColor(_cw, _notify)Widget _cw;Boolean _notify;{	XColor color;	CmapWidget cw;	if (!(XtIsCmap(_cw)))	{		myXtWarning("Widget passed to CmapVerifySelectedColor is not a Cmap widget!");		return;	}	cw = (CmapWidget)_cw;	color.pixel = CMAP(cw).selected;	if (CMAP(cw).mappingTable == (Pixel *)NULL)		color.pixel = CMAP(cw).selected+CMAP(cw).firstIndex;	else		color.pixel = ((Pixel *)CMAP(cw).mappingTable)[CMAP(cw).selected+CMAP(cw).firstIndex];	XQueryColor(XtDisplay(cw), cw->core.colormap, &color);	drawLabel((Widget)cw, CMAP(cw).eraseGC);	CMAP(cw).selectedColor = color;	reString((Widget)cw);	drawLabel((Widget)cw, CMAP(cw).foregroundGC);	if (_notify)	{		CmapCallbackStruct ccs;		ccs.event = (XEvent *)NULL;		ccs.color = color;		ccs.reason = CMAP_VERIFY;		XtCallCallbacks(_cw, XtNchangeCallback, &ccs);	}}/* ** Currently selected box in colormap.** If the widget is not a Cmap widget, the returned value is undefined */XColor CmapGetSelected(_cw)Widget _cw;{	if (!XtIsCmap(_cw))	{		XColor xc;		myXtWarning("Widget passed to CmapGetSelected is not a Cmap widget!");		return xc;	}	return ((CmapWidget)_cw)->cmap.selectedColor;}

⌨️ 快捷键说明

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