// Copyright status: this file is in the public domain. #include #include "lx.h" #include "internal.h" typedef struct priv_draw_line PRIV_DRAW_LINE; #define BATCHSIZE 100 struct priv_draw_line { LX_XID d; LX_XID gc; int nsegs; LX_SEGMENT segs[BATCHSIZE]; } ; static void *chain_draw_line_start(LX_CONN *xc __attribute__((__unused__))) { PRIV_DRAW_LINE *p; p = malloc(sizeof(PRIV_DRAW_LINE)); p->d = LX_WINDOW_None; p->gc = LX_GC_None; p->nsegs = 0; return(p); } static void chain_draw_line_done(LX_CONN *xc, void *pv) { PRIV_DRAW_LINE *p; p = pv; lx__PolySegment_inbatch(xc,p->d,p->gc,p->nsegs,&p->segs[0]); free(p); } static CHAINER chain_draw_line = CHAINER_INIT(draw_line); static void chain_draw_line_changed(LX_CONN *xc, void *pv) { PRIV_DRAW_LINE *p; p = pv; if (p->d != LX_WINDOW_None) lx__PolySegment_inbatch(xc,p->d,p->gc,p->nsegs,&p->segs[0]); p->nsegs = 0; } void lx_draw_line(LX_CONN *xc, LX_XID d, LX_XID gc, int x1, int y1, int x2, int y2) { LX_SEGMENT *s; PRIV_DRAW_LINE *p; if ((x1 < -32768) || (x1 > 32767) || (y1 < -32768) || (y1 > 32767) || (x2 < -32768) || (x2 > 32767) || (y2 < -32768) || (y2 > 32767) ) { lx__bad_call(xc,"lx_draw_line"); return; } p = lx__chainable(xc,&chain_draw_line); if (! p) { lx__nomem_fail(xc); return; } if ((p->d != d) || (p->gc != gc) || (p->nsegs >= BATCHSIZE)) { chain_draw_line_changed(xc,p); p->d = d; p->gc = gc; } s = &p->segs[p->nsegs++]; s->x1 = x1; s->y1 = y1; s->x2 = x2; s->y2 = y2; }