#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_AllocNamedColor PRIV_AllocNamedColor; struct priv_AllocNamedColor { 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, void *pv) { PRIV_AllocNamedColor *p; p = pv; 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); 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 reqhdr[12]; int reqlen; PRIV_AllocNamedColor *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,call); return(0); } lx__nochain(xc); if (namelen == -1) namelen = strlen(name); if ((namelen < 0) || (namelen > 65535)) { lx__bad_call(xc,call); return(0); } reqlen = 3 + ((namelen + 3) >> 2); p = malloc(sizeof(PRIV_AllocNamedColor)); if (! p) { lx__nomem_fail(xc); return(0); } p->pixp = pixp; p->xrp = xrp; p->xgp = xgp; p->xbp = xbp; p->vrp = vrp; p->vgp = vgp; p->vbp = vbp; reqhdr[0] = XP_REQ_AllocNamedColor; reqhdr[1] = 0; w_card16(&reqhdr[2],reqlen); w_card32(&reqhdr[4],cmap); w_card16(&reqhdr[8],namelen); w_card16(&reqhdr[10],0); lx__just_send(xc,&reqhdr[0],12); lx__just_send(xc,name,namelen); lx__send_padding(xc,namelen); return(lx__expect_reply(xc,0,0,&done_AllocNamedColor,p)); } 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)); }