1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include "bores/bores.h"
#include "vlayer.h"
/* callback that returns a cell from a given layer */
static void _get_cell_LYR(Cell *r_cell, int x, int y, void *ud) {
Layer *l = (Layer*) ud;
*r_cell = l->cells[x][y];
}
/* callback that returns a cell from a document composite */
static void _get_cell_COMPOSITE(Cell *r_cell, int x, int y, void *ud) {
Document *doc = (Document*) doc;
*r_cell = document_calc_effective_cell(doc, x, y);
}
VirtualLayer *vlayer_create(int width, int height, vlayer_get_cell_t get_cell,
void *user_data){
VirtualLayer *vl = zalloc(sizeof(VirtualLayer));
vl->width = width;
vl->height = height;
vl->get_cell = get_cell;
vl->user_data = user_data;
return vl;
}
VirtualLayer *vlayer_create_from_layer(Layer *l) {
return vlayer_create(l->width, l->height, _get_cell_LYR, (void*) l);
}
VirtualLayer *vlayer_create_from_composite(Document *doc) {
if (doc->layer_count <= 0) return NULL;
return vlayer_create(doc->layers[0]->width, doc->layers[0]->height,
_get_cell_COMPOSITE, (void*) doc);
}
void vlayer_destroy(VirtualLayer *vl) {
if (!vl) return;
sfree(vl);
}
void vlayer_get_cell(VirtualLayer *vl, Cell *r_cell, int x, int y) {
if (x < 0 || x >= vl->width || y < 0 || y >= vl->height) {
r_cell->ch = ' ';
r_cell->attr = 0x70;
}
else vl->get_cell(r_cell, x, y, vl->user_data);
}
|