[F] Fix incorrect cell width evaluation in case of invisible symbols

This commit is contained in:
seleznevae 2020-02-03 21:41:11 +03:00
parent 085405baa9
commit 3cc961f958
3 changed files with 142 additions and 0 deletions

View File

@ -7001,6 +7001,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
return FT_ERROR; return FT_ERROR;
} }
size_t column_visible_width = 0;
size_t cols = 0; size_t cols = 0;
size_t rows = 0; size_t rows = 0;
int status = get_table_sizes(table, &rows, &cols); int status = get_table_sizes(table, &rows, &cols);
@ -7022,6 +7023,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
for (col = 0; col < cols; ++col) { for (col = 0; col < cols; ++col) {
col_width_arr[col] = 0; col_width_arr[col] = 0;
size_t row = 0; size_t row = 0;
if (geom == INTERN_REPR_GEOMETRY) {
column_visible_width = 0;
for (row = 0; row < rows; ++row) {
const f_row_t *row_p = get_row_c(table, row);
const f_cell_t *cell = get_cell_c(row_p, col);
if (!cell)
continue;
size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY);
column_visible_width = MAX(column_visible_width, cell_vis_width);
}
}
for (row = 0; row < rows; ++row) { for (row = 0; row < rows; ++row) {
const f_row_t *row_p = get_row_c(table, row); const f_row_t *row_p = get_row_c(table, row);
const f_cell_t *cell = get_cell_c(row_p, col); const f_cell_t *cell = get_cell_c(row_p, col);
@ -7049,6 +7061,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
} }
} }
} }
if (geom == INTERN_REPR_GEOMETRY &&
col_width_arr[col] > column_visible_width) {
col_width_arr[col] += column_visible_width;
}
} }
if (combined_cells_found) { if (combined_cells_found) {

View File

@ -143,6 +143,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
return FT_ERROR; return FT_ERROR;
} }
size_t column_visible_width = 0;
size_t cols = 0; size_t cols = 0;
size_t rows = 0; size_t rows = 0;
int status = get_table_sizes(table, &rows, &cols); int status = get_table_sizes(table, &rows, &cols);
@ -164,6 +165,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
for (col = 0; col < cols; ++col) { for (col = 0; col < cols; ++col) {
col_width_arr[col] = 0; col_width_arr[col] = 0;
size_t row = 0; size_t row = 0;
if (geom == INTERN_REPR_GEOMETRY) {
column_visible_width = 0;
for (row = 0; row < rows; ++row) {
const f_row_t *row_p = get_row_c(table, row);
const f_cell_t *cell = get_cell_c(row_p, col);
if (!cell)
continue;
size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY);
column_visible_width = MAX(column_visible_width, cell_vis_width);
}
}
for (row = 0; row < rows; ++row) { for (row = 0; row < rows; ++row) {
const f_row_t *row_p = get_row_c(table, row); const f_row_t *row_p = get_row_c(table, row);
const f_cell_t *cell = get_cell_c(row_p, col); const f_cell_t *cell = get_cell_c(row_p, col);
@ -191,6 +203,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
} }
} }
} }
if (geom == INTERN_REPR_GEOMETRY &&
col_width_arr[col] > column_visible_width) {
col_width_arr[col] += column_visible_width;
}
} }
if (combined_cells_found) { if (combined_cells_found) {

View File

@ -188,6 +188,114 @@ void test_bug_fixes(void)
ft_destroy_table(table); ft_destroy_table(table);
} }
#endif /* FT_HAVE_UTF8 */ #endif /* FT_HAVE_UTF8 */
SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") {
ft_table_t *table = ft_create_table();
ft_set_border_style(table, FT_BASIC_STYLE);
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
ft_write_ln(table, "xxx");
ft_write_ln(table,
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n1\n2\n3\n4\n5\n6\n7\n8");
ft_set_cell_prop(table, 1, 0, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED);
const char *table_str = ft_to_string(table);
assert_true(table_str != NULL);
const char *table_str_etalon =
"+-----+\n"
"| xxx |\n"
"+-----+\n"
"| \033[31m1\033[0m |\n"
"| \033[31m2\033[0m |\n"
"| \033[31m3\033[0m |\n"
"| \033[31m4\033[0m |\n"
"| \033[31m5\033[0m |\n"
"| \033[31m6\033[0m |\n"
"| \033[31m7\033[0m |\n"
"| \033[31m8\033[0m |\n"
"| \033[31m9\033[0m |\n"
"| \033[31m0\033[0m |\n"
"| \033[31m1\033[0m |\n"
"| \033[31m2\033[0m |\n"
"| \033[31m3\033[0m |\n"
"| \033[31m4\033[0m |\n"
"| \033[31m5\033[0m |\n"
"| \033[31m6\033[0m |\n"
"| \033[31m7\033[0m |\n"
"| \033[31m8\033[0m |\n"
"+-----+\n";
assert_str_equal(table_str, table_str_etalon);
ft_destroy_table(table);
}
SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") {
ft_table_t *table = ft_create_table();
ft_set_border_style(table, FT_BASIC_STYLE);
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
ft_write_ln(table, "hdr1", "hdr2", "xxx");
ft_write_ln(table, "3", "",
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||||||||||||||||||||||||||\n"
"||||||");
ft_set_cell_prop(table, 1, FT_ANY_COLUMN, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED);
const char *table_str = ft_to_string(table);
assert_true(table_str != NULL);
const char *table_str_etalon =
"+------+------+--------------------------------+\n"
"| hdr1 | hdr2 | xxx |\n"
"+------+------+--------------------------------+\n"
"| \033[31m3\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||\033[0m |\n"
"+------+------+--------------------------------+\n";
assert_str_equal(table_str, table_str_etalon);
ft_destroy_table(table);
}
} }
void test_table_basic(void) void test_table_basic(void)