output: Add support for vertical alignment of cells.
[pspp] / src / output / render.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2009, 2010, 2011, 2013, 2014, 2016 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include <math.h>
20 #include <stdio.h>
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "libpspp/assertion.h"
26 #include "libpspp/hash-functions.h"
27 #include "libpspp/hmap.h"
28 #include "output/render.h"
29 #include "output/tab.h"
30 #include "output/table-item.h"
31 #include "output/table.h"
32
33 #include "gl/minmax.h"
34 #include "gl/xalloc.h"
35
36 #include "gettext.h"
37 #define _(msgid) gettext (msgid)
38
39 /* This file uses TABLE_HORZ and TABLE_VERT enough to warrant abbreviating. */
40 #define H TABLE_HORZ
41 #define V TABLE_VERT
42 \f
43 /* A layout for rendering a specific table on a specific device.
44
45    May represent the layout of an entire table presented to
46    render_page_create(), or a rectangular subregion of a table broken out using
47    render_break_next() to allow a table to be broken across multiple pages.
48
49    A page's size is not limited to the size passed in as part of render_params.
50    render_pager breaks a render_page into smaller render_pages that will fit in
51    the available space. */
52 struct render_page
53   {
54     const struct render_params *params; /* Parameters of the target device. */
55     struct table *table;                /* Table rendered. */
56     int ref_cnt;
57
58     /* Local copies of table->n and table->h, for convenience. */
59     int n[TABLE_N_AXES];
60     int h[TABLE_N_AXES][2];
61
62     /* "Cell positions".
63
64        cp[H] represents x positions within the table.
65        cp[H][0] = 0.
66        cp[H][1] = the width of the leftmost vertical rule.
67        cp[H][2] = cp[H][1] + the width of the leftmost column.
68        cp[H][3] = cp[H][2] + the width of the second-from-left vertical rule.
69        and so on:
70        cp[H][2 * nc] = x position of the rightmost vertical rule.
71        cp[H][2 * nc + 1] = total table width including all rules.
72
73        Similarly, cp[V] represents y positions within the table.
74        cp[V][0] = 0.
75        cp[V][1] = the height of the topmost horizontal rule.
76        cp[V][2] = cp[V][1] + the height of the topmost row.
77        cp[V][3] = cp[V][2] + the height of the second-from-top horizontal rule.
78        and so on:
79        cp[V][2 * nr] = y position of the bottommost horizontal rule.
80        cp[V][2 * nr + 1] = total table height including all rules.
81
82        Rules and columns can have width or height 0, in which case consecutive
83        values in this array are equal. */
84     int *cp[TABLE_N_AXES];
85
86     /* render_break_next() can break a table such that some cells are not fully
87        contained within a render_page.  This will happen if a cell is too wide
88        or two tall to fit on a single page, or if a cell spans multiple rows or
89        columns and the page only includes some of those rows or columns.
90
91        This hash table contains "struct render_overflow"s that represents each
92        such cell that doesn't completely fit on this page.
93
94        Each overflow cell borders at least one header edge of the table and may
95        border more.  (A single table cell that is so large that it fills the
96        entire page can overflow on all four sides!) */
97     struct hmap overflows;
98
99     /* If a single column (or row) is too wide (or tall) to fit on a page
100        reasonably, then render_break_next() will split a single row or column
101        across multiple render_pages.  This member indicates when this has
102        happened:
103
104        is_edge_cutoff[H][0] is true if pixels have been cut off the left side
105        of the leftmost column in this page, and false otherwise.
106
107        is_edge_cutoff[H][1] is true if pixels have been cut off the right side
108        of the rightmost column in this page, and false otherwise.
109
110        is_edge_cutoff[V][0] and is_edge_cutoff[V][1] are similar for the top
111        and bottom of the table.
112
113        The effect of is_edge_cutoff is to prevent rules along the edge in
114        question from being rendered.
115
116        When is_edge_cutoff is true for a given edge, the 'overflows' hmap will
117        contain a node for each cell along that edge. */
118     bool is_edge_cutoff[TABLE_N_AXES][2];
119
120     /* If part of a joined cell would be cut off by breaking a table along
121        'axis' at the rule with offset 'z' (where 0 <= z <= n[axis]), then
122        join_crossing[axis][z] is the thickness of the rule that would be cut
123        off.
124
125        This is used to know to allocate extra space for breaking at such a
126        position, so that part of the cell's content is not lost.
127
128        This affects breaking a table only when headers are present.  When
129        headers are not present, the rule's thickness is used for cell content,
130        so no part of the cell's content is lost (and in fact it is duplicated
131        across both pages). */
132     int *join_crossing[TABLE_N_AXES];
133   };
134
135 static struct render_page *render_page_create (const struct render_params *,
136                                                struct table *);
137
138 struct render_page *render_page_ref (const struct render_page *page_);
139 static void render_page_unref (struct render_page *);
140
141 /* Returns the offset in struct render_page's cp[axis] array of the rule with
142    index RULE_IDX.  That is, if RULE_IDX is 0, then the offset is that of the
143    leftmost or topmost rule; if RULE_IDX is 1, then the offset is that of the
144    next rule to the right (or below); and so on. */
145 static int
146 rule_ofs (int rule_idx)
147 {
148   return rule_idx * 2;
149 }
150
151 /* Returns the offset in struct render_page's cp[axis] array of the rule with
152    index RULE_IDX_R, which counts from the right side (or bottom) of the page
153    left (or up), according to whether AXIS is H or V, respectively.  That is,
154    if RULE_IDX_R is 0, then the offset is that of the rightmost or bottommost
155    rule; if RULE_IDX is 1, then the offset is that of the next rule to the left
156    (or above); and so on. */
157 static int
158 rule_ofs_r (const struct render_page *page, int axis, int rule_idx_r)
159 {
160   return (page->n[axis] - rule_idx_r) * 2;
161 }
162
163 /* Returns the offset in struct render_page's cp[axis] array of the cell with
164    index CELL_IDX.  That is, if CELL_IDX is 0, then the offset is that of the
165    leftmost or topmost cell; if CELL_IDX is 1, then the offset is that of the
166    next cell to the right (or below); and so on. */
167 static int
168 cell_ofs (int cell_idx)
169 {
170   return cell_idx * 2 + 1;
171 }
172
173 /* Returns the width of PAGE along AXIS from OFS0 to OFS1, exclusive. */
174 static int
175 axis_width (const struct render_page *page, int axis, int ofs0, int ofs1)
176 {
177   return page->cp[axis][ofs1] - page->cp[axis][ofs0];
178 }
179
180 /* Returns the width of the headers in PAGE along AXIS. */
181 static int
182 headers_width (const struct render_page *page, int axis)
183 {
184   int h0 = page->h[axis][0];
185   int w0 = axis_width (page, axis, rule_ofs (0), cell_ofs (h0));
186   int n = page->n[axis];
187   int h1 = page->h[axis][1];
188   int w1 = axis_width (page, axis, rule_ofs_r (page, axis, h1), cell_ofs (n));
189   return w0 + w1;
190 }
191
192 /* Returns the width of cell X along AXIS in PAGE. */
193 static int
194 cell_width (const struct render_page *page, int axis, int x)
195 {
196   return axis_width (page, axis, cell_ofs (x), cell_ofs (x) + 1);
197 }
198
199 /* Returns the width of rule X along AXIS in PAGE. */
200 static int
201 rule_width (const struct render_page *page, int axis, int x)
202 {
203   return axis_width (page, axis, rule_ofs (x), rule_ofs (x) + 1);
204 }
205
206 /* Returns the width of rule X along AXIS in PAGE. */
207 static int
208 rule_width_r (const struct render_page *page, int axis, int x)
209 {
210   int ofs = rule_ofs_r (page, axis, x);
211   return axis_width (page, axis, ofs, ofs + 1);
212 }
213
214 /* Returns the width of cells X0 through X1, exclusive, along AXIS in PAGE. */
215 static int
216 joined_width (const struct render_page *page, int axis, int x0, int x1)
217 {
218   return axis_width (page, axis, cell_ofs (x0), cell_ofs (x1) - 1);
219 }
220
221 /* Returns the width of the widest cell, excluding headers, along AXIS in
222    PAGE. */
223 static int
224 max_cell_width (const struct render_page *page, int axis)
225 {
226   int n = page->n[axis];
227   int x0 = page->h[axis][0];
228   int x1 = n - page->h[axis][1];
229   int x, max;
230
231   max = 0;
232   for (x = x0; x < x1; x++)
233     {
234       int w = cell_width (page, axis, x);
235       if (w > max)
236         max = w;
237     }
238   return max;
239 }
240 \f
241 /* A cell that doesn't completely fit on the render_page. */
242 struct render_overflow
243   {
244     struct hmap_node node;      /* In render_page's 'overflows' hmap. */
245
246     /* Occupied region of page.
247
248        d[H][0] is the leftmost column.
249        d[H][1] is the rightmost column, plus 1.
250        d[V][0] is the top row.
251        d[V][1] is the bottom row, plus 1.
252
253        The cell in its original table might occupy a larger region.  This
254        member reflects the size of the cell in the current render_page, after
255        trimming off any rows or columns due to page-breaking. */
256     int d[TABLE_N_AXES];
257
258     /* The space that has been trimmed off the cell:
259
260        overflow[H][0]: space trimmed off its left side.
261        overflow[H][1]: space trimmed off its right side.
262        overflow[V][0]: space trimmed off its top.
263        overflow[V][1]: space trimmed off its bottom.
264
265        During rendering, this information is used to position the rendered
266        portion of the cell within the available space.
267
268        When a cell is rendered, sometimes it is permitted to spill over into
269        space that is ordinarily reserved for rules.  Either way, this space is
270        still included in overflow values.
271
272        Suppose, for example, that a cell that joins 2 columns has a width of 60
273        pixels and content "abcdef", that the 2 columns that it joins have
274        widths of 20 and 30 pixels, respectively, and that therefore the rule
275        between the two joined columns has a width of 10 (20 + 10 + 30 = 60).
276        It might render like this, if each character is 10x10, and showing a few
277        extra table cells for context:
278
279                                      +------+
280                                      |abcdef|
281                                      +--+---+
282                                      |gh|ijk|
283                                      +--+---+
284
285        If this render_page is broken at the rule that separates "gh" from
286        "ijk", then the page that contains the left side of the "abcdef" cell
287        will have overflow[H][1] of 10 + 30 = 40 for its portion of the cell,
288        and the page that contains the right side of the cell will have
289        overflow[H][0] of 20 + 10 = 30.  The two resulting pages would look like
290        this:
291
292
293                                        +---
294                                        |abc
295                                        +--+
296                                        |gh|
297                                        +--+
298
299        and:
300
301                                        ----+
302                                        cdef|
303                                        +---+
304                                        |ijk|
305                                        +---+
306     */
307     int overflow[TABLE_N_AXES][2];
308   };
309
310 /* Returns a hash value for (,Y). */
311 static unsigned int
312 hash_cell (int x, int y)
313 {
314   return hash_int (x + (y << 16), 0);
315 }
316
317 /* Searches PAGE's set of render_overflow for one whose top-left cell is
318    (X,Y).  Returns it, if there is one, otherwise a null pointer. */
319 static const struct render_overflow *
320 find_overflow (const struct render_page *page, int x, int y)
321 {
322   if (!hmap_is_empty (&page->overflows))
323     {
324       const struct render_overflow *of;
325
326       HMAP_FOR_EACH_WITH_HASH (of, struct render_overflow, node,
327                                hash_cell (x, y), &page->overflows)
328         if (x == of->d[H] && y == of->d[V])
329           return of;
330     }
331
332   return NULL;
333 }
334 \f
335 /* Row or column dimensions.  Used to figure the size of a table in
336    render_page_create() and discarded after that. */
337 struct render_row
338   {
339     /* Width without considering rows (or columns) that span more than one (or
340        column). */
341     int unspanned;
342
343     /* Width taking spanned rows (or columns) into consideration. */
344     int width;
345   };
346
347 /* Modifies the 'width' members of the N elements of ROWS so that their sum,
348    when added to rule widths RULES[1] through RULES[N - 1] inclusive, is at
349    least WIDTH. */
350 static void
351 distribute_spanned_width (int width,
352                           struct render_row *rows, const int *rules, int n)
353 {
354   /* Sum up the unspanned widths of the N rows for use as weights. */
355   int total_unspanned = 0;
356   for (int x = 0; x < n; x++)
357     total_unspanned += rows[x].unspanned;
358   for (int x = 0; x < n - 1; x++)
359     total_unspanned += rules[x + 1];
360   if (total_unspanned >= width)
361     return;
362
363   /* The algorithm used here is based on the following description from HTML 4:
364
365          For cells that span multiple columns, a simple approach consists of
366          apportioning the min/max widths evenly to each of the constituent
367          columns.  A slightly more complex approach is to use the min/max
368          widths of unspanned cells to weight how spanned widths are
369          apportioned.  Experiments suggest that a blend of the two approaches
370          gives good results for a wide range of tables.
371
372      We blend the two approaches half-and-half, except that we cannot use the
373      unspanned weights when 'total_unspanned' is 0 (because that would cause a
374      division by zero).
375
376      The calculation we want to do is this:
377
378         w0 = width / n
379         w1 = width * (column's unspanned width) / (total unspanned width)
380         (column's width) = (w0 + w1) / 2
381
382      We implement it as a precise calculation in integers by multiplying w0 and
383      w1 by the common denominator of all three calculations (d), dividing that
384      out in the column width calculation, and then keeping the remainder for
385      the next iteration.
386
387      (We actually compute the unspanned width of a column as twice the
388      unspanned width, plus the width of the rule on the left, plus the width of
389      the rule on the right.  That way each rule contributes to both the cell on
390      its left and on its right.)
391   */
392   long long int d0 = n;
393   long long int d1 = 2LL * MAX (total_unspanned, 1);
394   long long int d = d0 * d1;
395   if (total_unspanned > 0)
396     d *= 2;
397   long long int w = d / 2;
398   for (int x = 0; x < n; x++)
399     {
400       w += width * d1;
401       if (total_unspanned > 0)
402         {
403           long long int unspanned = rows[x].unspanned * 2LL;
404           if (x < n - 1)
405             unspanned += rules[x + 1];
406           if (x > 0)
407             unspanned += rules[x];
408           w += width * unspanned * d0;
409         }
410
411       rows[x].width = MAX (rows[x].width, w / d);
412       w -= rows[x].width * d;
413     }
414 }
415
416 /* Initializes PAGE->cp[AXIS] from the row widths in ROWS and the rule widths
417    in RULES. */
418 static void
419 accumulate_row_widths (const struct render_page *page, enum table_axis axis,
420                        const struct render_row *rows, const int *rules)
421 {
422   int n = page->n[axis];
423   int *cp;
424   int z;
425
426   cp = page->cp[axis];
427   cp[0] = 0;
428   for (z = 0; z < n; z++)
429     {
430       cp[1] = cp[0] + rules[z];
431       cp[2] = cp[1] + rows[z].width;
432       cp += 2;
433     }
434   cp[1] = cp[0] + rules[n];
435 }
436
437 /* Returns the sum of widths of the N ROWS and N+1 RULES. */
438 static int
439 calculate_table_width (int n, const struct render_row *rows, int *rules)
440 {
441   int width;
442   int x;
443
444   width = 0;
445   for (x = 0; x < n; x++)
446     width += rows[x].width;
447   for (x = 0; x <= n; x++)
448     width += rules[x];
449
450   return width;
451 }
452 \f
453 /* Rendering utility functions. */
454
455 /* Returns the line style to use for drawing a rule of the given TYPE. */
456 static enum render_line_style
457 rule_to_render_type (unsigned char type)
458 {
459   switch (type)
460     {
461     case TAL_0:
462       return RENDER_LINE_NONE;
463     case TAL_1:
464       return RENDER_LINE_SINGLE;
465     case TAL_2:
466       return RENDER_LINE_DOUBLE;
467     default:
468       NOT_REACHED ();
469     }
470 }
471
472 /* Returns the width of the rule in TABLE that is at offset Z along axis A, if
473    rendered with PARAMS.  */
474 static int
475 measure_rule (const struct render_params *params, const struct table *table,
476               enum table_axis a, int z)
477 {
478   enum table_axis b = !a;
479   unsigned int rules;
480   int d[TABLE_N_AXES];
481   int width;
482
483   /* Determine all types of rules that are present, as a bitmap in 'rules'
484      where rule type 't' is present if bit 2**t is set. */
485   rules = 0;
486   d[a] = z;
487   for (d[b] = 0; d[b] < table->n[b]; d[b]++)
488     rules |= 1u << table_get_rule (table, a, d[H], d[V]);
489
490   /* Turn off TAL_NONE because it has width 0 and we needn't bother.  However,
491      if the device doesn't support margins, make sure that there is at least a
492      small gap between cells (but we don't need any at the left or right edge
493      of the table). */
494   if (rules & (1u << TAL_0))
495     {
496       rules &= ~(1u << TAL_0);
497       if (z > 0 && z < table->n[a] && !params->supports_margins && a == H)
498         rules |= 1u << TAL_1;
499     }
500
501   /* Calculate maximum width of the rules that are present. */
502   width = 0;
503   if (rules & (1u << TAL_1)
504       || (z > 0 && z < table->n[a] && rules & (1u << TAL_0)))
505     width = params->line_widths[a][RENDER_LINE_SINGLE];
506   if (rules & (1u << TAL_2))
507     width = MAX (width, params->line_widths[a][RENDER_LINE_DOUBLE]);
508   return width;
509 }
510
511 /* Allocates and returns a new render_page using PARAMS and TABLE.  Allocates
512    space for all of the members of the new page, but the caller must initialize
513    the 'cp' member itself. */
514 static struct render_page *
515 render_page_allocate (const struct render_params *params,
516                       struct table *table)
517 {
518   struct render_page *page;
519   int i;
520
521   page = xmalloc (sizeof *page);
522   page->params = params;
523   page->table = table;
524   page->ref_cnt = 1;
525   page->n[H] = table->n[H];
526   page->n[V] = table->n[V];
527   page->h[H][0] = table->h[H][0];
528   page->h[H][1] = table->h[H][1];
529   page->h[V][0] = table->h[V][0];
530   page->h[V][1] = table->h[V][1];
531
532   for (i = 0; i < TABLE_N_AXES; i++)
533     {
534       page->cp[i] = xmalloc ((2 * page->n[i] + 2) * sizeof *page->cp[i]);
535       page->join_crossing[i] = xzalloc ((page->n[i] + 1) * sizeof *page->join_crossing[i]);
536     }
537
538   hmap_init (&page->overflows);
539   memset (page->is_edge_cutoff, 0, sizeof page->is_edge_cutoff);
540
541   return page;
542 }
543
544 /* Allocates and returns a new render_page for PARAMS and TABLE, initializing
545    cp[H] in the new page from ROWS and RULES.  The caller must still initialize
546    cp[V]. */
547 static struct render_page *
548 create_page_with_exact_widths (const struct render_params *params,
549                                struct table *table,
550                                const struct render_row *rows, int *rules)
551 {
552   struct render_page *page = render_page_allocate (params, table);
553   accumulate_row_widths (page, H, rows, rules);
554   return page;
555 }
556
557 /* Allocates and returns a new render_page for PARAMS and TABLE.
558
559    Initializes cp[H] in the new page by setting the width of each row 'i' to
560    somewhere between the minimum cell width ROW_MIN[i].width and the maximum
561    ROW_MAX[i].width.  Sets the width of rules to those in RULES.
562
563    W_MIN is the sum of ROWS_MIN[].width.
564
565    W_MAX is the sum of ROWS_MAX[].width.
566
567    The caller must still initialize cp[V]. */
568 static struct render_page *
569 create_page_with_interpolated_widths (const struct render_params *params,
570                                       struct table *table,
571                                       const struct render_row *rows_min,
572                                       const struct render_row *rows_max,
573                                       int w_min, int w_max, const int *rules)
574 {
575   const int n = table->n[H];
576   const long long int avail = params->size[H] - w_min;
577   const long long int wanted = w_max - w_min;
578
579   assert (wanted > 0);
580
581   struct render_page *page = render_page_allocate (params, table);
582
583   int *cph = page->cp[H];
584   *cph = 0;
585   long long int w = wanted / 2;
586   for (int x = 0; x < n; x++)
587     {
588       w += avail * (rows_max[x].width - rows_min[x].width);
589       int extra = w / wanted;
590       w -= extra * wanted;
591
592       cph[1] = cph[0] + rules[x];
593       cph[2] = cph[1] + rows_min[x].width + extra;
594       cph += 2;
595     }
596   cph[1] = cph[0] + rules[n];
597
598   assert (page->cp[H][n * 2 + 1] == params->size[H]);
599   return page;
600 }
601
602 \f
603 static void
604 set_join_crossings (struct render_page *page, enum table_axis axis,
605                     const struct table_cell *cell, int *rules)
606 {
607   int z;
608
609   for (z = cell->d[axis][0] + 1; z <= cell->d[axis][1] - 1; z++)
610     page->join_crossing[axis][z] = rules[z];
611 }
612
613 /* Creates and returns a new render_page for rendering TABLE on a device
614    described by PARAMS.
615
616    The new render_page will be suitable for rendering on a device whose page
617    size is PARAMS->size, but the caller is responsible for actually breaking it
618    up to fit on such a device, using the render_break abstraction.  */
619 static struct render_page *
620 render_page_create (const struct render_params *params, struct table *table)
621 {
622   struct render_page *page;
623   enum { MIN, MAX };
624   struct render_row *columns[2];
625   struct render_row *rows;
626   int table_widths[2];
627   int *rules[TABLE_N_AXES];
628   int nr, nc;
629   int x, y;
630   int i;
631   enum table_axis axis;
632
633   nc = table_nc (table);
634   nr = table_nr (table);
635
636   /* Figure out rule widths. */
637   for (axis = 0; axis < TABLE_N_AXES; axis++)
638     {
639       int n = table->n[axis] + 1;
640       int z;
641
642       rules[axis] = xnmalloc (n, sizeof *rules);
643       for (z = 0; z < n; z++)
644         rules[axis][z] = measure_rule (params, table, axis, z);
645     }
646
647   /* Calculate minimum and maximum widths of cells that do not
648      span multiple columns. */
649   for (i = 0; i < 2; i++)
650     columns[i] = xzalloc (nc * sizeof *columns[i]);
651   for (y = 0; y < nr; y++)
652     for (x = 0; x < nc; )
653       {
654         struct table_cell cell;
655
656         table_get_cell (table, x, y, &cell);
657         if (y == cell.d[V][0])
658           {
659             if (table_cell_colspan (&cell) == 1)
660               {
661                 int w[2];
662                 int i;
663
664                 params->measure_cell_width (params->aux, &cell,
665                                             &w[MIN], &w[MAX]);
666                 for (i = 0; i < 2; i++)
667                   if (columns[i][x].unspanned < w[i])
668                     columns[i][x].unspanned = w[i];
669               }
670           }
671         x = cell.d[H][1];
672         table_cell_free (&cell);
673       }
674
675   /* Distribute widths of spanned columns. */
676   for (i = 0; i < 2; i++)
677     for (x = 0; x < nc; x++)
678       columns[i][x].width = columns[i][x].unspanned;
679   for (y = 0; y < nr; y++)
680     for (x = 0; x < nc; )
681       {
682         struct table_cell cell;
683
684         table_get_cell (table, x, y, &cell);
685         if (y == cell.d[V][0] && table_cell_colspan (&cell) > 1)
686           {
687             int w[2];
688
689             params->measure_cell_width (params->aux, &cell, &w[MIN], &w[MAX]);
690             for (i = 0; i < 2; i++)
691               distribute_spanned_width (w[i], &columns[i][cell.d[H][0]],
692                                         rules[H], table_cell_colspan (&cell));
693           }
694         x = cell.d[H][1];
695         table_cell_free (&cell);
696       }
697
698   /* In pathological cases, spans can cause the minimum width of a column to
699      exceed the maximum width.  This bollixes our interpolation algorithm
700      later, so fix it up. */
701   for (i = 0; i < nc; i++)
702     if (columns[MIN][i].width > columns[MAX][i].width)
703       columns[MAX][i].width = columns[MIN][i].width;
704
705   /* Decide final column widths. */
706   for (i = 0; i < 2; i++)
707     table_widths[i] = calculate_table_width (table_nc (table),
708                                              columns[i], rules[H]);
709   if (table_widths[MAX] <= params->size[H])
710     {
711       /* Fits even with maximum widths.  Use them. */
712       page = create_page_with_exact_widths (params, table, columns[MAX],
713                                             rules[H]);
714     }
715   else if (table_widths[MIN] <= params->size[H])
716     {
717       /* Fits with minimum widths, so distribute the leftover space. */
718       page = create_page_with_interpolated_widths (
719         params, table, columns[MIN], columns[MAX],
720         table_widths[MIN], table_widths[MAX], rules[H]);
721     }
722   else
723     {
724       /* Doesn't fit even with minimum widths.  Assign minimums for now, and
725          later we can break it horizontally into multiple pages. */
726       page = create_page_with_exact_widths (params, table, columns[MIN],
727                                             rules[H]);
728     }
729
730   /* Calculate heights of cells that do not span multiple rows. */
731   rows = xzalloc (nr * sizeof *rows);
732   for (y = 0; y < nr; y++)
733     {
734       for (x = 0; x < nc; )
735         {
736           struct render_row *r = &rows[y];
737           struct table_cell cell;
738
739           table_get_cell (table, x, y, &cell);
740           if (y == cell.d[V][0])
741             {
742               if (table_cell_rowspan (&cell) == 1)
743                 {
744                   int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
745                   int h = params->measure_cell_height (params->aux, &cell, w);
746                   if (h > r->unspanned)
747                     r->unspanned = r->width = h;
748                 }
749               else
750                 set_join_crossings (page, V, &cell, rules[V]);
751
752               if (table_cell_colspan (&cell) > 1)
753                 set_join_crossings (page, H, &cell, rules[H]);
754             }
755           x = cell.d[H][1];
756           table_cell_free (&cell);
757         }
758     }
759   for (i = 0; i < 2; i++)
760     free (columns[i]);
761
762   /* Distribute heights of spanned rows. */
763   for (y = 0; y < nr; y++)
764     for (x = 0; x < nc; )
765       {
766         struct table_cell cell;
767
768         table_get_cell (table, x, y, &cell);
769         if (y == cell.d[V][0] && table_cell_rowspan (&cell) > 1)
770           {
771             int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
772             int h = params->measure_cell_height (params->aux, &cell, w);
773             distribute_spanned_width (h, &rows[cell.d[V][0]], rules[V],
774                                       table_cell_rowspan (&cell));
775           }
776         x = cell.d[H][1];
777         table_cell_free (&cell);
778       }
779
780   /* Decide final row heights. */
781   accumulate_row_widths (page, V, rows, rules[V]);
782   free (rows);
783
784   /* Measure headers.  If they are "too big", get rid of them.  */
785   for (axis = 0; axis < TABLE_N_AXES; axis++)
786     {
787       int hw = headers_width (page, axis);
788       if (hw * 2 >= page->params->size[axis]
789           || hw + max_cell_width (page, axis) > page->params->size[axis])
790         {
791           page->table = table_unshare (page->table);
792           page->table->h[axis][0] = page->table->h[axis][1] = 0;
793           page->h[axis][0] = page->h[axis][1] = 0;
794         }
795     }
796
797   free (rules[H]);
798   free (rules[V]);
799
800   return page;
801 }
802
803 /* Increases PAGE's reference count. */
804 struct render_page *
805 render_page_ref (const struct render_page *page_)
806 {
807   struct render_page *page = CONST_CAST (struct render_page *, page_);
808   page->ref_cnt++;
809   return page;
810 }
811
812 /* Decreases PAGE's reference count and destroys PAGE if this causes the
813    reference count to fall to zero. */
814 static void
815 render_page_unref (struct render_page *page)
816 {
817   if (page != NULL && --page->ref_cnt == 0)
818     {
819       int i;
820       struct render_overflow *overflow, *next;
821
822       HMAP_FOR_EACH_SAFE (overflow, next, struct render_overflow, node,
823                           &page->overflows)
824         free (overflow);
825       hmap_destroy (&page->overflows);
826
827       table_unref (page->table);
828
829       for (i = 0; i < TABLE_N_AXES; ++i)
830         {
831           free (page->join_crossing[i]);
832           free (page->cp[i]);
833         }
834
835       free (page);
836     }
837 }
838
839 /* Returns the size of PAGE along AXIS.  (This might be larger than the page
840    size specified in the parameters passed to render_page_create().  Use a
841    render_break to break up a render_page into page-sized chunks.) */
842 static int
843 render_page_get_size (const struct render_page *page, enum table_axis axis)
844 {
845   return page->cp[axis][page->n[axis] * 2 + 1];
846 }
847
848 static int
849 render_page_get_best_breakpoint (const struct render_page *page, int height)
850 {
851   int y;
852
853   /* If there's no room for at least the top row and the rules above and below
854      it, don't include any of the table. */
855   if (page->cp[V][3] > height)
856     return 0;
857
858   /* Otherwise include as many rows and rules as we can. */
859   for (y = 5; y <= 2 * page->n[V] + 1; y += 2)
860     if (page->cp[V][y] > height)
861       return page->cp[V][y - 2];
862   return height;
863 }
864 \f
865 /* Drawing render_pages. */
866
867 static inline enum render_line_style
868 get_rule (const struct render_page *page, enum table_axis axis,
869           const int d[TABLE_N_AXES])
870 {
871   return rule_to_render_type (table_get_rule (page->table,
872                                               axis, d[H] / 2, d[V] / 2));
873 }
874
875 static bool
876 is_rule (int z)
877 {
878   return !(z & 1);
879 }
880
881 bool
882 render_direction_rtl (void)
883 {
884   /* TRANSLATORS: Do not translate this string.  If the script of your language
885      reads from right to left (eg Persian, Arabic, Hebrew etc), then replace
886      this string with "output-direction-rtl".  Otherwise either leave it
887      untranslated or copy it verbatim. */
888   const char *dir = _("output-direction-ltr");
889   if ( 0 == strcmp ("output-direction-rtl", dir))
890     return true;
891
892   if ( 0 != strcmp ("output-direction-ltr", dir))
893     fprintf (stderr, "This localisation has been incorrectly translated.  Complain to the translator.\n");
894
895   return false;
896 }
897
898 static void
899 render_rule (const struct render_page *page, const int ofs[TABLE_N_AXES],
900              const int d[TABLE_N_AXES])
901 {
902   enum render_line_style styles[TABLE_N_AXES][2];
903   enum table_axis a;
904
905   for (a = 0; a < TABLE_N_AXES; a++)
906     {
907       enum table_axis b = !a;
908
909       styles[a][0] = styles[a][1] = RENDER_LINE_NONE;
910
911       if (!is_rule (d[a])
912           || (page->is_edge_cutoff[a][0] && d[a] == 0)
913           || (page->is_edge_cutoff[a][1] && d[a] == page->n[a] * 2))
914         continue;
915
916       if (is_rule (d[b]))
917         {
918           if (d[b] > 0)
919             {
920               int e[TABLE_N_AXES];
921               e[H] = d[H];
922               e[V] = d[V];
923               e[b]--;
924               styles[a][0] = get_rule (page, a, e);
925             }
926
927           if (d[b] / 2 < page->table->n[b])
928             styles[a][1] = get_rule (page, a, d);
929         }
930       else
931         styles[a][0] = styles[a][1] = get_rule (page, a, d);
932     }
933
934   if (styles[H][0] != RENDER_LINE_NONE || styles[H][1] != RENDER_LINE_NONE
935       || styles[V][0] != RENDER_LINE_NONE || styles[V][1] != RENDER_LINE_NONE)
936     {
937       int bb[TABLE_N_AXES][2];
938
939       bb[H][0] = ofs[H] + page->cp[H][d[H]];
940       bb[H][1] = ofs[H] + page->cp[H][d[H] + 1];
941       if (render_direction_rtl ())
942         {
943           int temp = bb[H][0];
944           bb[H][0] = render_page_get_size (page, H) - bb[H][1];
945           bb[H][1] = render_page_get_size (page, H) - temp;
946         }
947       bb[V][0] = ofs[V] + page->cp[V][d[V]];
948       bb[V][1] = ofs[V] + page->cp[V][d[V] + 1];
949       page->params->draw_line (page->params->aux, bb, styles);
950     }
951 }
952
953 static void
954 render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES],
955              const struct table_cell *cell)
956 {
957   const struct render_overflow *of;
958   int bb[TABLE_N_AXES][2];
959   int clip[TABLE_N_AXES][2];
960
961   bb[H][0] = clip[H][0] = ofs[H] + page->cp[H][cell->d[H][0] * 2 + 1];
962   bb[H][1] = clip[H][1] = ofs[H] + page->cp[H][cell->d[H][1] * 2];
963   if (render_direction_rtl ())
964     {
965       int temp = bb[H][0];
966       bb[H][0] = clip[H][0] = render_page_get_size (page, H) - bb[H][1];
967       bb[H][1] = clip[H][1] = render_page_get_size (page, H) - temp;
968     }
969   bb[V][0] = clip[V][0] = ofs[V] + page->cp[V][cell->d[V][0] * 2 + 1];
970   bb[V][1] = clip[V][1] = ofs[V] + page->cp[V][cell->d[V][1] * 2];
971
972   int valign = (cell->n_contents
973                 ? cell->contents->options & TAB_VALIGN
974                 : TAB_TOP);
975   if (valign != TAB_TOP)
976     {
977       int height = page->params->measure_cell_height (
978         page->params->aux, cell, bb[H][1] - bb[H][0]);
979       int extra = bb[V][1] - bb[V][0] - height;
980       if (extra > 0)
981         {
982           if (valign == TAB_MIDDLE)
983             extra /= 2;
984           bb[V][0] += extra;
985         }
986     }
987
988   of = find_overflow (page, cell->d[H][0], cell->d[V][0]);
989   if (of)
990     {
991       enum table_axis axis;
992
993       for (axis = 0; axis < TABLE_N_AXES; axis++)
994         {
995           if (of->overflow[axis][0])
996             {
997               bb[axis][0] -= of->overflow[axis][0];
998               if (cell->d[axis][0] == 0 && !page->is_edge_cutoff[axis][0])
999                 clip[axis][0] = ofs[axis] + page->cp[axis][cell->d[axis][0] * 2];
1000             }
1001           if (of->overflow[axis][1])
1002             {
1003               bb[axis][1] += of->overflow[axis][1];
1004               if (cell->d[axis][1] == page->n[axis] && !page->is_edge_cutoff[axis][1])
1005                 clip[axis][1] = ofs[axis] + page->cp[axis][cell->d[axis][1] * 2 + 1];
1006             }
1007         }
1008     }
1009
1010   page->params->draw_cell (page->params->aux, cell, bb, clip);
1011 }
1012
1013 /* Draws the cells of PAGE indicated in BB. */
1014 static void
1015 render_page_draw_cells (const struct render_page *page,
1016                         int ofs[TABLE_N_AXES], int bb[TABLE_N_AXES][2])
1017 {
1018   int x, y;
1019
1020   for (y = bb[V][0]; y < bb[V][1]; y++)
1021     for (x = bb[H][0]; x < bb[H][1]; )
1022       if (is_rule (x) || is_rule (y))
1023         {
1024           int d[TABLE_N_AXES];
1025           d[H] = x;
1026           d[V] = y;
1027           render_rule (page, ofs, d);
1028           x++;
1029         }
1030       else
1031         {
1032           struct table_cell cell;
1033
1034           table_get_cell (page->table, x / 2, y / 2, &cell);
1035           if (y / 2 == bb[V][0] / 2 || y / 2 == cell.d[V][0])
1036             render_cell (page, ofs, &cell);
1037           x = rule_ofs (cell.d[H][1]);
1038           table_cell_free (&cell);
1039         }
1040 }
1041
1042 /* Renders PAGE, by calling the 'draw_line' and 'draw_cell' functions from the
1043    render_params provided to render_page_create(). */
1044 static void
1045 render_page_draw (const struct render_page *page, int ofs[TABLE_N_AXES])
1046 {
1047   int bb[TABLE_N_AXES][2];
1048
1049   bb[H][0] = 0;
1050   bb[H][1] = page->n[H] * 2 + 1;
1051   bb[V][0] = 0;
1052   bb[V][1] = page->n[V] * 2 + 1;
1053
1054   render_page_draw_cells (page, ofs, bb);
1055 }
1056
1057 /* Returns the greatest value i, 0 <= i < n, such that cp[i] <= x0. */
1058 static int
1059 get_clip_min_extent (int x0, const int cp[], int n)
1060 {
1061   int low, high, best;
1062
1063   low = 0;
1064   high = n;
1065   best = 0;
1066   while (low < high)
1067     {
1068       int middle = low + (high - low) / 2;
1069
1070       if (cp[middle] <= x0)
1071         {
1072           best = middle;
1073           low = middle + 1;
1074         }
1075       else
1076         high = middle;
1077     }
1078
1079   return best;
1080 }
1081
1082 /* Returns the least value i, 0 <= i < n, such that cp[i] >= x1. */
1083 static int
1084 get_clip_max_extent (int x1, const int cp[], int n)
1085 {
1086   int low, high, best;
1087
1088   low = 0;
1089   high = n;
1090   best = n;
1091   while (low < high)
1092     {
1093       int middle = low + (high - low) / 2;
1094
1095       if (cp[middle] >= x1)
1096         best = high = middle;
1097       else
1098         low = middle + 1;
1099     }
1100
1101   while (best > 0 && cp[best - 1] == cp[best])
1102     best--;
1103
1104   return best;
1105 }
1106
1107 /* Renders the cells of PAGE that intersect (X,Y)-(X+W,Y+H), by calling the
1108    'draw_line' and 'draw_cell' functions from the render_params provided to
1109    render_page_create(). */
1110 static void
1111 render_page_draw_region (const struct render_page *page,
1112                          int ofs[TABLE_N_AXES], int clip[TABLE_N_AXES][2])
1113 {
1114   int bb[TABLE_N_AXES][2];
1115
1116   bb[H][0] = get_clip_min_extent (clip[H][0], page->cp[H], page->n[H] * 2 + 1);
1117   bb[H][1] = get_clip_max_extent (clip[H][1], page->cp[H], page->n[H] * 2 + 1);
1118   bb[V][0] = get_clip_min_extent (clip[V][0], page->cp[V], page->n[V] * 2 + 1);
1119   bb[V][1] = get_clip_max_extent (clip[V][1], page->cp[V], page->n[V] * 2 + 1);
1120
1121   render_page_draw_cells (page, ofs, bb);
1122 }
1123
1124 /* Breaking up tables to fit on a page. */
1125
1126 /* An iterator for breaking render_pages into smaller chunks. */
1127 struct render_break
1128   {
1129     struct render_page *page;   /* Page being broken up. */
1130     enum table_axis axis;       /* Axis along which 'page' is being broken. */
1131     int z;                      /* Next cell along 'axis'. */
1132     int pixel;                  /* Pixel offset within cell 'z' (usually 0). */
1133     int hw;                     /* Width of headers of 'page' along 'axis'. */
1134   };
1135
1136 static int needed_size (const struct render_break *, int cell);
1137 static bool cell_is_breakable (const struct render_break *, int cell);
1138 static struct render_page *render_page_select (const struct render_page *,
1139                                                enum table_axis,
1140                                                int z0, int p0,
1141                                                int z1, int p1);
1142
1143 /* Initializes render_break B for breaking PAGE along AXIS.
1144    Takes ownership of PAGE. */
1145 static void
1146 render_break_init (struct render_break *b, struct render_page *page,
1147                    enum table_axis axis)
1148 {
1149   b->page = page;
1150   b->axis = axis;
1151   b->z = page->h[axis][0];
1152   b->pixel = 0;
1153   b->hw = headers_width (page, axis);
1154 }
1155
1156 /* Initializes B as a render_break structure for which
1157    render_break_has_next() always returns false. */
1158 static void
1159 render_break_init_empty (struct render_break *b)
1160 {
1161   b->page = NULL;
1162   b->axis = TABLE_HORZ;
1163   b->z = 0;
1164   b->pixel = 0;
1165   b->hw = 0;
1166 }
1167
1168 /* Frees B and unrefs the render_page that it owns. */
1169 static void
1170 render_break_destroy (struct render_break *b)
1171 {
1172   if (b != NULL)
1173     {
1174       render_page_unref (b->page);
1175       b->page = NULL;
1176     }
1177 }
1178
1179 /* Returns true if B still has cells that are yet to be returned,
1180    false if all of B's page has been processed. */
1181 static bool
1182 render_break_has_next (const struct render_break *b)
1183 {
1184   const struct render_page *page = b->page;
1185   enum table_axis axis = b->axis;
1186
1187   return page != NULL && b->z < page->n[axis] - page->h[axis][1];
1188 }
1189
1190 /* Returns a new render_page that is up to SIZE pixels wide along B's axis.
1191    Returns a null pointer if B has already been completely broken up, or if
1192    SIZE is too small to reasonably render any cells.  The latter will never
1193    happen if SIZE is at least as large as the page size passed to
1194    render_page_create() along B's axis. */
1195 static struct render_page *
1196 render_break_next (struct render_break *b, int size)
1197 {
1198   const struct render_page *page = b->page;
1199   enum table_axis axis = b->axis;
1200   struct render_page *subpage;
1201   int z, pixel;
1202
1203   if (!render_break_has_next (b))
1204     return NULL;
1205
1206   pixel = 0;
1207   for (z = b->z; z < page->n[axis] - page->h[axis][1]; z++)
1208     {
1209       int needed = needed_size (b, z + 1);
1210       if (needed > size)
1211         {
1212           if (cell_is_breakable (b, z))
1213             {
1214               /* If there is no right header and we render a partial cell on
1215                  the right side of the body, then we omit the rightmost rule of
1216                  the body.  Otherwise the rendering is deceptive because it
1217                  looks like the whole cell is present instead of a partial
1218                  cell.
1219
1220                  This is similar to code for the left side in needed_size(). */
1221               int rule_allowance = (page->h[axis][1]
1222                                     ? 0
1223                                     : rule_width (page, axis, z));
1224
1225               /* The amount that, if we added cell 'z', the rendering would
1226                  overfill the allocated 'size'. */
1227               int overhang = needed - size - rule_allowance;
1228
1229               /* The width of cell 'z'. */
1230               int cell_size = cell_width (page, axis, z);
1231
1232               /* The amount trimmed off the left side of 'z',
1233                  and the amount left to render. */
1234               int cell_ofs = z == b->z ? b->pixel : 0;
1235               int cell_left = cell_size - cell_ofs;
1236
1237               /* A small but visible width.  */
1238               int em = page->params->font_size[axis];
1239
1240               /* If some of the cell remains to render,
1241                  and there would still be some of the cell left afterward,
1242                  then partially render that much of the cell. */
1243               pixel = (cell_left && cell_left > overhang
1244                        ? cell_left - overhang + cell_ofs
1245                        : 0);
1246
1247               /* If there would be only a tiny amount of the cell left after
1248                  rendering it partially, reduce the amount rendered slightly
1249                  to make the output look a little better. */
1250               if (pixel + em > cell_size)
1251                 pixel = MAX (pixel - em, 0);
1252
1253               /* If we're breaking vertically, then consider whether the cells
1254                  being broken have a better internal breakpoint than the exact
1255                  number of pixels available, which might look bad e.g. because
1256                  it breaks in the middle of a line of text. */
1257               if (axis == TABLE_VERT && page->params->adjust_break)
1258                 {
1259                   int x;
1260
1261                   for (x = 0; x < page->n[H]; )
1262                     {
1263                       struct table_cell cell;
1264                       int better_pixel;
1265                       int w;
1266
1267                       table_get_cell (page->table, x, z, &cell);
1268                       w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
1269                       better_pixel = page->params->adjust_break (
1270                         page->params->aux, &cell, w, pixel);
1271                       x = cell.d[H][1];
1272                       table_cell_free (&cell);
1273
1274                       if (better_pixel < pixel)
1275                         {
1276                           if (better_pixel > (z == b->z ? b->pixel : 0))
1277                             {
1278                               pixel = better_pixel;
1279                               break;
1280                             }
1281                           else if (better_pixel == 0 && z != b->z)
1282                             {
1283                               pixel = 0;
1284                               break;
1285                             }
1286                         }
1287                     }
1288                 }
1289             }
1290           break;
1291         }
1292     }
1293
1294   if (z == b->z && !pixel)
1295     return NULL;
1296
1297   subpage = render_page_select (page, axis, b->z, b->pixel,
1298                                 pixel ? z + 1 : z,
1299                                 pixel ? cell_width (page, axis, z) - pixel
1300                                 : 0);
1301   b->z = z;
1302   b->pixel = pixel;
1303   return subpage;
1304 }
1305
1306 /* Returns the width that would be required along B's axis to render a page
1307    from B's current position up to but not including CELL. */
1308 static int
1309 needed_size (const struct render_break *b, int cell)
1310 {
1311   const struct render_page *page = b->page;
1312   enum table_axis axis = b->axis;
1313   int size;
1314
1315   /* Width of left header not including its rightmost rule.  */
1316   size = axis_width (page, axis, 0, rule_ofs (page->h[axis][0]));
1317
1318   /* If we have a pixel offset and there is no left header, then we omit the
1319      leftmost rule of the body.  Otherwise the rendering is deceptive because
1320      it looks like the whole cell is present instead of a partial cell.
1321
1322      Otherwise (if there are headers) we will be merging two rules: the
1323      rightmost rule in the header and the leftmost rule in the body.  We assume
1324      that the width of a merged rule is the larger of the widths of either rule
1325      invidiually. */
1326   if (b->pixel == 0 || page->h[axis][0])
1327     size += MAX (rule_width (page, axis, page->h[axis][0]),
1328                  rule_width (page, axis, b->z));
1329
1330   /* Width of body, minus any pixel offset in the leftmost cell. */
1331   size += joined_width (page, axis, b->z, cell) - b->pixel;
1332
1333   /* Width of rightmost rule in body merged with leftmost rule in headers. */
1334   size += MAX (rule_width_r (page, axis, page->h[axis][1]),
1335                rule_width (page, axis, cell));
1336
1337   /* Width of right header not including its leftmost rule. */
1338   size += axis_width (page, axis, rule_ofs_r (page, axis, page->h[axis][1]),
1339                       rule_ofs_r (page, axis, 0));
1340
1341   /* Join crossing. */
1342   if (page->h[axis][0] && page->h[axis][1])
1343     size += page->join_crossing[axis][b->z];
1344
1345   return size;
1346 }
1347
1348 /* Returns true if CELL along B's axis may be broken across a page boundary.
1349
1350    This is just a heuristic.  Breaking cells across page boundaries can save
1351    space, but it looks ugly. */
1352 static bool
1353 cell_is_breakable (const struct render_break *b, int cell)
1354 {
1355   const struct render_page *page = b->page;
1356   enum table_axis axis = b->axis;
1357
1358   return cell_width (page, axis, cell) >= page->params->min_break[axis];
1359 }
1360 \f
1361 /* render_pager. */
1362
1363 struct render_pager
1364   {
1365     const struct render_params *params;
1366
1367     struct render_page **pages;
1368     size_t n_pages, allocated_pages;
1369
1370     size_t cur_page;
1371     struct render_break x_break;
1372     struct render_break y_break;
1373   };
1374
1375 static const struct render_page *
1376 render_pager_add_table (struct render_pager *p, struct table *table)
1377 {
1378   struct render_page *page;
1379
1380   if (p->n_pages >= p->allocated_pages)
1381     p->pages = x2nrealloc (p->pages, &p->allocated_pages, sizeof *p->pages);
1382   page = p->pages[p->n_pages++] = render_page_create (p->params, table);
1383   return page;
1384 }
1385
1386 static void
1387 render_pager_start_page (struct render_pager *p)
1388 {
1389   render_break_init (&p->x_break, render_page_ref (p->pages[p->cur_page++]),
1390                      H);
1391   render_break_init_empty (&p->y_break);
1392 }
1393
1394 static void
1395 add_footnote_page (struct render_pager *p, const struct table_item *item)
1396 {
1397   const struct footnote **f;
1398   size_t n_footnotes = table_collect_footnotes (item, &f);
1399   if (!n_footnotes)
1400     return;
1401
1402   struct tab_table *t = tab_create (2, n_footnotes);
1403
1404   for (size_t i = 0; i < n_footnotes; i++)
1405     if (f[i])
1406       {
1407         tab_text_format (t, 0, i, TAB_LEFT, "%s.", f[i]->marker);
1408         tab_text (t, 1, i, TAB_LEFT, f[i]->content);
1409       }
1410   render_pager_add_table (p, &t->table);
1411
1412   free (f);
1413 }
1414
1415 static void
1416 add_text_page (struct render_pager *p, const struct table_item_text *t)
1417 {
1418   if (!t)
1419     return;
1420
1421   struct tab_table *tab = tab_create (1, 1);
1422   tab_text (tab, 0, 0, TAB_LEFT, t->content);
1423   for (size_t i = 0; i < t->n_footnotes; i++)
1424     tab_add_footnote (tab, 0, 0, t->footnotes[i]);
1425   render_pager_add_table (p, &tab->table);
1426 }
1427
1428 /* Creates and returns a new render_pager for rendering TABLE_ITEM on the
1429    device with the given PARAMS. */
1430 struct render_pager *
1431 render_pager_create (const struct render_params *params,
1432                      const struct table_item *table_item)
1433 {
1434   struct render_pager *p;
1435
1436   p = xzalloc (sizeof *p);
1437   p->params = params;
1438
1439   /* Title. */
1440   add_text_page (p, table_item_get_title (table_item));
1441
1442   /* Body. */
1443   render_pager_add_table (p, table_ref (table_item_get_table (table_item)));
1444
1445   /* Caption. */
1446   add_text_page (p, table_item_get_caption (table_item));
1447
1448   /* Footnotes. */
1449   add_footnote_page (p, table_item);
1450
1451   render_pager_start_page (p);
1452
1453   return p;
1454 }
1455
1456 /* Destroys P. */
1457 void
1458 render_pager_destroy (struct render_pager *p)
1459 {
1460   if (p)
1461     {
1462       size_t i;
1463
1464       render_break_destroy (&p->x_break);
1465       render_break_destroy (&p->y_break);
1466       for (i = 0; i < p->n_pages; i++)
1467         render_page_unref (p->pages[i]);
1468       free (p->pages);
1469       free (p);
1470     }
1471 }
1472
1473 /* Returns true if P has content remaining to render, false if rendering is
1474    done. */
1475 bool
1476 render_pager_has_next (const struct render_pager *p_)
1477 {
1478   struct render_pager *p = CONST_CAST (struct render_pager *, p_);
1479
1480   while (!render_break_has_next (&p->y_break))
1481     {
1482       render_break_destroy (&p->y_break);
1483       if (!render_break_has_next (&p->x_break))
1484         {
1485           render_break_destroy (&p->x_break);
1486           if (p->cur_page >= p->n_pages)
1487             {
1488               render_break_init_empty (&p->x_break);
1489               render_break_init_empty (&p->y_break);
1490               return false;
1491             }
1492           render_pager_start_page (p);
1493         }
1494       else
1495         render_break_init (&p->y_break,
1496                            render_break_next (&p->x_break, p->params->size[H]), V);
1497     }
1498   return true;
1499 }
1500
1501 /* Draws a chunk of content from P to fit in a space that has vertical size
1502    SPACE and the horizontal size specified in the render_params passed to
1503    render_page_create().  Returns the amount of space actually used by the
1504    rendered chunk, which will be 0 if SPACE is too small to render anything or
1505    if no content remains (use render_pager_has_next() to distinguish these
1506    cases). */
1507 int
1508 render_pager_draw_next (struct render_pager *p, int space)
1509 {
1510   int ofs[TABLE_N_AXES] = { 0, 0 };
1511   size_t start_page = SIZE_MAX;
1512
1513   while (render_pager_has_next (p))
1514     {
1515       struct render_page *page;
1516
1517       if (start_page == p->cur_page)
1518         break;
1519       start_page = p->cur_page;
1520
1521       page = render_break_next (&p->y_break, space - ofs[V]);
1522       if (!page)
1523         break;
1524
1525       render_page_draw (page, ofs);
1526       ofs[V] += render_page_get_size (page, V);
1527       render_page_unref (page);
1528     }
1529   return ofs[V];
1530 }
1531
1532 /* Draws all of P's content. */
1533 void
1534 render_pager_draw (const struct render_pager *p)
1535 {
1536   render_pager_draw_region (p, 0, 0, INT_MAX, INT_MAX);
1537 }
1538
1539 /* Draws the region of P's content that lies in the region (X,Y)-(X+W,Y+H).
1540    Some extra content might be drawn; the device should perform clipping as
1541    necessary. */
1542 void
1543 render_pager_draw_region (const struct render_pager *p,
1544                           int x, int y, int w, int h)
1545 {
1546   int ofs[TABLE_N_AXES] = { 0, 0 };
1547   int clip[TABLE_N_AXES][2];
1548   size_t i;
1549
1550   clip[H][0] = x;
1551   clip[H][1] = x + w;
1552   for (i = 0; i < p->n_pages; i++)
1553     {
1554       const struct render_page *page = p->pages[i];
1555       int size = render_page_get_size (page, V);
1556
1557       clip[V][0] = MAX (y, ofs[V]) - ofs[V];
1558       clip[V][1] = MIN (y + h, ofs[V] + size) - ofs[V];
1559       if (clip[V][1] > clip[V][0])
1560         render_page_draw_region (page, ofs, clip);
1561
1562       ofs[V] += size;
1563     }
1564 }
1565
1566 /* Returns the size of P's content along AXIS; i.e. the content's width if AXIS
1567    is TABLE_HORZ and its length if AXIS is TABLE_VERT. */
1568 int
1569 render_pager_get_size (const struct render_pager *p, enum table_axis axis)
1570 {
1571   int size = 0;
1572   size_t i;
1573
1574   for (i = 0; i < p->n_pages; i++)
1575     {
1576       int subsize = render_page_get_size (p->pages[i], axis);
1577       size = axis == H ? MAX (size, subsize) : size + subsize;
1578     }
1579
1580   return size;
1581 }
1582
1583 int
1584 render_pager_get_best_breakpoint (const struct render_pager *p, int height)
1585 {
1586   int y = 0;
1587   size_t i;
1588
1589   for (i = 0; i < p->n_pages; i++)
1590     {
1591       int size = render_page_get_size (p->pages[i], V);
1592       if (y + size >= height)
1593         return render_page_get_best_breakpoint (p->pages[i], height - y) + y;
1594       y += size;
1595     }
1596
1597   return height;
1598 }
1599 \f
1600 /* render_page_select() and helpers. */
1601
1602 struct render_page_selection
1603   {
1604     const struct render_page *page; /* Page whose slice we are selecting. */
1605     struct render_page *subpage; /* New page under construction. */
1606     enum table_axis a;   /* Axis of 'page' along which 'subpage' is a slice. */
1607     enum table_axis b;   /* The opposite of 'a'. */
1608     int z0;              /* First cell along 'a' being selected. */
1609     int z1;              /* Last cell being selected, plus 1. */
1610     int p0;              /* Number of pixels to trim off left side of z0. */
1611     int p1;              /* Number of pixels to trim off right side of z1-1. */
1612   };
1613
1614 static void cell_to_subpage (struct render_page_selection *,
1615                              const struct table_cell *,
1616                              int subcell[TABLE_N_AXES]);
1617 static const struct render_overflow *find_overflow_for_cell (
1618   struct render_page_selection *, const struct table_cell *);
1619 static struct render_overflow *insert_overflow (struct render_page_selection *,
1620                                                 const struct table_cell *);
1621
1622 /* Creates and returns a new render_page whose contents are a subregion of
1623    PAGE's contents.  The new render_page includes cells Z0 through Z1
1624    (exclusive) along AXIS, plus any headers on AXIS.
1625
1626    If P0 is nonzero, then it is a number of pixels to exclude from the left or
1627    top (according to AXIS) of cell Z0.  Similarly, P1 is a number of pixels to
1628    exclude from the right or bottom of cell Z1 - 1.  (P0 and P1 are used to
1629    render cells that are too large to fit on a single page.)
1630
1631    The whole of axis !AXIS is included.  (The caller may follow up with another
1632    call to render_page_select() to select on !AXIS to select on that axis as
1633    well.)
1634
1635    The caller retains ownership of PAGE, which is not modified. */
1636 static struct render_page *
1637 render_page_select (const struct render_page *page, enum table_axis axis,
1638                     int z0, int p0, int z1, int p1)
1639 {
1640   struct render_page_selection s;
1641   enum table_axis a = axis;
1642   enum table_axis b = !a;
1643   struct render_page *subpage;
1644   struct render_overflow *ro;
1645   int *dcp, *scp;
1646   int *jc;
1647   int z;
1648
1649
1650   /* Optimize case where all of PAGE is selected by just incrementing the
1651      reference count. */
1652   if (z0 == page->h[a][0] && p0 == 0
1653       && z1 == page->n[a] - page->h[a][1] && p1 == 0)
1654     {
1655       struct render_page *page_rw = CONST_CAST (struct render_page *, page);
1656       page_rw->ref_cnt++;
1657       return page_rw;
1658     }
1659
1660   /* Allocate subpage. */
1661   subpage = render_page_allocate (page->params,
1662                                   table_select_slice (
1663                                     table_ref (page->table),
1664                                     a, z0, z1, true));
1665
1666   /* An edge is cut off if it was cut off in PAGE or if we're trimming pixels
1667      off that side of the page and there are no headers. */
1668   subpage->is_edge_cutoff[a][0] =
1669     subpage->h[a][0] == 0 && (p0 || (z0 == 0 && page->is_edge_cutoff[a][0]));
1670   subpage->is_edge_cutoff[a][1] =
1671     subpage->h[a][1] == 0 && (p1 || (z1 == page->n[a]
1672                                      && page->is_edge_cutoff[a][1]));
1673   subpage->is_edge_cutoff[b][0] = page->is_edge_cutoff[b][0];
1674   subpage->is_edge_cutoff[b][1] = page->is_edge_cutoff[b][1];
1675
1676   /* Select join crossings from PAGE into subpage. */
1677   jc = subpage->join_crossing[a];
1678   for (z = 0; z < page->h[a][0]; z++)
1679     *jc++ = page->join_crossing[a][z];
1680   for (z = z0; z <= z1; z++)
1681     *jc++ = page->join_crossing[a][z];
1682   for (z = page->n[a] - page->h[a][1]; z < page->n[a]; z++)
1683     *jc++ = page->join_crossing[a][z];
1684   assert (jc == &subpage->join_crossing[a][subpage->n[a] + 1]);
1685
1686   memcpy (subpage->join_crossing[b], page->join_crossing[b],
1687           (subpage->n[b] + 1) * sizeof **subpage->join_crossing);
1688
1689   /* Select widths from PAGE into subpage. */
1690   scp = page->cp[a];
1691   dcp = subpage->cp[a];
1692   *dcp = 0;
1693   for (z = 0; z <= rule_ofs (subpage->h[a][0]); z++, dcp++)
1694     {
1695       if (z == 0 && subpage->is_edge_cutoff[a][0])
1696         dcp[1] = dcp[0];
1697       else
1698         dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1699     }
1700   for (z = cell_ofs (z0); z <= cell_ofs (z1 - 1); z++, dcp++)
1701     {
1702       dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1703       if (z == cell_ofs (z0))
1704         {
1705           dcp[1] -= p0;
1706           if (page->h[a][0] && page->h[a][1])
1707             dcp[1] += page->join_crossing[a][z / 2];
1708         }
1709       if (z == cell_ofs (z1 - 1))
1710         dcp[1] -= p1;
1711     }
1712   for (z = rule_ofs_r (page, a, subpage->h[a][1]);
1713        z <= rule_ofs_r (page, a, 0); z++, dcp++)
1714     {
1715       if (z == rule_ofs_r (page, a, 0) && subpage->is_edge_cutoff[a][1])
1716         dcp[1] = dcp[0];
1717       else
1718         dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1719     }
1720   assert (dcp == &subpage->cp[a][2 * subpage->n[a] + 1]);
1721
1722   for (z = 0; z < page->n[b] * 2 + 2; z++)
1723     subpage->cp[b][z] = page->cp[b][z];
1724
1725   /* Add new overflows. */
1726   s.page = page;
1727   s.a = a;
1728   s.b = b;
1729   s.z0 = z0;
1730   s.z1 = z1;
1731   s.p0 = p0;
1732   s.p1 = p1;
1733   s.subpage = subpage;
1734
1735   if (!page->h[a][0] || z0 > page->h[a][0] || p0)
1736     for (z = 0; z < page->n[b]; )
1737       {
1738         struct table_cell cell;
1739         int d[TABLE_N_AXES];
1740         bool overflow0;
1741         bool overflow1;
1742
1743         d[a] = z0;
1744         d[b] = z;
1745
1746         table_get_cell (page->table, d[H], d[V], &cell);
1747         overflow0 = p0 || cell.d[a][0] < z0;
1748         overflow1 = cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1);
1749         if (overflow0 || overflow1)
1750           {
1751             ro = insert_overflow (&s, &cell);
1752
1753             if (overflow0)
1754               {
1755                 ro->overflow[a][0] += p0 + axis_width (
1756                   page, a, cell_ofs (cell.d[a][0]), cell_ofs (z0));
1757                 if (page->h[a][0] && page->h[a][1])
1758                   ro->overflow[a][0] -= page->join_crossing[a][cell.d[a][0]
1759                                                                + 1];
1760               }
1761
1762             if (overflow1)
1763               {
1764                 ro->overflow[a][1] += p1 + axis_width (
1765                   page, a, cell_ofs (z1), cell_ofs (cell.d[a][1]));
1766                 if (page->h[a][0] && page->h[a][1])
1767                   ro->overflow[a][1] -= page->join_crossing[a][cell.d[a][1]];
1768               }
1769           }
1770         z = cell.d[b][1];
1771         table_cell_free (&cell);
1772       }
1773
1774   if (!page->h[a][1] || z1 < page->n[a] - page->h[a][1] || p1)
1775     for (z = 0; z < page->n[b]; )
1776       {
1777         struct table_cell cell;
1778         int d[TABLE_N_AXES];
1779
1780         d[a] = z1 - 1;
1781         d[b] = z;
1782         table_get_cell (page->table, d[H], d[V], &cell);
1783         if ((cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1))
1784             && find_overflow_for_cell (&s, &cell) == NULL)
1785           {
1786             ro = insert_overflow (&s, &cell);
1787             ro->overflow[a][1] += p1 + axis_width (page, a, cell_ofs (z1),
1788                                                    cell_ofs (cell.d[a][1]));
1789           }
1790         z = cell.d[b][1];
1791         table_cell_free (&cell);
1792       }
1793
1794   /* Copy overflows from PAGE into subpage. */
1795   HMAP_FOR_EACH (ro, struct render_overflow, node, &page->overflows)
1796     {
1797       struct table_cell cell;
1798
1799       table_get_cell (page->table, ro->d[H], ro->d[V], &cell);
1800       if (cell.d[a][1] > z0 && cell.d[a][0] < z1
1801           && find_overflow_for_cell (&s, &cell) == NULL)
1802         insert_overflow (&s, &cell);
1803       table_cell_free (&cell);
1804     }
1805
1806   return subpage;
1807 }
1808
1809 /* Given CELL, a table_cell within S->page, stores in SUBCELL the (x,y)
1810    coordinates of the top-left cell as it will appear in S->subpage.
1811
1812    CELL must actually intersect the region of S->page that is being selected
1813    by render_page_select() or the results will not make any sense. */
1814 static void
1815 cell_to_subpage (struct render_page_selection *s,
1816                  const struct table_cell *cell, int subcell[TABLE_N_AXES])
1817 {
1818   enum table_axis a = s->a;
1819   enum table_axis b = s->b;
1820   int ha0 = s->subpage->h[a][0];
1821
1822   subcell[a] = MAX (cell->d[a][0] - s->z0 + ha0, ha0);
1823   subcell[b] = cell->d[b][0];
1824 }
1825
1826 /* Given CELL, a table_cell within S->page, returns the render_overflow for
1827    that cell in S->subpage, if there is one, and a null pointer otherwise.
1828
1829    CELL must actually intersect the region of S->page that is being selected
1830    by render_page_select() or the results will not make any sense. */
1831 static const struct render_overflow *
1832 find_overflow_for_cell (struct render_page_selection *s,
1833                         const struct table_cell *cell)
1834 {
1835   int subcell[2];
1836
1837   cell_to_subpage (s, cell, subcell);
1838   return find_overflow (s->subpage, subcell[H], subcell[V]);
1839 }
1840
1841 /* Given CELL, a table_cell within S->page, inserts a render_overflow for that
1842    cell in S->subpage (which must not already exist).  Initializes the new
1843    render_overflow's 'overflow' member from the overflow for CELL in S->page,
1844    if there is one.
1845
1846    CELL must actually intersect the region of S->page that is being selected
1847    by render_page_select() or the results will not make any sense. */
1848 static struct render_overflow *
1849 insert_overflow (struct render_page_selection *s,
1850                  const struct table_cell *cell)
1851 {
1852   const struct render_overflow *old;
1853   struct render_overflow *of;
1854
1855   of = xzalloc (sizeof *of);
1856   cell_to_subpage (s, cell, of->d);
1857   hmap_insert (&s->subpage->overflows, &of->node,
1858                hash_cell (of->d[H], of->d[V]));
1859
1860   old = find_overflow (s->page, cell->d[H][0], cell->d[V][0]);
1861   if (old != NULL)
1862     memcpy (of->overflow, old->overflow, sizeof of->overflow);
1863
1864   return of;
1865 }