+--------+ | r_cons | +--------+ r_cons_fb r_cons_frame r_cons_frame_add r_cons_frame_del struct r_cons_frame_t { int w, h; // should be the same as text|draw->w and text|draw->h int rw, rh; struct r_cons_buffer_t *text; struct r_cons_buffer_t *draw; struct }; struct r_cons_buffer_t { int alpha; /* ' ' chars in buffers are not written */ int w, h; ut8 *buf; }; struct r_cons_t { struct r_cons_buffer_t *b; int w, h; struct list_head frames; }; struct r_cons_frame_t *r_cons_frame_new(int x, int y, int w, int h) { struct r_cons_frame_t *f = R_NEW(struct r_cons_frame_t); f->text = r_cons_buffer_new(w, h); f->draw = r_cons_buffer_new(w, h); f->w = w; f->h = h; return f; } void r_cons_frame_add(struct r_cons_t *cons, struct r_cons_frame_t *f, int head) { if (head) list_add(&(f->list), &cons->frames); else list_add_tail(&(f->list), &cons->frames); } int r_cons_frame_render(struct r_cons_frame_t *frame, struct r_cons_buffer_t *buf) { /* foreach pixel resolve matching frame (Z-ordered) and draw */ } /* <{:api-prefix r_cons_}> */ /* <{:doc Draws a line between two points in a buffer}> */ /* <{:api int,buffer_line,int,int,int,int}> */ void r_cons_buffer_line(struct r_cons_buffer_t *buf, int x0, int y0, int x1, int y1) { /* XXX PURE SHIT */ char onechars[9] = { '.', '_',',', '\\', '|','/', '\'', '^','\'', }; double x = x0; double y = y0; double xi = x1-x0; double yi = y1-y0; for(;xrw = buf->w = w; buf->rh = buf->h = h; buf->buf = (ut8*)malloc(w*h); return buf; } int r_cons_buffer_set_size(struct r_cons_buffer *buf, int w, int h) { struct r_cons_buffer_t *buf = R_NEW(struct r_cons_buffer_t); if (w<1) w=1; if (h<1) h=1; if (w>buf->rw) { /* must resize internal buffer */ buf->rw = w; buf->buf = (ut8*) realloc(buf->buf, w*h); } buf->rw = buf->w = w; buf->rh = buf->h = h; buf->buf = (ut8*)malloc(w*h); return buf; }