// Copyright status: this file is in the public domain. #include #include #include "lx.h" #include "proto.h" #include "internal.h" void lx_PolyText8(LX_CONN *xc, LX_XID drawable, LX_XID gc, int x, int y, int nitems, const LX_TEXTITEM8 *items) { int reqlen; unsigned char *req; int i; int o; int k; if ((xc->flags & XCF_FAIL) || (x < -32768) || (x > 32767) || (y < -32768) || (y > 32767) || (nitems < 0)) { lx__bad_call(xc,"lx_PolyText8"); return; } lx__nochain(xc); reqlen = 16; for (i=nitems-1;i>=0;i--) { if (items[i].font != LX_FONT_None) { reqlen += 5; } if ( (items[i].nchars < 0) || (items[i].nchars > 254) || (items[i].delta < -128) || (items[i].delta > 127) ) { lx__bad_call(xc,"lx_PolyText8"); return; } reqlen += 2 + items[i].nchars; } reqlen = (reqlen + 3) & ~3; if ((reqlen >> 2) > 65535) { lx__bad_call(xc,"lx_PolyText8"); return; } req = malloc(reqlen); if (! req) { lx__nomem_fail(xc); return; } req[0] = XP_REQ_PolyText8; req[1] = 0; w_card16(req+2,reqlen>>2); w_card32(req+4,drawable); w_card32(req+8,gc); w_int16(req+12,x); w_int16(req+14,y); o = 16; for (i=0;i reqlen) lx_abort(); req[o++] = 255; w_card32be(req+o,items[i].font); // XXX update GC shadow, if any } k = items[i].nchars; if (o+2+k > reqlen) lx_abort(); req[o++] = (unsigned char)k; req[o++] = (unsigned char)(signed char)items[i].delta; if (k) { bcopy(items[i].text,req+o,k); o += k; } } if (((o+3)&~3) != reqlen) lx_abort(); // must pad with 0s so padding is harmless as a textitem while (o < reqlen) req[o++] = 0; lx__send_req_free(xc,req,reqlen); }