#define NEED_REPLIES
#include <stdio.h>
#include "Xlibint.h"
#include "Xcmsint.h"
extern void _XColor_to_XcmsRGB();
extern void _XcmsRGB_to_XColor();
extern void _XcmsResolveColor();
extern void _XcmsUnresolveColor();
extern Status _XcmsResolveColorString();
#if NeedFunctionPrototypes
Status
XcmsLookupColor (
Display *dpy,
Colormap cmap,
_Xconst char *colorname,
XcmsColor *pColor_exact_return,
XcmsColor *pColor_scrn_return,
XcmsColorFormat result_format)
#else
Status
XcmsLookupColor(dpy, cmap, colorname, pColor_exact_return, pColor_scrn_return,
result_format)
Display *dpy;
Colormap cmap;
char *colorname;
XcmsColor *pColor_exact_return;
XcmsColor *pColor_scrn_return;
XcmsColorFormat result_format;
#endif
{
Status retval1 = XcmsSuccess;
Status retval2 = XcmsSuccess;
XcmsCCC ccc;
register int n;
xLookupColorReply reply;
register xLookupColorReq *req;
XColor def, scr;
if (dpy == NULL || colorname[0] == '\0' || pColor_scrn_return == 0
|| pColor_exact_return == NULL) {
return(XcmsFailure);
}
if ((ccc = XcmsCCCOfColormap(dpy, cmap)) == (XcmsCCC)NULL) {
return(XcmsFailure);
}
if ((retval1 = _XcmsResolveColorString(ccc, &colorname,
pColor_exact_return, result_format)) == XcmsFailure) {
return(XcmsFailure);
}
if (retval1 == _XCMS_NEWNAME) {
goto PassToServer;
}
memcpy((char *)pColor_scrn_return, (char *)pColor_exact_return,
sizeof(XcmsColor));
if (pColor_scrn_return->format == XcmsRGBFormat) {
retval2 = XcmsSuccess;
} else if ((retval2 = XcmsConvertColors(ccc, pColor_scrn_return, 1,
XcmsRGBFormat, (Bool *)NULL)) == XcmsFailure) {
return(XcmsFailure);
}
if (result_format == XcmsUndefinedFormat) {
result_format = pColor_exact_return->format;
}
if (result_format == XcmsRGBFormat) {
_XcmsUnresolveColor(ccc, pColor_scrn_return);
} else {
_XcmsResolveColor(ccc, pColor_scrn_return);
if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
(Bool *) NULL) == XcmsFailure) {
return(XcmsFailure);
}
}
return(retval1 > retval2 ? retval1 : retval2);
PassToServer:
LockDisplay(dpy);
GetReq (LookupColor, req);
req->cmap = cmap;
req->nbytes = n = strlen(colorname);
req->length += (n + 3) >> 2;
Data (dpy, colorname, (long)n);
if (!_XReply (dpy, (xReply *) &reply, 0, xTrue)) {
UnlockDisplay(dpy);
SyncHandle();
return (XcmsFailure);
}
def.red = reply.exactRed;
def.green = reply.exactGreen;
def.blue = reply.exactBlue;
scr.red = reply.screenRed;
scr.green = reply.screenGreen;
scr.blue = reply.screenBlue;
UnlockDisplay(dpy);
SyncHandle();
_XColor_to_XcmsRGB(ccc, &def, pColor_exact_return, 1);
_XColor_to_XcmsRGB(ccc, &scr, pColor_scrn_return, 1);
if (result_format != XcmsRGBFormat
&& result_format != XcmsUndefinedFormat) {
if (XcmsConvertColors(ccc, pColor_exact_return, 1, result_format,
(Bool *) NULL) == XcmsFailure) {
return(XcmsFailure);
}
if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
(Bool *) NULL) == XcmsFailure) {
return(XcmsFailure);
}
}
return(XcmsSuccess);
}