Browse Source

Clean up resizing logic, make it work with undo history

master
cancel 6 years ago
parent
commit
febfffdb6b
  1. 16
      field.c
  2. 1
      field.h
  3. 28
      tui_main.c

16
field.c

@ -40,22 +40,6 @@ void field_copy(Field* src, Field* dest) {
src->width); src->width);
} }
void field_resize_filled(Field* field, Usz height, Usz width, Glyph fill_char) {
assert(height <= ORCA_Y_MAX && width <= ORCA_X_MAX);
Usz old_height = field->height;
Usz old_width = field->width;
if (old_height == height && old_width == width)
return;
Usz old_cells = old_height * old_width;
Usz new_cells = height * width;
field->buffer = realloc(field->buffer, new_cells * sizeof(Glyph));
if (old_cells < new_cells) {
memset(field->buffer + old_cells, fill_char, (new_cells - old_cells) * sizeof(Glyph));
}
field->height = (U16)height;
field->width = (U16)width;
}
static inline bool glyph_char_is_valid(char c) { return c >= '!' && c <= '~'; } static inline bool glyph_char_is_valid(char c) { return c >= '!' && c <= '~'; }
void field_fput(Field* f, FILE* stream) { void field_fput(Field* f, FILE* stream) {

1
field.h

@ -6,7 +6,6 @@ void field_init_fill(Field* field, Usz height, Usz width, Glyph fill_char);
void field_deinit(Field* field); void field_deinit(Field* field);
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_resize_filled(Field* field, Usz height, Usz width, Glyph fill_char);
void field_copy(Field* src, Field* dest); void field_copy(Field* src, Field* dest);
void field_fput(Field* field, FILE* stream); void field_fput(Field* field, FILE* stream);

28
tui_main.c

@ -340,15 +340,19 @@ void tui_cursor_confine(Tui_cursor* tc, Usz height, Usz width) {
tc->x = width - 1; tc->x = width - 1;
} }
void tui_resize_grid(Field* field, Markmap_reusable* markmap, void tui_resize_grid(Field* field, Markmap_reusable* markmap, Isz delta_h,
Field* scratch_field, Isz delta_h, Isz delta_w, Isz delta_w, Usz tick_num, Field* scratch_field,
Tui_cursor* tui_cursor, bool* needs_remarking) { Undo_history* undo_hist, Tui_cursor* tui_cursor,
bool* needs_remarking) {
Isz new_height = (Isz)field->height + delta_h; Isz new_height = (Isz)field->height + delta_h;
Isz new_width = (Isz)field->width + delta_w; Isz new_width = (Isz)field->width + delta_w;
if (new_height < 1 || new_width < 1) if (new_height < 1 || new_width < 1)
return; return;
undo_history_push(undo_hist, field, tick_num);
field_copy(field, scratch_field); field_copy(field, scratch_field);
field_resize_filled(field, (Usz)new_height, (Usz)new_width, '.'); field_resize_raw(field, (Usz)new_height, (Usz)new_width);
// junky copies until i write a smarter thing
memset(field->buffer, '.', (Usz)new_height * (Usz)new_width * sizeof(Glyph));
gbuffer_copy_subrect(scratch_field->buffer, field->buffer, gbuffer_copy_subrect(scratch_field->buffer, field->buffer,
scratch_field->height, scratch_field->width, scratch_field->height, scratch_field->width,
field->height, field->width, 0, 0, 0, 0, field->height, field->width, 0, 0, 0, 0,
@ -570,20 +574,20 @@ int main(int argc, char** argv) {
++ruler_spacing_y; ++ruler_spacing_y;
break; break;
case '(': case '(':
tui_resize_grid(&field, &markmap_r, &scratch_field, 0, -1, &tui_cursor, tui_resize_grid(&field, &markmap_r, 0, -1, tick_num, &scratch_field,
&needs_remarking); &undo_hist, &tui_cursor, &needs_remarking);
break; break;
case ')': case ')':
tui_resize_grid(&field, &markmap_r, &scratch_field, 0, 1, &tui_cursor, tui_resize_grid(&field, &markmap_r, 0, 1, tick_num, &scratch_field,
&needs_remarking); &undo_hist, &tui_cursor, &needs_remarking);
break; break;
case '_': case '_':
tui_resize_grid(&field, &markmap_r, &scratch_field, -1, 0, &tui_cursor, tui_resize_grid(&field, &markmap_r, -1, 0, tick_num, &scratch_field,
&needs_remarking); &undo_hist, &tui_cursor, &needs_remarking);
break; break;
case '+': case '+':
tui_resize_grid(&field, &markmap_r, &scratch_field, 1, 0, &tui_cursor, tui_resize_grid(&field, &markmap_r, 1, 0, tick_num, &scratch_field,
&needs_remarking); &undo_hist, &tui_cursor, &needs_remarking);
break; break;
case ' ': case ' ':
undo_history_push(&undo_hist, &field, tick_num); undo_history_push(&undo_hist, &field, tick_num);

Loading…
Cancel
Save