3984a44a74fea292178c19bb3b5f8f2af9b21f59
[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_NONE:
462       return RENDER_LINE_NONE;
463     case TAL_SOLID:
464       return RENDER_LINE_SINGLE;
465     case TAL_DASHED:
466       return RENDER_LINE_DASHED;
467     case TAL_THICK:
468       return RENDER_LINE_THICK;
469     case TAL_THIN:
470       return RENDER_LINE_THIN;
471     case TAL_DOUBLE:
472       return RENDER_LINE_DOUBLE;
473     default:
474       NOT_REACHED ();
475     }
476 }
477
478 /* Returns the width of the rule in TABLE that is at offset Z along axis A, if
479    rendered with PARAMS.  */
480 static int
481 measure_rule (const struct render_params *params, const struct table *table,
482               enum table_axis a, int z)
483 {
484   enum table_axis b = !a;
485   unsigned int rules;
486   int d[TABLE_N_AXES];
487
488   /* Determine all types of rules that are present, as a bitmap in 'rules'
489      where rule type 't' is present if bit 2**t is set. */
490   rules = 0;
491   d[a] = z;
492   for (d[b] = 0; d[b] < table->n[b]; d[b]++)
493     rules |= 1u << table_get_rule (table, a, d[H], d[V]);
494
495   /* Turn off TAL_NONE because it has width 0 and we needn't bother.  However,
496      if the device doesn't support margins, make sure that there is at least a
497      small gap between cells (but we don't need any at the left or right edge
498      of the table). */
499   if (rules & (1u << TAL_NONE))
500     {
501       rules &= ~(1u << TAL_NONE);
502       if (z > 0 && z < table->n[a] && !params->supports_margins && a == H)
503         rules |= 1u << TAL_SOLID;
504     }
505
506   /* Calculate maximum width of the rules that are present. */
507   int width = 0;
508   for (size_t i = 0; i < N_LINES; i++)
509     if (rules & (1u << i))
510       width = MAX (width, params->line_widths[a][rule_to_render_type (i)]);
511   return width;
512 }
513
514 /* Allocates and returns a new render_page using PARAMS and TABLE.  Allocates
515    space for all of the members of the new page, but the caller must initialize
516    the 'cp' member itself. */
517 static struct render_page *
518 render_page_allocate (const struct render_params *params,
519                       struct table *table)
520 {
521   struct render_page *page;
522   int i;
523
524   page = xmalloc (sizeof *page);
525   page->params = params;
526   page->table = table;
527   page->ref_cnt = 1;
528   page->n[H] = table->n[H];
529   page->n[V] = table->n[V];
530   page->h[H][0] = table->h[H][0];
531   page->h[H][1] = table->h[H][1];
532   page->h[V][0] = table->h[V][0];
533   page->h[V][1] = table->h[V][1];
534
535   for (i = 0; i < TABLE_N_AXES; i++)
536     {
537       page->cp[i] = xmalloc ((2 * page->n[i] + 2) * sizeof *page->cp[i]);
538       page->join_crossing[i] = xzalloc ((page->n[i] + 1) * sizeof *page->join_crossing[i]);
539     }
540
541   hmap_init (&page->overflows);
542   memset (page->is_edge_cutoff, 0, sizeof page->is_edge_cutoff);
543
544   return page;
545 }
546
547 /* Allocates and returns a new render_page for PARAMS and TABLE, initializing
548    cp[H] in the new page from ROWS and RULES.  The caller must still initialize
549    cp[V]. */
550 static struct render_page *
551 create_page_with_exact_widths (const struct render_params *params,
552                                struct table *table,
553                                const struct render_row *rows, int *rules)
554 {
555   struct render_page *page = render_page_allocate (params, table);
556   accumulate_row_widths (page, H, rows, rules);
557   return page;
558 }
559
560 /* Allocates and returns a new render_page for PARAMS and TABLE.
561
562    Initializes cp[H] in the new page by setting the width of each row 'i' to
563    somewhere between the minimum cell width ROW_MIN[i].width and the maximum
564    ROW_MAX[i].width.  Sets the width of rules to those in RULES.
565
566    W_MIN is the sum of ROWS_MIN[].width.
567
568    W_MAX is the sum of ROWS_MAX[].width.
569
570    The caller must still initialize cp[V]. */
571 static struct render_page *
572 create_page_with_interpolated_widths (const struct render_params *params,
573                                       struct table *table,
574                                       const struct render_row *rows_min,
575                                       const struct render_row *rows_max,
576                                       int w_min, int w_max, const int *rules)
577 {
578   const int n = table->n[H];
579   const long long int avail = params->size[H] - w_min;
580   const long long int wanted = w_max - w_min;
581
582   assert (wanted > 0);
583
584   struct render_page *page = render_page_allocate (params, table);
585
586   int *cph = page->cp[H];
587   *cph = 0;
588   long long int w = wanted / 2;
589   for (int x = 0; x < n; x++)
590     {
591       w += avail * (rows_max[x].width - rows_min[x].width);
592       int extra = w / wanted;
593       w -= extra * wanted;
594
595       cph[1] = cph[0] + rules[x];
596       cph[2] = cph[1] + rows_min[x].width + extra;
597       cph += 2;
598     }
599   cph[1] = cph[0] + rules[n];
600
601   assert (page->cp[H][n * 2 + 1] == params->size[H]);
602   return page;
603 }
604
605 \f
606 static void
607 set_join_crossings (struct render_page *page, enum table_axis axis,
608                     const struct table_cell *cell, int *rules)
609 {
610   int z;
611
612   for (z = cell->d[axis][0] + 1; z <= cell->d[axis][1] - 1; z++)
613     page->join_crossing[axis][z] = rules[z];
614 }
615
616 /* Creates and returns a new render_page for rendering TABLE on a device
617    described by PARAMS.
618
619    The new render_page will be suitable for rendering on a device whose page
620    size is PARAMS->size, but the caller is responsible for actually breaking it
621    up to fit on such a device, using the render_break abstraction.  */
622 static struct render_page *
623 render_page_create (const struct render_params *params, struct table *table)
624 {
625   struct render_page *page;
626   enum { MIN, MAX };
627   struct render_row *columns[2];
628   struct render_row *rows;
629   int table_widths[2];
630   int *rules[TABLE_N_AXES];
631   int nr, nc;
632   int x, y;
633   int i;
634   enum table_axis axis;
635
636   nc = table_nc (table);
637   nr = table_nr (table);
638
639   /* Figure out rule widths. */
640   for (axis = 0; axis < TABLE_N_AXES; axis++)
641     {
642       int n = table->n[axis] + 1;
643       int z;
644
645       rules[axis] = xnmalloc (n, sizeof *rules);
646       for (z = 0; z < n; z++)
647         rules[axis][z] = measure_rule (params, table, axis, z);
648     }
649
650   /* Calculate minimum and maximum widths of cells that do not
651      span multiple columns. */
652   for (i = 0; i < 2; i++)
653     columns[i] = xzalloc (nc * sizeof *columns[i]);
654   for (y = 0; y < nr; y++)
655     for (x = 0; x < nc; )
656       {
657         struct table_cell cell;
658
659         table_get_cell (table, x, y, &cell);
660         if (y == cell.d[V][0])
661           {
662             if (table_cell_colspan (&cell) == 1)
663               {
664                 int w[2];
665                 int i;
666
667                 params->measure_cell_width (params->aux, &cell,
668                                             &w[MIN], &w[MAX]);
669                 for (i = 0; i < 2; i++)
670                   if (columns[i][x].unspanned < w[i])
671                     columns[i][x].unspanned = w[i];
672               }
673           }
674         x = cell.d[H][1];
675         table_cell_free (&cell);
676       }
677
678   /* Distribute widths of spanned columns. */
679   for (i = 0; i < 2; i++)
680     for (x = 0; x < nc; x++)
681       columns[i][x].width = columns[i][x].unspanned;
682   for (y = 0; y < nr; y++)
683     for (x = 0; x < nc; )
684       {
685         struct table_cell cell;
686
687         table_get_cell (table, x, y, &cell);
688         if (y == cell.d[V][0] && table_cell_colspan (&cell) > 1)
689           {
690             int w[2];
691
692             params->measure_cell_width (params->aux, &cell, &w[MIN], &w[MAX]);
693             for (i = 0; i < 2; i++)
694               distribute_spanned_width (w[i], &columns[i][cell.d[H][0]],
695                                         rules[H], table_cell_colspan (&cell));
696           }
697         x = cell.d[H][1];
698         table_cell_free (&cell);
699       }
700
701   /* In pathological cases, spans can cause the minimum width of a column to
702      exceed the maximum width.  This bollixes our interpolation algorithm
703      later, so fix it up. */
704   for (i = 0; i < nc; i++)
705     if (columns[MIN][i].width > columns[MAX][i].width)
706       columns[MAX][i].width = columns[MIN][i].width;
707
708   /* Decide final column widths. */
709   for (i = 0; i < 2; i++)
710     table_widths[i] = calculate_table_width (table_nc (table),
711                                              columns[i], rules[H]);
712   if (table_widths[MAX] <= params->size[H])
713     {
714       /* Fits even with maximum widths.  Use them. */
715       page = create_page_with_exact_widths (params, table, columns[MAX],
716                                             rules[H]);
717     }
718   else if (table_widths[MIN] <= params->size[H])
719     {
720       /* Fits with minimum widths, so distribute the leftover space. */
721       page = create_page_with_interpolated_widths (
722         params, table, columns[MIN], columns[MAX],
723         table_widths[MIN], table_widths[MAX], rules[H]);
724     }
725   else
726     {
727       /* Doesn't fit even with minimum widths.  Assign minimums for now, and
728          later we can break it horizontally into multiple pages. */
729       page = create_page_with_exact_widths (params, table, columns[MIN],
730                                             rules[H]);
731     }
732
733   /* Calculate heights of cells that do not span multiple rows. */
734   rows = xzalloc (nr * sizeof *rows);
735   for (y = 0; y < nr; y++)
736     {
737       for (x = 0; x < nc; )
738         {
739           struct render_row *r = &rows[y];
740           struct table_cell cell;
741
742           table_get_cell (table, x, y, &cell);
743           if (y == cell.d[V][0])
744             {
745               if (table_cell_rowspan (&cell) == 1)
746                 {
747                   int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
748                   int h = params->measure_cell_height (params->aux, &cell, w);
749                   if (h > r->unspanned)
750                     r->unspanned = r->width = h;
751                 }
752               else
753                 set_join_crossings (page, V, &cell, rules[V]);
754
755               if (table_cell_colspan (&cell) > 1)
756                 set_join_crossings (page, H, &cell, rules[H]);
757             }
758           x = cell.d[H][1];
759           table_cell_free (&cell);
760         }
761     }
762   for (i = 0; i < 2; i++)
763     free (columns[i]);
764
765   /* Distribute heights of spanned rows. */
766   for (y = 0; y < nr; y++)
767     for (x = 0; x < nc; )
768       {
769         struct table_cell cell;
770
771         table_get_cell (table, x, y, &cell);
772         if (y == cell.d[V][0] && table_cell_rowspan (&cell) > 1)
773           {
774             int w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
775             int h = params->measure_cell_height (params->aux, &cell, w);
776             distribute_spanned_width (h, &rows[cell.d[V][0]], rules[V],
777                                       table_cell_rowspan (&cell));
778           }
779         x = cell.d[H][1];
780         table_cell_free (&cell);
781       }
782
783   /* Decide final row heights. */
784   accumulate_row_widths (page, V, rows, rules[V]);
785   free (rows);
786
787   /* Measure headers.  If they are "too big", get rid of them.  */
788   for (axis = 0; axis < TABLE_N_AXES; axis++)
789     {
790       int hw = headers_width (page, axis);
791       if (hw * 2 >= page->params->size[axis]
792           || hw + max_cell_width (page, axis) > page->params->size[axis])
793         {
794           page->table = table_unshare (page->table);
795           page->table->h[axis][0] = page->table->h[axis][1] = 0;
796           page->h[axis][0] = page->h[axis][1] = 0;
797         }
798     }
799
800   free (rules[H]);
801   free (rules[V]);
802
803   return page;
804 }
805
806 /* Increases PAGE's reference count. */
807 struct render_page *
808 render_page_ref (const struct render_page *page_)
809 {
810   struct render_page *page = CONST_CAST (struct render_page *, page_);
811   page->ref_cnt++;
812   return page;
813 }
814
815 /* Decreases PAGE's reference count and destroys PAGE if this causes the
816    reference count to fall to zero. */
817 static void
818 render_page_unref (struct render_page *page)
819 {
820   if (page != NULL && --page->ref_cnt == 0)
821     {
822       int i;
823       struct render_overflow *overflow, *next;
824
825       HMAP_FOR_EACH_SAFE (overflow, next, struct render_overflow, node,
826                           &page->overflows)
827         free (overflow);
828       hmap_destroy (&page->overflows);
829
830       table_unref (page->table);
831
832       for (i = 0; i < TABLE_N_AXES; ++i)
833         {
834           free (page->join_crossing[i]);
835           free (page->cp[i]);
836         }
837
838       free (page);
839     }
840 }
841
842 /* Returns the size of PAGE along AXIS.  (This might be larger than the page
843    size specified in the parameters passed to render_page_create().  Use a
844    render_break to break up a render_page into page-sized chunks.) */
845 static int
846 render_page_get_size (const struct render_page *page, enum table_axis axis)
847 {
848   return page->cp[axis][page->n[axis] * 2 + 1];
849 }
850
851 static int
852 render_page_get_best_breakpoint (const struct render_page *page, int height)
853 {
854   int y;
855
856   /* If there's no room for at least the top row and the rules above and below
857      it, don't include any of the table. */
858   if (page->cp[V][3] > height)
859     return 0;
860
861   /* Otherwise include as many rows and rules as we can. */
862   for (y = 5; y <= 2 * page->n[V] + 1; y += 2)
863     if (page->cp[V][y] > height)
864       return page->cp[V][y - 2];
865   return height;
866 }
867 \f
868 /* Drawing render_pages. */
869
870 static inline enum render_line_style
871 get_rule (const struct render_page *page, enum table_axis axis,
872           const int d[TABLE_N_AXES])
873 {
874   return rule_to_render_type (table_get_rule (page->table,
875                                               axis, d[H] / 2, d[V] / 2));
876 }
877
878 static bool
879 is_rule (int z)
880 {
881   return !(z & 1);
882 }
883
884 bool
885 render_direction_rtl (void)
886 {
887   /* TRANSLATORS: Do not translate this string.  If the script of your language
888      reads from right to left (eg Persian, Arabic, Hebrew etc), then replace
889      this string with "output-direction-rtl".  Otherwise either leave it
890      untranslated or copy it verbatim. */
891   const char *dir = _("output-direction-ltr");
892   if ( 0 == strcmp ("output-direction-rtl", dir))
893     return true;
894
895   if ( 0 != strcmp ("output-direction-ltr", dir))
896     fprintf (stderr, "This localisation has been incorrectly translated.  Complain to the translator.\n");
897
898   return false;
899 }
900
901 static void
902 render_rule (const struct render_page *page, const int ofs[TABLE_N_AXES],
903              const int d[TABLE_N_AXES])
904 {
905   enum render_line_style styles[TABLE_N_AXES][2];
906   enum table_axis a;
907
908   for (a = 0; a < TABLE_N_AXES; a++)
909     {
910       enum table_axis b = !a;
911
912       styles[a][0] = styles[a][1] = RENDER_LINE_NONE;
913
914       if (!is_rule (d[a])
915           || (page->is_edge_cutoff[a][0] && d[a] == 0)
916           || (page->is_edge_cutoff[a][1] && d[a] == page->n[a] * 2))
917         continue;
918
919       if (is_rule (d[b]))
920         {
921           if (d[b] > 0)
922             {
923               int e[TABLE_N_AXES];
924               e[H] = d[H];
925               e[V] = d[V];
926               e[b]--;
927               styles[a][0] = get_rule (page, a, e);
928             }
929
930           if (d[b] / 2 < page->table->n[b])
931             styles[a][1] = get_rule (page, a, d);
932         }
933       else
934         styles[a][0] = styles[a][1] = get_rule (page, a, d);
935     }
936
937   if (styles[H][0] != RENDER_LINE_NONE || styles[H][1] != RENDER_LINE_NONE
938       || styles[V][0] != RENDER_LINE_NONE || styles[V][1] != RENDER_LINE_NONE)
939     {
940       int bb[TABLE_N_AXES][2];
941
942       bb[H][0] = ofs[H] + page->cp[H][d[H]];
943       bb[H][1] = ofs[H] + page->cp[H][d[H] + 1];
944       if (render_direction_rtl ())
945         {
946           int temp = bb[H][0];
947           bb[H][0] = render_page_get_size (page, H) - bb[H][1];
948           bb[H][1] = render_page_get_size (page, H) - temp;
949         }
950       bb[V][0] = ofs[V] + page->cp[V][d[V]];
951       bb[V][1] = ofs[V] + page->cp[V][d[V] + 1];
952       page->params->draw_line (page->params->aux, bb, styles);
953     }
954 }
955
956 static void
957 render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES],
958              const struct table_cell *cell)
959 {
960   const struct render_overflow *of;
961   int bb[TABLE_N_AXES][2];
962   int clip[TABLE_N_AXES][2];
963
964   bb[H][0] = clip[H][0] = ofs[H] + page->cp[H][cell->d[H][0] * 2 + 1];
965   bb[H][1] = clip[H][1] = ofs[H] + page->cp[H][cell->d[H][1] * 2];
966   if (render_direction_rtl ())
967     {
968       int temp = bb[H][0];
969       bb[H][0] = clip[H][0] = render_page_get_size (page, H) - bb[H][1];
970       bb[H][1] = clip[H][1] = render_page_get_size (page, H) - temp;
971     }
972   bb[V][0] = clip[V][0] = ofs[V] + page->cp[V][cell->d[V][0] * 2 + 1];
973   bb[V][1] = clip[V][1] = ofs[V] + page->cp[V][cell->d[V][1] * 2];
974
975   int valign = (cell->n_contents
976                 ? cell->contents->options & TAB_VALIGN
977                 : TAB_TOP);
978   if (valign != TAB_TOP)
979     {
980       int height = page->params->measure_cell_height (
981         page->params->aux, cell, bb[H][1] - bb[H][0]);
982       int extra = bb[V][1] - bb[V][0] - height;
983       if (extra > 0)
984         {
985           if (valign == TAB_MIDDLE)
986             extra /= 2;
987           bb[V][0] += extra;
988         }
989     }
990
991   of = find_overflow (page, cell->d[H][0], cell->d[V][0]);
992   if (of)
993     {
994       enum table_axis axis;
995
996       for (axis = 0; axis < TABLE_N_AXES; axis++)
997         {
998           if (of->overflow[axis][0])
999             {
1000               bb[axis][0] -= of->overflow[axis][0];
1001               if (cell->d[axis][0] == 0 && !page->is_edge_cutoff[axis][0])
1002                 clip[axis][0] = ofs[axis] + page->cp[axis][cell->d[axis][0] * 2];
1003             }
1004           if (of->overflow[axis][1])
1005             {
1006               bb[axis][1] += of->overflow[axis][1];
1007               if (cell->d[axis][1] == page->n[axis] && !page->is_edge_cutoff[axis][1])
1008                 clip[axis][1] = ofs[axis] + page->cp[axis][cell->d[axis][1] * 2 + 1];
1009             }
1010         }
1011     }
1012
1013   page->params->draw_cell (page->params->aux, cell, bb, clip);
1014 }
1015
1016 /* Draws the cells of PAGE indicated in BB. */
1017 static void
1018 render_page_draw_cells (const struct render_page *page,
1019                         int ofs[TABLE_N_AXES], int bb[TABLE_N_AXES][2])
1020 {
1021   int x, y;
1022
1023   for (y = bb[V][0]; y < bb[V][1]; y++)
1024     for (x = bb[H][0]; x < bb[H][1]; )
1025       if (is_rule (x) || is_rule (y))
1026         {
1027           int d[TABLE_N_AXES];
1028           d[H] = x;
1029           d[V] = y;
1030           render_rule (page, ofs, d);
1031           x++;
1032         }
1033       else
1034         {
1035           struct table_cell cell;
1036
1037           table_get_cell (page->table, x / 2, y / 2, &cell);
1038           if (y / 2 == bb[V][0] / 2 || y / 2 == cell.d[V][0])
1039             render_cell (page, ofs, &cell);
1040           x = rule_ofs (cell.d[H][1]);
1041           table_cell_free (&cell);
1042         }
1043 }
1044
1045 /* Renders PAGE, by calling the 'draw_line' and 'draw_cell' functions from the
1046    render_params provided to render_page_create(). */
1047 static void
1048 render_page_draw (const struct render_page *page, int ofs[TABLE_N_AXES])
1049 {
1050   int bb[TABLE_N_AXES][2];
1051
1052   bb[H][0] = 0;
1053   bb[H][1] = page->n[H] * 2 + 1;
1054   bb[V][0] = 0;
1055   bb[V][1] = page->n[V] * 2 + 1;
1056
1057   render_page_draw_cells (page, ofs, bb);
1058 }
1059
1060 /* Returns the greatest value i, 0 <= i < n, such that cp[i] <= x0. */
1061 static int
1062 get_clip_min_extent (int x0, const int cp[], int n)
1063 {
1064   int low, high, best;
1065
1066   low = 0;
1067   high = n;
1068   best = 0;
1069   while (low < high)
1070     {
1071       int middle = low + (high - low) / 2;
1072
1073       if (cp[middle] <= x0)
1074         {
1075           best = middle;
1076           low = middle + 1;
1077         }
1078       else
1079         high = middle;
1080     }
1081
1082   return best;
1083 }
1084
1085 /* Returns the least value i, 0 <= i < n, such that cp[i] >= x1. */
1086 static int
1087 get_clip_max_extent (int x1, const int cp[], int n)
1088 {
1089   int low, high, best;
1090
1091   low = 0;
1092   high = n;
1093   best = n;
1094   while (low < high)
1095     {
1096       int middle = low + (high - low) / 2;
1097
1098       if (cp[middle] >= x1)
1099         best = high = middle;
1100       else
1101         low = middle + 1;
1102     }
1103
1104   while (best > 0 && cp[best - 1] == cp[best])
1105     best--;
1106
1107   return best;
1108 }
1109
1110 /* Renders the cells of PAGE that intersect (X,Y)-(X+W,Y+H), by calling the
1111    'draw_line' and 'draw_cell' functions from the render_params provided to
1112    render_page_create(). */
1113 static void
1114 render_page_draw_region (const struct render_page *page,
1115                          int ofs[TABLE_N_AXES], int clip[TABLE_N_AXES][2])
1116 {
1117   int bb[TABLE_N_AXES][2];
1118
1119   bb[H][0] = get_clip_min_extent (clip[H][0], page->cp[H], page->n[H] * 2 + 1);
1120   bb[H][1] = get_clip_max_extent (clip[H][1], page->cp[H], page->n[H] * 2 + 1);
1121   bb[V][0] = get_clip_min_extent (clip[V][0], page->cp[V], page->n[V] * 2 + 1);
1122   bb[V][1] = get_clip_max_extent (clip[V][1], page->cp[V], page->n[V] * 2 + 1);
1123
1124   render_page_draw_cells (page, ofs, bb);
1125 }
1126
1127 /* Breaking up tables to fit on a page. */
1128
1129 /* An iterator for breaking render_pages into smaller chunks. */
1130 struct render_break
1131   {
1132     struct render_page *page;   /* Page being broken up. */
1133     enum table_axis axis;       /* Axis along which 'page' is being broken. */
1134     int z;                      /* Next cell along 'axis'. */
1135     int pixel;                  /* Pixel offset within cell 'z' (usually 0). */
1136     int hw;                     /* Width of headers of 'page' along 'axis'. */
1137   };
1138
1139 static int needed_size (const struct render_break *, int cell);
1140 static bool cell_is_breakable (const struct render_break *, int cell);
1141 static struct render_page *render_page_select (const struct render_page *,
1142                                                enum table_axis,
1143                                                int z0, int p0,
1144                                                int z1, int p1);
1145
1146 /* Initializes render_break B for breaking PAGE along AXIS.
1147    Takes ownership of PAGE. */
1148 static void
1149 render_break_init (struct render_break *b, struct render_page *page,
1150                    enum table_axis axis)
1151 {
1152   b->page = page;
1153   b->axis = axis;
1154   b->z = page->h[axis][0];
1155   b->pixel = 0;
1156   b->hw = headers_width (page, axis);
1157 }
1158
1159 /* Initializes B as a render_break structure for which
1160    render_break_has_next() always returns false. */
1161 static void
1162 render_break_init_empty (struct render_break *b)
1163 {
1164   b->page = NULL;
1165   b->axis = TABLE_HORZ;
1166   b->z = 0;
1167   b->pixel = 0;
1168   b->hw = 0;
1169 }
1170
1171 /* Frees B and unrefs the render_page that it owns. */
1172 static void
1173 render_break_destroy (struct render_break *b)
1174 {
1175   if (b != NULL)
1176     {
1177       render_page_unref (b->page);
1178       b->page = NULL;
1179     }
1180 }
1181
1182 /* Returns true if B still has cells that are yet to be returned,
1183    false if all of B's page has been processed. */
1184 static bool
1185 render_break_has_next (const struct render_break *b)
1186 {
1187   const struct render_page *page = b->page;
1188   enum table_axis axis = b->axis;
1189
1190   return page != NULL && b->z < page->n[axis] - page->h[axis][1];
1191 }
1192
1193 /* Returns a new render_page that is up to SIZE pixels wide along B's axis.
1194    Returns a null pointer if B has already been completely broken up, or if
1195    SIZE is too small to reasonably render any cells.  The latter will never
1196    happen if SIZE is at least as large as the page size passed to
1197    render_page_create() along B's axis. */
1198 static struct render_page *
1199 render_break_next (struct render_break *b, int size)
1200 {
1201   const struct render_page *page = b->page;
1202   enum table_axis axis = b->axis;
1203   struct render_page *subpage;
1204   int z, pixel;
1205
1206   if (!render_break_has_next (b))
1207     return NULL;
1208
1209   pixel = 0;
1210   for (z = b->z; z < page->n[axis] - page->h[axis][1]; z++)
1211     {
1212       int needed = needed_size (b, z + 1);
1213       if (needed > size)
1214         {
1215           if (cell_is_breakable (b, z))
1216             {
1217               /* If there is no right header and we render a partial cell on
1218                  the right side of the body, then we omit the rightmost rule of
1219                  the body.  Otherwise the rendering is deceptive because it
1220                  looks like the whole cell is present instead of a partial
1221                  cell.
1222
1223                  This is similar to code for the left side in needed_size(). */
1224               int rule_allowance = (page->h[axis][1]
1225                                     ? 0
1226                                     : rule_width (page, axis, z));
1227
1228               /* The amount that, if we added cell 'z', the rendering would
1229                  overfill the allocated 'size'. */
1230               int overhang = needed - size - rule_allowance;
1231
1232               /* The width of cell 'z'. */
1233               int cell_size = cell_width (page, axis, z);
1234
1235               /* The amount trimmed off the left side of 'z',
1236                  and the amount left to render. */
1237               int cell_ofs = z == b->z ? b->pixel : 0;
1238               int cell_left = cell_size - cell_ofs;
1239
1240               /* A small but visible width.  */
1241               int em = page->params->font_size[axis];
1242
1243               /* If some of the cell remains to render,
1244                  and there would still be some of the cell left afterward,
1245                  then partially render that much of the cell. */
1246               pixel = (cell_left && cell_left > overhang
1247                        ? cell_left - overhang + cell_ofs
1248                        : 0);
1249
1250               /* If there would be only a tiny amount of the cell left after
1251                  rendering it partially, reduce the amount rendered slightly
1252                  to make the output look a little better. */
1253               if (pixel + em > cell_size)
1254                 pixel = MAX (pixel - em, 0);
1255
1256               /* If we're breaking vertically, then consider whether the cells
1257                  being broken have a better internal breakpoint than the exact
1258                  number of pixels available, which might look bad e.g. because
1259                  it breaks in the middle of a line of text. */
1260               if (axis == TABLE_VERT && page->params->adjust_break)
1261                 {
1262                   int x;
1263
1264                   for (x = 0; x < page->n[H]; )
1265                     {
1266                       struct table_cell cell;
1267                       int better_pixel;
1268                       int w;
1269
1270                       table_get_cell (page->table, x, z, &cell);
1271                       w = joined_width (page, H, cell.d[H][0], cell.d[H][1]);
1272                       better_pixel = page->params->adjust_break (
1273                         page->params->aux, &cell, w, pixel);
1274                       x = cell.d[H][1];
1275                       table_cell_free (&cell);
1276
1277                       if (better_pixel < pixel)
1278                         {
1279                           if (better_pixel > (z == b->z ? b->pixel : 0))
1280                             {
1281                               pixel = better_pixel;
1282                               break;
1283                             }
1284                           else if (better_pixel == 0 && z != b->z)
1285                             {
1286                               pixel = 0;
1287                               break;
1288                             }
1289                         }
1290                     }
1291                 }
1292             }
1293           break;
1294         }
1295     }
1296
1297   if (z == b->z && !pixel)
1298     return NULL;
1299
1300   subpage = render_page_select (page, axis, b->z, b->pixel,
1301                                 pixel ? z + 1 : z,
1302                                 pixel ? cell_width (page, axis, z) - pixel
1303                                 : 0);
1304   b->z = z;
1305   b->pixel = pixel;
1306   return subpage;
1307 }
1308
1309 /* Returns the width that would be required along B's axis to render a page
1310    from B's current position up to but not including CELL. */
1311 static int
1312 needed_size (const struct render_break *b, int cell)
1313 {
1314   const struct render_page *page = b->page;
1315   enum table_axis axis = b->axis;
1316   int size;
1317
1318   /* Width of left header not including its rightmost rule.  */
1319   size = axis_width (page, axis, 0, rule_ofs (page->h[axis][0]));
1320
1321   /* If we have a pixel offset and there is no left header, then we omit the
1322      leftmost rule of the body.  Otherwise the rendering is deceptive because
1323      it looks like the whole cell is present instead of a partial cell.
1324
1325      Otherwise (if there are headers) we will be merging two rules: the
1326      rightmost rule in the header and the leftmost rule in the body.  We assume
1327      that the width of a merged rule is the larger of the widths of either rule
1328      invidiually. */
1329   if (b->pixel == 0 || page->h[axis][0])
1330     size += MAX (rule_width (page, axis, page->h[axis][0]),
1331                  rule_width (page, axis, b->z));
1332
1333   /* Width of body, minus any pixel offset in the leftmost cell. */
1334   size += joined_width (page, axis, b->z, cell) - b->pixel;
1335
1336   /* Width of rightmost rule in body merged with leftmost rule in headers. */
1337   size += MAX (rule_width_r (page, axis, page->h[axis][1]),
1338                rule_width (page, axis, cell));
1339
1340   /* Width of right header not including its leftmost rule. */
1341   size += axis_width (page, axis, rule_ofs_r (page, axis, page->h[axis][1]),
1342                       rule_ofs_r (page, axis, 0));
1343
1344   /* Join crossing. */
1345   if (page->h[axis][0] && page->h[axis][1])
1346     size += page->join_crossing[axis][b->z];
1347
1348   return size;
1349 }
1350
1351 /* Returns true if CELL along B's axis may be broken across a page boundary.
1352
1353    This is just a heuristic.  Breaking cells across page boundaries can save
1354    space, but it looks ugly. */
1355 static bool
1356 cell_is_breakable (const struct render_break *b, int cell)
1357 {
1358   const struct render_page *page = b->page;
1359   enum table_axis axis = b->axis;
1360
1361   return cell_width (page, axis, cell) >= page->params->min_break[axis];
1362 }
1363 \f
1364 /* render_pager. */
1365
1366 struct render_pager
1367   {
1368     const struct render_params *params;
1369
1370     struct render_page **pages;
1371     size_t n_pages, allocated_pages;
1372
1373     size_t cur_page;
1374     struct render_break x_break;
1375     struct render_break y_break;
1376   };
1377
1378 static const struct render_page *
1379 render_pager_add_table (struct render_pager *p, struct table *table)
1380 {
1381   struct render_page *page;
1382
1383   if (p->n_pages >= p->allocated_pages)
1384     p->pages = x2nrealloc (p->pages, &p->allocated_pages, sizeof *p->pages);
1385   page = p->pages[p->n_pages++] = render_page_create (p->params, table);
1386   return page;
1387 }
1388
1389 static void
1390 render_pager_start_page (struct render_pager *p)
1391 {
1392   render_break_init (&p->x_break, render_page_ref (p->pages[p->cur_page++]),
1393                      H);
1394   render_break_init_empty (&p->y_break);
1395 }
1396
1397 static void
1398 add_footnote_page (struct render_pager *p, const struct table_item *item)
1399 {
1400   const struct footnote **f;
1401   size_t n_footnotes = table_collect_footnotes (item, &f);
1402   if (!n_footnotes)
1403     return;
1404
1405   struct tab_table *t = tab_create (2, n_footnotes);
1406
1407   for (size_t i = 0; i < n_footnotes; i++)
1408     if (f[i])
1409       {
1410         tab_text_format (t, 0, i, TAB_LEFT, "%s.", f[i]->marker);
1411         tab_text (t, 1, i, TAB_LEFT, f[i]->content);
1412       }
1413   render_pager_add_table (p, &t->table);
1414
1415   free (f);
1416 }
1417
1418 static void
1419 add_text_page (struct render_pager *p, const struct table_item_text *t)
1420 {
1421   if (!t)
1422     return;
1423
1424   struct tab_table *tab = tab_create (1, 1);
1425   tab_text (tab, 0, 0, TAB_LEFT, t->content);
1426   for (size_t i = 0; i < t->n_footnotes; i++)
1427     tab_add_footnote (tab, 0, 0, t->footnotes[i]);
1428   render_pager_add_table (p, &tab->table);
1429 }
1430
1431 /* Creates and returns a new render_pager for rendering TABLE_ITEM on the
1432    device with the given PARAMS. */
1433 struct render_pager *
1434 render_pager_create (const struct render_params *params,
1435                      const struct table_item *table_item)
1436 {
1437   struct render_pager *p;
1438
1439   p = xzalloc (sizeof *p);
1440   p->params = params;
1441
1442   /* Title. */
1443   add_text_page (p, table_item_get_title (table_item));
1444
1445   /* Body. */
1446   render_pager_add_table (p, table_ref (table_item_get_table (table_item)));
1447
1448   /* Caption. */
1449   add_text_page (p, table_item_get_caption (table_item));
1450
1451   /* Footnotes. */
1452   add_footnote_page (p, table_item);
1453
1454   render_pager_start_page (p);
1455
1456   return p;
1457 }
1458
1459 /* Destroys P. */
1460 void
1461 render_pager_destroy (struct render_pager *p)
1462 {
1463   if (p)
1464     {
1465       size_t i;
1466
1467       render_break_destroy (&p->x_break);
1468       render_break_destroy (&p->y_break);
1469       for (i = 0; i < p->n_pages; i++)
1470         render_page_unref (p->pages[i]);
1471       free (p->pages);
1472       free (p);
1473     }
1474 }
1475
1476 /* Returns true if P has content remaining to render, false if rendering is
1477    done. */
1478 bool
1479 render_pager_has_next (const struct render_pager *p_)
1480 {
1481   struct render_pager *p = CONST_CAST (struct render_pager *, p_);
1482
1483   while (!render_break_has_next (&p->y_break))
1484     {
1485       render_break_destroy (&p->y_break);
1486       if (!render_break_has_next (&p->x_break))
1487         {
1488           render_break_destroy (&p->x_break);
1489           if (p->cur_page >= p->n_pages)
1490             {
1491               render_break_init_empty (&p->x_break);
1492               render_break_init_empty (&p->y_break);
1493               return false;
1494             }
1495           render_pager_start_page (p);
1496         }
1497       else
1498         render_break_init (&p->y_break,
1499                            render_break_next (&p->x_break, p->params->size[H]), V);
1500     }
1501   return true;
1502 }
1503
1504 /* Draws a chunk of content from P to fit in a space that has vertical size
1505    SPACE and the horizontal size specified in the render_params passed to
1506    render_page_create().  Returns the amount of space actually used by the
1507    rendered chunk, which will be 0 if SPACE is too small to render anything or
1508    if no content remains (use render_pager_has_next() to distinguish these
1509    cases). */
1510 int
1511 render_pager_draw_next (struct render_pager *p, int space)
1512 {
1513   int ofs[TABLE_N_AXES] = { 0, 0 };
1514   size_t start_page = SIZE_MAX;
1515
1516   while (render_pager_has_next (p))
1517     {
1518       struct render_page *page;
1519
1520       if (start_page == p->cur_page)
1521         break;
1522       start_page = p->cur_page;
1523
1524       page = render_break_next (&p->y_break, space - ofs[V]);
1525       if (!page)
1526         break;
1527
1528       render_page_draw (page, ofs);
1529       ofs[V] += render_page_get_size (page, V);
1530       render_page_unref (page);
1531     }
1532   return ofs[V];
1533 }
1534
1535 /* Draws all of P's content. */
1536 void
1537 render_pager_draw (const struct render_pager *p)
1538 {
1539   render_pager_draw_region (p, 0, 0, INT_MAX, INT_MAX);
1540 }
1541
1542 /* Draws the region of P's content that lies in the region (X,Y)-(X+W,Y+H).
1543    Some extra content might be drawn; the device should perform clipping as
1544    necessary. */
1545 void
1546 render_pager_draw_region (const struct render_pager *p,
1547                           int x, int y, int w, int h)
1548 {
1549   int ofs[TABLE_N_AXES] = { 0, 0 };
1550   int clip[TABLE_N_AXES][2];
1551   size_t i;
1552
1553   clip[H][0] = x;
1554   clip[H][1] = x + w;
1555   for (i = 0; i < p->n_pages; i++)
1556     {
1557       const struct render_page *page = p->pages[i];
1558       int size = render_page_get_size (page, V);
1559
1560       clip[V][0] = MAX (y, ofs[V]) - ofs[V];
1561       clip[V][1] = MIN (y + h, ofs[V] + size) - ofs[V];
1562       if (clip[V][1] > clip[V][0])
1563         render_page_draw_region (page, ofs, clip);
1564
1565       ofs[V] += size;
1566     }
1567 }
1568
1569 /* Returns the size of P's content along AXIS; i.e. the content's width if AXIS
1570    is TABLE_HORZ and its length if AXIS is TABLE_VERT. */
1571 int
1572 render_pager_get_size (const struct render_pager *p, enum table_axis axis)
1573 {
1574   int size = 0;
1575   size_t i;
1576
1577   for (i = 0; i < p->n_pages; i++)
1578     {
1579       int subsize = render_page_get_size (p->pages[i], axis);
1580       size = axis == H ? MAX (size, subsize) : size + subsize;
1581     }
1582
1583   return size;
1584 }
1585
1586 int
1587 render_pager_get_best_breakpoint (const struct render_pager *p, int height)
1588 {
1589   int y = 0;
1590   size_t i;
1591
1592   for (i = 0; i < p->n_pages; i++)
1593     {
1594       int size = render_page_get_size (p->pages[i], V);
1595       if (y + size >= height)
1596         return render_page_get_best_breakpoint (p->pages[i], height - y) + y;
1597       y += size;
1598     }
1599
1600   return height;
1601 }
1602 \f
1603 /* render_page_select() and helpers. */
1604
1605 struct render_page_selection
1606   {
1607     const struct render_page *page; /* Page whose slice we are selecting. */
1608     struct render_page *subpage; /* New page under construction. */
1609     enum table_axis a;   /* Axis of 'page' along which 'subpage' is a slice. */
1610     enum table_axis b;   /* The opposite of 'a'. */
1611     int z0;              /* First cell along 'a' being selected. */
1612     int z1;              /* Last cell being selected, plus 1. */
1613     int p0;              /* Number of pixels to trim off left side of z0. */
1614     int p1;              /* Number of pixels to trim off right side of z1-1. */
1615   };
1616
1617 static void cell_to_subpage (struct render_page_selection *,
1618                              const struct table_cell *,
1619                              int subcell[TABLE_N_AXES]);
1620 static const struct render_overflow *find_overflow_for_cell (
1621   struct render_page_selection *, const struct table_cell *);
1622 static struct render_overflow *insert_overflow (struct render_page_selection *,
1623                                                 const struct table_cell *);
1624
1625 /* Creates and returns a new render_page whose contents are a subregion of
1626    PAGE's contents.  The new render_page includes cells Z0 through Z1
1627    (exclusive) along AXIS, plus any headers on AXIS.
1628
1629    If P0 is nonzero, then it is a number of pixels to exclude from the left or
1630    top (according to AXIS) of cell Z0.  Similarly, P1 is a number of pixels to
1631    exclude from the right or bottom of cell Z1 - 1.  (P0 and P1 are used to
1632    render cells that are too large to fit on a single page.)
1633
1634    The whole of axis !AXIS is included.  (The caller may follow up with another
1635    call to render_page_select() to select on !AXIS to select on that axis as
1636    well.)
1637
1638    The caller retains ownership of PAGE, which is not modified. */
1639 static struct render_page *
1640 render_page_select (const struct render_page *page, enum table_axis axis,
1641                     int z0, int p0, int z1, int p1)
1642 {
1643   struct render_page_selection s;
1644   enum table_axis a = axis;
1645   enum table_axis b = !a;
1646   struct render_page *subpage;
1647   struct render_overflow *ro;
1648   int *dcp, *scp;
1649   int *jc;
1650   int z;
1651
1652
1653   /* Optimize case where all of PAGE is selected by just incrementing the
1654      reference count. */
1655   if (z0 == page->h[a][0] && p0 == 0
1656       && z1 == page->n[a] - page->h[a][1] && p1 == 0)
1657     {
1658       struct render_page *page_rw = CONST_CAST (struct render_page *, page);
1659       page_rw->ref_cnt++;
1660       return page_rw;
1661     }
1662
1663   /* Allocate subpage. */
1664   subpage = render_page_allocate (page->params,
1665                                   table_select_slice (
1666                                     table_ref (page->table),
1667                                     a, z0, z1, true));
1668
1669   /* An edge is cut off if it was cut off in PAGE or if we're trimming pixels
1670      off that side of the page and there are no headers. */
1671   subpage->is_edge_cutoff[a][0] =
1672     subpage->h[a][0] == 0 && (p0 || (z0 == 0 && page->is_edge_cutoff[a][0]));
1673   subpage->is_edge_cutoff[a][1] =
1674     subpage->h[a][1] == 0 && (p1 || (z1 == page->n[a]
1675                                      && page->is_edge_cutoff[a][1]));
1676   subpage->is_edge_cutoff[b][0] = page->is_edge_cutoff[b][0];
1677   subpage->is_edge_cutoff[b][1] = page->is_edge_cutoff[b][1];
1678
1679   /* Select join crossings from PAGE into subpage. */
1680   jc = subpage->join_crossing[a];
1681   for (z = 0; z < page->h[a][0]; z++)
1682     *jc++ = page->join_crossing[a][z];
1683   for (z = z0; z <= z1; z++)
1684     *jc++ = page->join_crossing[a][z];
1685   for (z = page->n[a] - page->h[a][1]; z < page->n[a]; z++)
1686     *jc++ = page->join_crossing[a][z];
1687   assert (jc == &subpage->join_crossing[a][subpage->n[a] + 1]);
1688
1689   memcpy (subpage->join_crossing[b], page->join_crossing[b],
1690           (subpage->n[b] + 1) * sizeof **subpage->join_crossing);
1691
1692   /* Select widths from PAGE into subpage. */
1693   scp = page->cp[a];
1694   dcp = subpage->cp[a];
1695   *dcp = 0;
1696   for (z = 0; z <= rule_ofs (subpage->h[a][0]); z++, dcp++)
1697     {
1698       if (z == 0 && subpage->is_edge_cutoff[a][0])
1699         dcp[1] = dcp[0];
1700       else
1701         dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1702     }
1703   for (z = cell_ofs (z0); z <= cell_ofs (z1 - 1); z++, dcp++)
1704     {
1705       dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1706       if (z == cell_ofs (z0))
1707         {
1708           dcp[1] -= p0;
1709           if (page->h[a][0] && page->h[a][1])
1710             dcp[1] += page->join_crossing[a][z / 2];
1711         }
1712       if (z == cell_ofs (z1 - 1))
1713         dcp[1] -= p1;
1714     }
1715   for (z = rule_ofs_r (page, a, subpage->h[a][1]);
1716        z <= rule_ofs_r (page, a, 0); z++, dcp++)
1717     {
1718       if (z == rule_ofs_r (page, a, 0) && subpage->is_edge_cutoff[a][1])
1719         dcp[1] = dcp[0];
1720       else
1721         dcp[1] = dcp[0] + (scp[z + 1] - scp[z]);
1722     }
1723   assert (dcp == &subpage->cp[a][2 * subpage->n[a] + 1]);
1724
1725   for (z = 0; z < page->n[b] * 2 + 2; z++)
1726     subpage->cp[b][z] = page->cp[b][z];
1727
1728   /* Add new overflows. */
1729   s.page = page;
1730   s.a = a;
1731   s.b = b;
1732   s.z0 = z0;
1733   s.z1 = z1;
1734   s.p0 = p0;
1735   s.p1 = p1;
1736   s.subpage = subpage;
1737
1738   if (!page->h[a][0] || z0 > page->h[a][0] || p0)
1739     for (z = 0; z < page->n[b]; )
1740       {
1741         struct table_cell cell;
1742         int d[TABLE_N_AXES];
1743         bool overflow0;
1744         bool overflow1;
1745
1746         d[a] = z0;
1747         d[b] = z;
1748
1749         table_get_cell (page->table, d[H], d[V], &cell);
1750         overflow0 = p0 || cell.d[a][0] < z0;
1751         overflow1 = cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1);
1752         if (overflow0 || overflow1)
1753           {
1754             ro = insert_overflow (&s, &cell);
1755
1756             if (overflow0)
1757               {
1758                 ro->overflow[a][0] += p0 + axis_width (
1759                   page, a, cell_ofs (cell.d[a][0]), cell_ofs (z0));
1760                 if (page->h[a][0] && page->h[a][1])
1761                   ro->overflow[a][0] -= page->join_crossing[a][cell.d[a][0]
1762                                                                + 1];
1763               }
1764
1765             if (overflow1)
1766               {
1767                 ro->overflow[a][1] += p1 + axis_width (
1768                   page, a, cell_ofs (z1), cell_ofs (cell.d[a][1]));
1769                 if (page->h[a][0] && page->h[a][1])
1770                   ro->overflow[a][1] -= page->join_crossing[a][cell.d[a][1]];
1771               }
1772           }
1773         z = cell.d[b][1];
1774         table_cell_free (&cell);
1775       }
1776
1777   if (!page->h[a][1] || z1 < page->n[a] - page->h[a][1] || p1)
1778     for (z = 0; z < page->n[b]; )
1779       {
1780         struct table_cell cell;
1781         int d[TABLE_N_AXES];
1782
1783         d[a] = z1 - 1;
1784         d[b] = z;
1785         table_get_cell (page->table, d[H], d[V], &cell);
1786         if ((cell.d[a][1] > z1 || (cell.d[a][1] == z1 && p1))
1787             && find_overflow_for_cell (&s, &cell) == NULL)
1788           {
1789             ro = insert_overflow (&s, &cell);
1790             ro->overflow[a][1] += p1 + axis_width (page, a, cell_ofs (z1),
1791                                                    cell_ofs (cell.d[a][1]));
1792           }
1793         z = cell.d[b][1];
1794         table_cell_free (&cell);
1795       }
1796
1797   /* Copy overflows from PAGE into subpage. */
1798   HMAP_FOR_EACH (ro, struct render_overflow, node, &page->overflows)
1799     {
1800       struct table_cell cell;
1801
1802       table_get_cell (page->table, ro->d[H], ro->d[V], &cell);
1803       if (cell.d[a][1] > z0 && cell.d[a][0] < z1
1804           && find_overflow_for_cell (&s, &cell) == NULL)
1805         insert_overflow (&s, &cell);
1806       table_cell_free (&cell);
1807     }
1808
1809   return subpage;
1810 }
1811
1812 /* Given CELL, a table_cell within S->page, stores in SUBCELL the (x,y)
1813    coordinates of the top-left cell as it will appear in S->subpage.
1814
1815    CELL must actually intersect the region of S->page that is being selected
1816    by render_page_select() or the results will not make any sense. */
1817 static void
1818 cell_to_subpage (struct render_page_selection *s,
1819                  const struct table_cell *cell, int subcell[TABLE_N_AXES])
1820 {
1821   enum table_axis a = s->a;
1822   enum table_axis b = s->b;
1823   int ha0 = s->subpage->h[a][0];
1824
1825   subcell[a] = MAX (cell->d[a][0] - s->z0 + ha0, ha0);
1826   subcell[b] = cell->d[b][0];
1827 }
1828
1829 /* Given CELL, a table_cell within S->page, returns the render_overflow for
1830    that cell in S->subpage, if there is one, and a null pointer otherwise.
1831
1832    CELL must actually intersect the region of S->page that is being selected
1833    by render_page_select() or the results will not make any sense. */
1834 static const struct render_overflow *
1835 find_overflow_for_cell (struct render_page_selection *s,
1836                         const struct table_cell *cell)
1837 {
1838   int subcell[2];
1839
1840   cell_to_subpage (s, cell, subcell);
1841   return find_overflow (s->subpage, subcell[H], subcell[V]);
1842 }
1843
1844 /* Given CELL, a table_cell within S->page, inserts a render_overflow for that
1845    cell in S->subpage (which must not already exist).  Initializes the new
1846    render_overflow's 'overflow' member from the overflow for CELL in S->page,
1847    if there is one.
1848
1849    CELL must actually intersect the region of S->page that is being selected
1850    by render_page_select() or the results will not make any sense. */
1851 static struct render_overflow *
1852 insert_overflow (struct render_page_selection *s,
1853                  const struct table_cell *cell)
1854 {
1855   const struct render_overflow *old;
1856   struct render_overflow *of;
1857
1858   of = xzalloc (sizeof *of);
1859   cell_to_subpage (s, cell, of->d);
1860   hmap_insert (&s->subpage->overflows, &of->node,
1861                hash_cell (of->d[H], of->d[V]));
1862
1863   old = find_overflow (s->page, cell->d[H][0], cell->d[V][0]);
1864   if (old != NULL)
1865     memcpy (of->overflow, old->overflow, sizeof of->overflow);
1866
1867   return of;
1868 }