- for (x = 0; x < ds->width; x++)
- for (y = 0; y < ds->height; y++) {
- unsigned char c = tile(state, GX(x), GY(y)) |
- index(state, active, GX(x), GY(y));
- int is_src = GX(x) == ui->cx && GY(y) == ui->cy;
- int is_anim = GX(x) == tx && GY(y) == ty;
- int is_cursor = ui->cur_visible &&
- GX(x) == ui->cur_x && GY(y) == ui->cur_y;
+ for (dy = -1; dy < ds->height+1; dy++) {
+ for (dx = -1; dx < ds->width+1; dx++) {
+ todraw(ds, dx, dy) = 0;
+ }
+ }
+
+ for (dy = 0; dy < ds->height; dy++) {
+ int gy = (dy + ui->org_y) % ds->height;
+ for (dx = 0; dx < ds->width; dx++) {
+ int gx = (dx + ui->org_x) % ds->width;
+ int t = (tile(state, gx, gy) |
+ index(state, loops, gx, gy) |
+ index(state, active, gx, gy));
+
+ for (d = 1, dsh = 0; d < 16; d *= 2, dsh++) {
+ if (barrier(state, gx, gy) & d) {
+ todraw(ds, dx, dy) |=
+ d << TILE_BARRIER_SHIFT;
+ todraw(ds, dx + X(d), dy + Y(d)) |=
+ F(d) << TILE_BARRIER_SHIFT;
+ todraw(ds, dx + X(A(d)), dy + Y(A(d))) |=
+ C(d) << TILE_BARRIER_CORNER_SHIFT;
+ todraw(ds, dx + X(A(d)) + X(d), dy + Y(A(d)) + Y(d)) |=
+ F(d) << TILE_BARRIER_CORNER_SHIFT;
+ todraw(ds, dx + X(C(d)), dy + Y(C(d))) |=
+ d << TILE_BARRIER_CORNER_SHIFT;
+ todraw(ds, dx + X(C(d)) + X(d), dy + Y(C(d)) + Y(d)) |=
+ A(d) << TILE_BARRIER_CORNER_SHIFT;
+ }
+
+ if (t & d) {
+ int edgeval = (t & LOOP(d) ? 3 : t & ACTIVE ? 2 : 1);
+ todraw(ds, dx, dy) |= edgeval << (TILE_WIRE_SHIFT + dsh*2);
+ if (!(gx == tx && gy == ty)) {
+ todraw(ds, dx + X(d), dy + Y(d)) |=
+ edgeval << (TILE_WIRE_ON_EDGE_SHIFT + (dsh ^ 2)*2);
+ }
+ }
+ }
+
+ if (ui->cur_visible && gx == ui->cur_x && gy == ui->cur_y)
+ todraw(ds, dx, dy) |= TILE_KEYBOARD_CURSOR;
+
+ if (gx == tx && gy == ty)
+ todraw(ds, dx, dy) |= TILE_ROTATING;
+
+ if (gx == ui->cx && gy == ui->cy) {
+ todraw(ds, dx, dy) |= 3 << TILE_ENDPOINT_SHIFT;
+ } else if ((t & 0xF) != R && (t & 0xF) != U &&
+ (t & 0xF) != L && (t & 0xF) != D) {
+ /* this is not an endpoint tile */
+ } else if (t & ACTIVE) {
+ todraw(ds, dx, dy) |= 2 << TILE_ENDPOINT_SHIFT;
+ } else {
+ todraw(ds, dx, dy) |= 1 << TILE_ENDPOINT_SHIFT;
+ }
+
+ if (t & LOCKED)
+ todraw(ds, dx, dy) |= TILE_LOCKED;