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