#include #include "lx.h" #include "internal.h" typedef struct priv_draw_rectangle PRIV_DRAW_RECTANGLE; #define BATCHSIZE 100 struct priv_draw_rectangle { LX_XID d; LX_XID gc; int nrects; LX_RECTANGLE rects[BATCHSIZE]; } ; static void *chain_draw_rectangle_start(LX_CONN *xc __attribute__((__unused__))) { PRIV_DRAW_RECTANGLE *p; p = malloc(sizeof(PRIV_DRAW_RECTANGLE)); p->d = LX_WINDOW_None; p->gc = LX_GC_None; p->nrects = 0; return(p); } static void chain_draw_rectangle_done(LX_CONN *xc, void *pv) { PRIV_DRAW_RECTANGLE *p; p = pv; lx__PolyRectangle_inbatch(xc,p->d,p->gc,p->nrects,&p->rects[0]); free(p); } static CHAINER chain_draw_rectangle = CHAINER_INIT(draw_rectangle); static void chain_draw_rectangle_changed(LX_CONN *xc, void *pv) { PRIV_DRAW_RECTANGLE *p; p = pv; if (p->d != LX_WINDOW_None) lx__PolyRectangle_inbatch(xc,p->d,p->gc,p->nrects,&p->rects[0]); p->nrects = 0; } void lx_draw_rectangle(LX_CONN *xc, LX_XID d, LX_XID gc, int x, int y, int w, int h) { LX_RECTANGLE *r; PRIV_DRAW_RECTANGLE *p; if ((x < -32768) || (x > 32767) || (y < -32768) || (y > 32767) || (w < 0) || (w > 65535) || (h < 0) || (h > 65535)) { lx__bad_call(xc,"lx_draw_rectangle"); return; } p = lx__chainable(xc,&chain_draw_rectangle); if (! p) { lx__nomem_fail(xc); return; } if ((p->d != d) || (p->gc != gc) || (p->nrects >= BATCHSIZE)) { chain_draw_rectangle_changed(xc,p); p->d = d; p->gc = gc; } r = &p->rects[p->nrects++]; r->x = x; r->y = y; r->w = w; r->h = h; }