// Copyright status: this file is in the public domain. #include #include "lx.h" #include "proto.h" #include "internal.h" void lx_PolyText16(LX_CONN *xc, LX_XID drawable, LX_XID gc, int x, int y, int nitems, const LX_TEXTITEM16 *items) { int reqlen; unsigned char *req; int i; int o; int j; int k; const unsigned short int *tp; if ((xc->flags & XCF_FAIL) || (x < -32768) || (x > 32767) || (y < -32768) || (y > 32767) || (nitems < 0)) { lx__bad_call(xc,"lx_PolyText16"); 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_PolyText16"); return; } reqlen += 2 + (items[i].nchars * 2); } reqlen = (reqlen + 3) & ~3; req = malloc(reqlen); if (! req) { lx__nomem_fail(xc); return; } req[0] = LX_CORE_PolyText16; req[1] = 0; // unused 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+(2*k) > reqlen) lx_abort(); req[o++] = (unsigned char)k; req[o++] = (unsigned char)(signed char)items[i].delta; tp = items[i].text; for (j=0;j