Browse Source

Clean up field copying, add wrapper

master
cancel 6 years ago
parent
commit
982e810a84
  1. 5
      field.c
  2. 1
      field.h
  3. 19
      tui_main.c

5
field.c

@ -32,6 +32,11 @@ void field_resize_raw_if_necessary(Field* field, Usz height, Usz width) {
void field_deinit(Field* f) { free(f->buffer); } void field_deinit(Field* f) { free(f->buffer); }
void field_copy(Field* src, Field* dest) {
field_resize_raw_if_necessary(dest, src->height, src->width);
field_copy_subrect(src, dest, 0, 0, 0, 0, src->height, src->width);
}
void field_copy_subrect(Field* src, Field* dest, Usz src_y, Usz src_x, void field_copy_subrect(Field* src, Field* dest, Usz src_y, Usz src_x,
Usz dest_y, Usz dest_x, Usz height, Usz width) { Usz dest_y, Usz dest_x, Usz height, Usz width) {
Usz src_height = src->height; Usz src_height = src->height;

1
field.h

@ -6,6 +6,7 @@ void field_init_fill(Field* field, Usz height, Usz width, Glyph fill_char);
void field_resize_raw(Field* field, Usz height, Usz width); void field_resize_raw(Field* field, Usz height, Usz width);
void field_resize_raw_if_necessary(Field* field, Usz height, Usz width); void field_resize_raw_if_necessary(Field* field, Usz height, Usz width);
void field_deinit(Field* field); void field_deinit(Field* field);
void field_copy(Field* src, Field* dest);
void field_copy_subrect(Field* src, Field* dest, Usz src_y, Usz src_x, void field_copy_subrect(Field* src, Field* dest, Usz src_y, Usz src_x,
Usz dest_y, Usz dest_x, Usz height, Usz width); Usz dest_y, Usz dest_x, Usz height, Usz width);
void field_fill_subrect(Field* field, Usz y, Usz x, Usz height, Usz width, void field_fill_subrect(Field* field, Usz y, Usz x, Usz height, Usz width,

19
tui_main.c

@ -236,16 +236,12 @@ void undo_history_push(Undo_history* hist, Field* field, Usz tick_num) {
hist->first = new_node->next; hist->first = new_node->next;
hist->first->prev = NULL; hist->first->prev = NULL;
} }
field_resize_raw_if_necessary(&new_node->field, field->height,
field->width);
} else { } else {
new_node = malloc(sizeof(Undo_node)); new_node = malloc(sizeof(Undo_node));
++hist->count; ++hist->count;
field_init(&new_node->field); field_init(&new_node->field);
field_resize_raw(&new_node->field, field->height, field->width);
} }
field_copy_subrect(field, &new_node->field, 0, 0, 0, 0, field->height, field_copy(field, &new_node->field);
field->width);
new_node->tick_num = tick_num; new_node->tick_num = tick_num;
if (hist->last) { if (hist->last) {
hist->last->next = new_node; hist->last->next = new_node;
@ -263,12 +259,7 @@ void undo_history_pop(Undo_history* hist, Field* out_field, Usz* out_tick_num) {
Undo_node* last = hist->last; Undo_node* last = hist->last;
if (!last) if (!last)
return; return;
Usz height = last->field.height; field_copy(&last->field, out_field);
Usz width = last->field.width;
if (out_field->height != height || out_field->width != width) {
field_resize_raw(out_field, height, width);
}
field_copy_subrect(&last->field, out_field, 0, 0, 0, 0, height, width);
*out_tick_num = last->tick_num; *out_tick_num = last->tick_num;
if (hist->first == last) { if (hist->first == last) {
hist->first = NULL; hist->first = NULL;
@ -461,12 +452,10 @@ int main(int argc, char** argv) {
// etc. // etc.
if (needs_remarking) { if (needs_remarking) {
field_resize_raw_if_necessary(&scratch_field, field.height, field.width); field_resize_raw_if_necessary(&scratch_field, field.height, field.width);
field_copy_subrect(&field, &scratch_field, 0, 0, 0, 0, field.height, field_copy(&field, &scratch_field);
field.width);
orca_run(field.buffer, markmap_r.buffer, field.height, field.width, orca_run(field.buffer, markmap_r.buffer, field.height, field.width,
tick_num, &bank); tick_num, &bank);
field_copy_subrect(&scratch_field, &field, 0, 0, 0, 0, field.height, field_copy(&scratch_field, &field);
field.width);
needs_remarking = false; needs_remarking = false;
} }
draw_field(stdscr, term_height, term_width, 0, 0, field.buffer, draw_field(stdscr, term_height, term_width, 0, 0, field.buffer,

Loading…
Cancel
Save