From 39dd3acbc5fddf1765dec221124c1709613bdf36 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 25 Oct 2010 21:45:42 -0700 Subject: [PATCH] render: Fix cells spanning otherwise completely empty rows/columns. When adjacent rows or columns contain only spanned cells and no rules give the rows or columns a natural minimum height or width, this triggers a special case in distribute_spanned_width(). This special case had not been tested and (therefore) was broken. This commit fixes the problem and adds test cases to prevent it from recurring. Bug #31346. --- src/output/render.c | 7 ++++++- tests/output/render.at | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/output/render.c b/src/output/render.c index 094e6879..6722a13d 100644 --- a/src/output/render.c +++ b/src/output/render.c @@ -359,9 +359,14 @@ distribute_spanned_width (int width, w1 by the common denominator of all three calculations (d), dividing that out in the column width calculation, and then keeping the remainder for the next iteration. + + (We actually compute the unspanned width of a column as twice the + unspanned width, plus the width of the rule on the left, plus the width of + the rule on the right. That way each rule contributes to both the cell on + its left and on its right.) */ d0 = n; - d1 = total_unspanned * 2.0; + d1 = 2.0 * (total_unspanned > 0 ? total_unspanned : 1.0); d = d0 * d1; if (total_unspanned > 0) d *= 2.0; diff --git a/tests/output/render.at b/tests/output/render.at index 902a5b6b..a39f688d 100644 --- a/tests/output/render.at +++ b/tests/output/render.at @@ -292,6 +292,36 @@ AT_CHECK([render-test input], [0], [dnl ]) AT_CLEANUP +dnl This checks for bug #31346, a segmentation fault that surfaced +dnl when two or more rows had no unspanned cells and no rules. +AT_SETUP([joined rows only, no rules]) +AT_KEYWORDS([render rendering]) +AT_DATA([input], [2 2 +2*1 ab\ncd\nef +2*1 hij\nklm\nnop +]) +AT_CHECK([render-test input], [0], [dnl +abhij +cdklm +efnop +]) +AT_CLEANUP + +AT_SETUP([joined columns only, no rules]) +AT_KEYWORDS([render rendering]) +AT_DATA([input], [2 2 +1*2 abc\ndef +1*2 hij\nklm\nnop +]) +AT_CHECK([render-test input], [0], [dnl +abc +def +hij +klm +nop +]) +AT_CLEANUP + AT_SETUP([5 big narrow cells]) AT_KEYWORDS([render rendering]) AT_DATA([input], [1 5 -- 2.30.2