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