From 540eb60fddd0869ef66b6cf5e107f1a0a1eec21a Mon Sep 17 00:00:00 2001 From: Tatsuya Kinoshita Date: Tue, 30 Mar 2021 22:48:53 +0900 Subject: Treat table height as int instead of short Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838952 --- table.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'table.c') diff --git a/table.c b/table.c index eb5c9ba..46bef1d 100644 --- a/table.c +++ b/table.c @@ -278,7 +278,7 @@ newTable() t->max_rowsize = MAXROW; t->tabdata = New_N(GeneralList **, MAXROW); t->tabattr = New_N(table_attr *, MAXROW); - t->tabheight = NewAtom_N(short, MAXROW); + t->tabheight = NewAtom_N(int, MAXROW); #ifdef ID_EXT t->tabidvalue = New_N(Str *, MAXROW); t->tridvalue = New_N(Str, MAXROW); @@ -331,7 +331,7 @@ check_row(struct table *t, int row) int i, r; GeneralList ***tabdata; table_attr **tabattr; - short *tabheight; + int *tabheight; #ifdef ID_EXT Str **tabidvalue; Str *tridvalue; @@ -341,7 +341,7 @@ check_row(struct table *t, int row) r = max(t->max_rowsize * 2, row + 1); tabdata = New_N(GeneralList **, r); tabattr = New_N(table_attr *, r); - tabheight = NewAtom_N(short, r); + tabheight = NewAtom_N(int, r); #ifdef ID_EXT tabidvalue = New_N(Str *, r); tridvalue = New_N(Str, r); @@ -845,6 +845,39 @@ table_rule_width(struct table *t) return RULE_WIDTH; } +static void +check_cell_height(int *tabheight, int *cellheight, + short *row, short *rowspan, short maxcell, + short *indexarray, int space, int dir) +{ + int i, j, k, brow, erow; + int sheight, height; + + for (k = 0; k <= maxcell; k++) { + j = indexarray[k]; + if (cellheight[j] <= 0) + continue; + brow = row[j]; + erow = brow + rowspan[j]; + sheight = 0; + for (i = brow; i < erow; i++) + sheight += tabheight[i]; + + height = cellheight[j] - (rowspan[j] - 1) * space; + if (height > sheight) { + int w = (height - sheight) / rowspan[j]; + int r = (height - sheight) % rowspan[j]; + for (i = brow; i < erow; i++) + tabheight[i] += w; + /* dir {0: horizontal, 1: vertical} */ + if (dir == 1 && r > 0) + r = rowspan[j]; + for (i = 1; i <= r; i++) + tabheight[erow - i]++; + } + } +} + static void check_cell_width(short *tabwidth, short *cellwidth, short *col, short *colspan, short maxcell, @@ -1478,7 +1511,7 @@ check_table_height(struct table *t) short *indexarray; short maxcell; short size; - short *height; + int *height; } cell; int space = 0; @@ -1517,7 +1550,7 @@ check_table_height(struct table *t) cell.row = NewAtom_N(short, cell.size); cell.rowspan = NewAtom_N(short, cell.size); cell.indexarray = NewAtom_N(short, cell.size); - cell.height = NewAtom_N(short, cell.size); + cell.height = NewAtom_N(int, cell.size); } else { cell.size = max(cell.size + MAXCELL, c + 1); @@ -1526,7 +1559,7 @@ check_table_height(struct table *t) cell.size); cell.indexarray = New_Reuse(short, cell.indexarray, cell.size); - cell.height = New_Reuse(short, cell.height, cell.size); + cell.height = New_Reuse(int, cell.height, cell.size); } } if (c > cell.maxcell) { @@ -1560,7 +1593,7 @@ check_table_height(struct table *t) case BORDER_NONE: space = 0; } - check_cell_width(t->tabheight, cell.height, cell.row, cell.rowspan, + check_cell_height(t->tabheight, cell.height, cell.row, cell.rowspan, cell.maxcell, cell.indexarray, space, 1); } -- cgit v1.2.3