#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_AllocNamedColor PRIV_AllocNamedColor; struct priv_AllocNamedColor { unsigned char *req; unsigned int *pixp; unsigned int *xrp; unsigned int *xgp; unsigned int *xbp; unsigned int *vrp; unsigned int *vgp; unsigned int *vbp; } ; static void done_AllocNamedColor(LX_OP *op, const unsigned char *rep) { PRIV_AllocNamedColor *p; p = op->reqpriv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"AllocNamedColor response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } if (p->pixp) *p->pixp = r_card32(rep+8); if (p->xrp) *p->xrp = r_card16(rep+12); if (p->xgp) *p->xgp = r_card16(rep+14); if (p->xbp) *p->xbp = r_card16(rep+16); if (p->vrp) *p->vrp = r_card16(rep+18); if (p->vgp) *p->vgp = r_card16(rep+20); if (p->vbp) *p->vbp = r_card16(rep+22); } while (0); op->reqpriv = 0; free(p->req); free(p); } static LX_OP *do_AllocNamedColor( const char *call, LX_CONN *xc, LX_XID cmap, const char *name, int namelen, unsigned int *pixp, unsigned int *xrp, unsigned int *xgp, unsigned int *xbp, unsigned int *vrp, unsigned int *vgp, unsigned int *vbp ) { unsigned char *req; int reqlen; PRIV_AllocNamedColor *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,call); return(0); } if (namelen == -1) namelen = strlen(name); if ((namelen < 0) || (namelen > 65535)) { lx__bad_call(xc,call); return(0); } reqlen = 3 + ((namelen + 3) >> 2); req = malloc(reqlen*4); if (! req) { lx__nomem_fail(xc); return(0); } p = malloc(sizeof(PRIV_AllocNamedColor)); if (! p) { free(req); lx__nomem_fail(xc); return(0); } p->req = req; p->pixp = pixp; p->xrp = xrp; p->xgp = xgp; p->xbp = xbp; p->vrp = vrp; p->vgp = vgp; p->vbp = vbp; req[0] = XP_REQ_AllocNamedColor; req[1] = 0; w_card16(req+2,reqlen); w_card32(req+4,cmap); w_card16(req+8,namelen); bcopy(name,req+16,namelen); return(lx__expect_reply(xc,req,reqlen,&done_AllocNamedColor,p,0)); } LX_OP *lx_AllocNamedColor(LX_CONN *xc, LX_XID cmap, const char *name, int len, unsigned int *pixp, unsigned int *xrp, unsigned int *xgp, unsigned int *xbp, unsigned int *vrp, unsigned int *vgp, unsigned int *vbp) { return(do_AllocNamedColor("lx_AllocNamedColor",xc,cmap,name,len,pixp,xrp,xgp,xbp,vrp,vgp,vbp)); } LX_OP *lx_AllocNamedColor_rgb(LX_CONN *xc, LX_XID cmap, const char *name, int len, unsigned int *pixp, LX_RGB *xp, LX_RGB *vp) { return(do_AllocNamedColor("lx_AllocNamedColor_rgb",xc,cmap,name,len,pixp, xp?&xp->r:0,xp?&xp->g:0,xp?&xp->b:0,vp?&vp->r:0,vp?&vp->g:0,vp?&vp->b:0)); }