// Copyright status: this file is in the public domain. #include #include "lx.h" #include "internal.h" typedef struct priv_fill_rectangle PRIV_FILL_RECTANGLE; #define BATCHSIZE 100 struct priv_fill_rectangle { LX_XID d; LX_XID gc; int nrects; LX_RECTANGLE rects[BATCHSIZE]; } ; static void *chain_fill_rectangle_start(LX_CONN *xc __attribute__((__unused__))) { PRIV_FILL_RECTANGLE *p; p = malloc(sizeof(PRIV_FILL_RECTANGLE)); p->d = LX_WINDOW_None; p->gc = LX_GC_None; p->nrects = 0; return(p); } static void chain_fill_rectangle_done(LX_CONN *xc, void *pv) { PRIV_FILL_RECTANGLE *p; p = pv; lx__PolyFillRectangle_inbatch(xc,p->d,p->gc,p->nrects,&p->rects[0]); free(p); } static CHAINER chain_fill_rectangle = CHAINER_INIT(fill_rectangle); static void chain_fill_rectangle_changed(LX_CONN *xc, void *pv) { PRIV_FILL_RECTANGLE *p; p = pv; if (p->d != LX_WINDOW_None) lx__PolyFillRectangle_inbatch(xc,p->d,p->gc,p->nrects,&p->rects[0]); p->nrects = 0; } void lx_fill_rectangle(LX_CONN *xc, LX_XID d, LX_XID gc, int x, int y, int w, int h) { LX_RECTANGLE *r; PRIV_FILL_RECTANGLE *p; if ((x < -32768) || (x > 32767) || (y < -32768) || (y > 32767) || (w < 0) || (w > 65535) || (h < 0) || (h > 65535)) { lx__bad_call(xc,"lx_fill_rectangle"); return; } p = lx__chainable(xc,&chain_fill_rectangle); if (! p) { lx__nomem_fail(xc); return; } if ((p->d != d) || (p->gc != gc) || (p->nrects >= BATCHSIZE)) { chain_fill_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; }