#include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_QueryTextExtents PRIV_QueryTextExtents; struct priv_QueryTextExtents { void *req; LX_TEXTDIRECTION *dirp; int *ascp; int *descp; LX_CHARINFO *overallp; } ; static void done_QueryTextExtents(LX_OP *op, const unsigned char *rep) { PRIV_QueryTextExtents *p; LX_TEXTDIRECTION dir; p = op->reqpriv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"QueryTextExtents response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } switch (rep[1]) { case 0: dir = LX_TEXTDIRECTION_LeftToRight; break; case 1: dir = LX_TEXTDIRECTION_RightToLeft; break; default: lx__protoerr(op->conn,"QueryTextExtents response has bad draw-direction value %d",rep[1]); break <"ret">; } if (p->dirp) *p->dirp = dir; if (p->ascp) *p->ascp = r_int16(rep+8); if (p->descp) *p->descp = r_int16(rep+10); if (p->overallp) *p->overallp = (LX_CHARINFO){ .lbearing = r_int32(rep+20), .rbearing = r_int32(rep+24), .width = r_int32(rep+16), .ascent = r_int16(rep+12), .descent = r_int16(rep+14), .attr = 0 }; } while (0); op->reqpriv = 0; free(p->req); free(p); } LX_OP *lx_QueryTextExtents8( LX_CONN *xc, LX_XID fontable, const unsigned char *str, int len, LX_TEXTDIRECTION *dirp, int *ascp, int *descp, LX_CHARINFO *overallp ) { int reqlen; unsigned char *req; PRIV_QueryTextExtents *p; int o; int i; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_QueryTextExtents8"); return(0); } if (len == -1) len = strlen((const void *)str); if ((len < 0) || (len > (65535*2))) { lx__bad_call(xc,"lx_QueryTextExtents8"); return(0); } reqlen = 2 + (((2 * len) + 3) >> 2); if (reqlen > 65535) { lx__bad_call(xc,"lx_QueryTextExtents8"); return(0); } req = malloc(reqlen<<2); if (! req) { lx__nomem_fail(xc); return(0); } p = malloc(sizeof(PRIV_QueryTextExtents)); if (! p) { free(req); lx__nomem_fail(xc); return(0); } p->req = req; p->dirp = dirp; p->ascp = ascp; p->descp = descp; p->overallp = overallp; req[0] = XP_REQ_QueryTextExtents; req[1] = (len & 1); w_card16(req+2,reqlen); w_card32(req+4,fontable); o = 8; for (i=0;iflags & XCF_FAIL) { lx__bad_call(xc,"lx_QueryTextExtents16"); return(0); } if ((len < 0) || (len > (65535*2))) { lx__bad_call(xc,"lx_QueryTextExtents16"); return(0); } reqlen = 2 + (((2 * len) + 3) >> 2); if (reqlen > 65535) { lx__bad_call(xc,"lx_QueryTextExtents16"); return(0); } req = malloc(reqlen<<2); if (! req) { lx__nomem_fail(xc); return(0); } p = malloc(sizeof(PRIV_QueryTextExtents)); if (! p) { free(req); lx__nomem_fail(xc); return(0); } p->req = req; p->dirp = dirp; p->ascp = ascp; p->descp = descp; p->overallp = overallp; req[0] = XP_REQ_QueryTextExtents; req[1] = (len & 1); w_card16(req+2,reqlen); w_card32(req+4,fontable); o = 8; for (i=0;i