102 lines
2.1 KiB
Plaintext
102 lines
2.1 KiB
Plaintext
+--------+
|
|
| 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(;x<x1;x++) {
|
|
r_cons_buffer_putch(buf, x, y, '.');
|
|
x+=xi;
|
|
}
|
|
}
|
|
|
|
/* buffers */
|
|
|
|
struct r_cons_buffer *r_cons_buffer_new(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;
|
|
buf->rw = 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;
|
|
}
|