// Copyright status: this file is in the public domain. #include #include "lx.h" #include "proto.h" #include "internal.h" #if LX_XID_Error == 0 #define OTHER 1 #else #define OTHER 0 #endif LX_XID lx_ChangeSGC_va(LX_CONN *xc, LX_SGC sgcid, ...) { SGC *sgc; va_list ap; int key; int pv; int push; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ChangeSGC_va"); return(LX_XID_Error); } sgc = lx__lookup_sgc(xc,sgcid); if (! sgc) { lx__bad_call(xc,"lx_ChangeSGC_va"); return(LX_XID_Error); } push = 0; va_start(ap,sgcid); while <"args"> (1) { key = va_arg(ap,int); #define SIMPLE(name,type,suf,bit,field)\ case LX__GCV_##name: \ { type arg; \ arg = va_arg(ap,type); \ sgc->setv.field = arg; \ sgc->set |= LX_GCM_##name; \ break; \ } #define MAPPED(name,converter,bit,field)\ case LX__GCV_##name: \ { unsigned long int v; \ v = va_arg(ap,unsigned long int); \ pv = converter(v); \ if (pv < 0) \ { lx__bad_call(xc,"lx_ChangeGC_va"); \ return(LX_XID_Error); \ } \ sgc->setv.field = v; \ sgc->set |= LX_GCM_##name; \ break; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ case LX__GCV_##name: \ { type arg; \ arg = lx__boolean_to_proto(va_arg(ap,type)); \ sgc->setv.field = arg; \ sgc->set |= LX_GCM_##name; \ break; \ } #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) switch (key) { GCFIELDS case LX__GCV_END: break <"args">; case LX__GCV_PUSH: push = 1; break <"args">; default: lx_abort(); break; } #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK } va_end(ap); return(push?lx_SGC_GC(xc,sgcid):OTHER); } LX_XID lx_ChangeSGC_attr(LX_CONN *xc, LX_SGC sgcid, unsigned int mask, const LX_GC_ATTRIBUTES *attr) { SGC *sgc; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_ChangeSGC_attr"); return(LX_XID_Error); } sgc = lx__lookup_sgc(xc,sgcid); if (! sgc) { lx__bad_call(xc,"lx_ChangeSGC_attr"); return(LX_XID_Error); } #define SIMPLE(name,type,suf,bit,field)\ if (mask & LX_GCM_##name) \ { mask &= ~LX_GCM_##name; \ sgc->setv.field = attr->field; \ sgc->set |= LX_GCM_##name; \ } #define MAPPED(name,converter,bit,field)\ if (mask & LX_GCM_##name) \ { mask &= ~LX_GCM_##name; \ if (converter(attr->field) < 0) \ { lx__bad_call(xc,"lx_ChangeSGC_attr"); \ return(LX_XID_Error); \ } \ sgc->setv.field = attr->field; \ sgc->set |= LX_GCM_##name; \ } #define GRAPHICSEXPOSURES(name,type,suf,bit,field)\ if (mask & LX_GCM_##name) \ { int v; \ v = lx__boolean_to_proto(attr->field); \ mask &= ~LX_GCM_##name; \ sgc->setv.field = v; \ sgc->set |= LX_GCM_##name; \ } #define CLIPMASK(name,type,suf,bit,field) SIMPLE(name,type,suf,bit,field) GCFIELDS #undef SIMPLE #undef MAPPED #undef GRAPHICSEXPOSURES #undef CLIPMASK if (mask & ~LX_GCM_PUSH) { lx__bad_call(xc,"lx_ChangeSGC_attr"); return(LX_XID_Error); } return((mask&LX_GCM_PUSH)?lx_SGC_GC(xc,sgcid):OTHER); }