return page->cp[axis][page->n[axis] * 2 + 1];
}
+/* If PAGE is smaller than SIZE along AXIS, inserts extra space to increase
+ its size to SIZE. */
+void
+render_page_stretch (struct render_page *page, enum table_axis axis,
+ int size)
+{
+ int extra = size - render_page_get_size (page, axis);
+ if (extra > 0)
+ {
+ int n = page->n[axis];
+ int error = 0;
+ int adjust = 0;
+ int i;
+
+ for (i = 2; i <= 2 * n + 1; i++)
+ {
+ if (!(i & 1))
+ {
+ error += extra;
+ adjust += error / n;
+ error %= n;
+ }
+ page->cp[axis][i] += adjust;
+ }
+ }
+}
+
int
render_page_get_best_breakpoint (const struct render_page *page, int height)
{
struct render_break y_break;
};
-static void
+static struct render_page *
render_pager_add_table (struct render_pager *p, struct table *table)
{
+ struct render_page *page;
+
if (p->n_pages >= p->allocated_pages)
p->pages = x2nrealloc (p->pages, &p->allocated_pages, sizeof *p->pages);
- p->pages[p->n_pages++] = render_page_create (p->params, table);
+ page = p->pages[p->n_pages++] = render_page_create (p->params, table);
+ return page;
}
static void
render_pager_create (const struct render_params *params,
const struct table_item *table_item)
{
+ const char *caption = table_item_get_caption (table_item);
+ const char *title = table_item_get_title (table_item);
+ const struct render_page *body_page;
+ struct render_page *title_page;
struct render_pager *p;
- const char *title;
p = xzalloc (sizeof *p);
p->params = params;
- title = table_item_get_title (table_item);
- if (title)
- render_pager_add_table (p, table_from_string (TAB_LEFT, title));
- render_pager_add_table (p, table_ref (table_item_get_table (table_item)));
- add_footnote_page (p, p->pages[p->n_pages - 1]);
+ /* Title. */
+ title_page = (title
+ ? render_pager_add_table (
+ p, table_from_string (TAB_CENTER | TAB_EMPH, title))
+ : NULL);
+
+ /* Body. */
+ body_page = render_pager_add_table (p, table_ref (table_item_get_table (
+ table_item)));
+ if (title_page && body_page)
+ {
+ int body_page_size = render_page_get_size (body_page, H);
+ render_page_stretch (title_page, H,
+ MIN (body_page_size, params->size[H]));
+ }
+
+ /* Caption. */
+ if (caption)
+ render_pager_add_table (p, table_from_string (TAB_LEFT, caption));
+
+ /* Footnotes. */
+ add_footnote_page (p, body_page);
render_pager_start_page (p);