Blame src/ParseCol.c

Packit Service dc579d
/*
Packit Service dc579d
Packit Service dc579d
Copyright 1985, 1998  The Open Group
Packit Service dc579d
Packit Service dc579d
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service dc579d
documentation for any purpose is hereby granted without fee, provided that
Packit Service dc579d
the above copyright notice appear in all copies and that both that
Packit Service dc579d
copyright notice and this permission notice appear in supporting
Packit Service dc579d
documentation.
Packit Service dc579d
Packit Service dc579d
The above copyright notice and this permission notice shall be included in
Packit Service dc579d
all copies or substantial portions of the Software.
Packit Service dc579d
Packit Service dc579d
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service dc579d
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service dc579d
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service dc579d
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service dc579d
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service dc579d
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service dc579d
Packit Service dc579d
Except as contained in this notice, the name of The Open Group shall not be
Packit Service dc579d
used in advertising or otherwise to promote the sale, use or other dealings
Packit Service dc579d
in this Software without prior written authorization from The Open Group.
Packit Service dc579d
Packit Service dc579d
*/
Packit Service dc579d
Packit Service dc579d
#ifdef HAVE_CONFIG_H
Packit Service dc579d
#include <config.h>
Packit Service dc579d
#endif
Packit Service dc579d
#include <stdio.h>
Packit Service dc579d
#include "Xlibint.h"
Packit Service dc579d
#include "Xcmsint.h"
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
Status
Packit Service dc579d
XParseColor (
Packit Service dc579d
	register Display *dpy,
Packit Service dc579d
        Colormap cmap,
Packit Service dc579d
	_Xconst char *spec,
Packit Service dc579d
	XColor *def)
Packit Service dc579d
{
Packit Service dc579d
	register int n, i;
Packit Service dc579d
	int r, g, b;
Packit Service dc579d
	char c;
Packit Service dc579d
	XcmsCCC ccc;
Packit Service dc579d
	XcmsColor cmsColor;
Packit Service dc579d
Packit Service dc579d
        if (!spec) return(0);
Packit Service dc579d
	n = strlen (spec);
Packit Service dc579d
	if (*spec == '#') {
Packit Service dc579d
	    /*
Packit Service dc579d
	     * RGB
Packit Service dc579d
	     */
Packit Service dc579d
	    spec++;
Packit Service dc579d
	    n--;
Packit Service dc579d
	    if (n != 3 && n != 6 && n != 9 && n != 12)
Packit Service dc579d
		return (0);
Packit Service dc579d
	    n /= 3;
Packit Service dc579d
	    g = b = 0;
Packit Service dc579d
	    do {
Packit Service dc579d
		r = g;
Packit Service dc579d
		g = b;
Packit Service dc579d
		b = 0;
Packit Service dc579d
		for (i = n; --i >= 0; ) {
Packit Service dc579d
		    c = *spec++;
Packit Service dc579d
		    b <<= 4;
Packit Service dc579d
		    if (c >= '0' && c <= '9')
Packit Service dc579d
			b |= c - '0';
Packit Service dc579d
		    else if (c >= 'A' && c <= 'F')
Packit Service dc579d
			b |= c - ('A' - 10);
Packit Service dc579d
		    else if (c >= 'a' && c <= 'f')
Packit Service dc579d
			b |= c - ('a' - 10);
Packit Service dc579d
		    else return (0);
Packit Service dc579d
		}
Packit Service dc579d
	    } while (*spec != '\0');
Packit Service dc579d
	    n <<= 2;
Packit Service dc579d
	    n = 16 - n;
Packit Service dc579d
	    def->red = r << n;
Packit Service dc579d
	    def->green = g << n;
Packit Service dc579d
	    def->blue = b << n;
Packit Service dc579d
	    def->flags = DoRed | DoGreen | DoBlue;
Packit Service dc579d
	    return (1);
Packit Service dc579d
	}
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
#ifdef XCMS
Packit Service dc579d
	/*
Packit Service dc579d
	 * Let's Attempt to use Xcms and i18n approach to Parse Color
Packit Service dc579d
	 */
Packit Service dc579d
	if ((ccc = XcmsCCCOfColormap(dpy, cmap)) != (XcmsCCC)NULL) {
Packit Service dc579d
	    const char *tmpName = spec;
Packit Service dc579d
Packit Service dc579d
	    switch (_XcmsResolveColorString(ccc, &tmpName, &cmsColor,
Packit Service dc579d
					    XcmsRGBFormat)) {
Packit Service dc579d
	    case XcmsSuccess:
Packit Service dc579d
	    case XcmsSuccessWithCompression:
Packit Service dc579d
		cmsColor.pixel = def->pixel;
Packit Service dc579d
		_XcmsRGB_to_XColor(&cmsColor, def, 1);
Packit Service dc579d
		return(1);
Packit Service dc579d
	    case XcmsFailure:
Packit Service dc579d
	    case _XCMS_NEWNAME:
Packit Service dc579d
		/*
Packit Service dc579d
		 * if the result was _XCMS_NEWNAME tmpName points to
Packit Service dc579d
		 * a string in cmsColNm.c:pairs table, for example,
Packit Service dc579d
		 * gray70 would become tekhvc:0.0/70.0/0.0
Packit Service dc579d
		 */
Packit Service dc579d
		break;
Packit Service dc579d
	    }
Packit Service dc579d
	}
Packit Service dc579d
#endif
Packit Service dc579d
Packit Service dc579d
	/*
Packit Service dc579d
	 * Xcms and i18n methods failed, so lets pass it to the server
Packit Service dc579d
	 * for parsing.
Packit Service dc579d
	 */
Packit Service dc579d
	{
Packit Service dc579d
	    xLookupColorReply reply;
Packit Service dc579d
	    register xLookupColorReq *req;
Packit Service dc579d
	    LockDisplay(dpy);
Packit Service dc579d
	    GetReq (LookupColor, req);
Packit Service dc579d
	    req->cmap = cmap;
Packit Service dc579d
	    req->nbytes = n = strlen(spec);
Packit Service dc579d
	    req->length += (n + 3) >> 2;
Packit Service dc579d
	    Data (dpy, spec, (long)n);
Packit Service dc579d
	    if (!_XReply (dpy, (xReply *) &reply, 0, xTrue)) {
Packit Service dc579d
		UnlockDisplay(dpy);
Packit Service dc579d
		SyncHandle();
Packit Service dc579d
		return (0);
Packit Service dc579d
		}
Packit Service dc579d
	    def->red = reply.exactRed;
Packit Service dc579d
	    def->green = reply.exactGreen;
Packit Service dc579d
	    def->blue = reply.exactBlue;
Packit Service dc579d
	    def->flags = DoRed | DoGreen | DoBlue;
Packit Service dc579d
	    UnlockDisplay(dpy);
Packit Service dc579d
	    SyncHandle();
Packit Service dc579d
	    return (1);
Packit Service dc579d
	}
Packit Service dc579d
}