1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997, 1998, 1999, 2000, 2009, 2013, 2014 Free Software Foundation, Inc.
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.
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.
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/>. */
17 #ifndef OUTPUT_TABLE_H
18 #define OUTPUT_TABLE_H 1
22 A table is a rectangular grid of cells. Cells can be joined to form larger
23 cells. Rows and columns can be separated by rules of various types. Rows
24 at the top and bottom of a table and columns at the left and right edges of
25 a table can be designated as headers, which means that if the table must be
26 broken across more than one page, those rows or columns are repeated on each
29 Some drivers use tables as an implementation detail of rendering pivot
36 #include "libpspp/compiler.h"
40 struct pivot_footnote;
48 Many table-related declarations use 2-element arrays in place of "x" and "y"
49 variables. This reduces code duplication significantly, because much table
50 code treats rows and columns the same way.
52 A lot of code that uses these enumerations assumes that the two values are 0
53 and 1, so don't change them to other values. */
58 #define TABLE_N_AXES 2
63 uint8_t alpha, r, g, b;
66 #define CELL_COLOR(r, g, b) { 255, r, g, b }
67 #define CELL_COLOR_BLACK CELL_COLOR (0, 0, 0)
68 #define CELL_COLOR_WHITE CELL_COLOR (255, 255, 255)
71 cell_color_equal (const struct cell_color *a, const struct cell_color *b)
73 return a->alpha == b->alpha && a->r == b->r && a->g == b->g && a->b == b->b;
76 void cell_color_dump (const struct cell_color *);
89 const char *table_stroke_to_string (enum table_stroke);
91 /* Given strokes A and B, returns a stroke that "combines" them, that is, that
92 gives a reasonable stroke choice for a rule for different reasons should
93 have both styles A and B. */
95 table_stroke_combine (enum table_stroke a, enum table_stroke b)
100 struct table_border_style
102 enum table_stroke stroke;
103 struct cell_color color;
106 #define TABLE_BORDER_STYLE_INITIALIZER { TABLE_STROKE_SOLID, CELL_COLOR_BLACK }
117 const char *table_halign_to_string (enum table_halign);
126 const char *table_valign_to_string (enum table_valign);
130 enum table_halign halign;
131 enum table_valign valign;
132 double decimal_offset; /* In 1/96" units. */
133 char decimal_char; /* Either '.' or ','. */
134 int margin[TABLE_N_AXES][2]; /* In 1/96" units. */
137 #define CELL_STYLE_INITIALIZER { CELL_STYLE_INITIALIZER__ }
138 #define CELL_STYLE_INITIALIZER__ \
139 .margin = { [TABLE_HORZ][0] = 8, [TABLE_HORZ][1] = 11, \
140 [TABLE_VERT][0] = 1, [TABLE_VERT][1] = 1 }
142 void cell_style_dump (const struct cell_style *);
146 bool bold, italic, underline, markup;
147 struct cell_color fg[2], bg[2];
149 int size; /* In 1/72" units. */
152 #define FONT_STYLE_INITIALIZER { FONT_STYLE_INITIALIZER__ }
153 #define FONT_STYLE_INITIALIZER__ \
154 .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK}, \
155 .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE},
157 void font_style_copy (struct pool *,
158 struct font_style *, const struct font_style *);
159 void font_style_uninit (struct font_style *);
160 void font_style_dump (const struct font_style *);
161 bool font_style_equal (const struct font_style *, const struct font_style *);
163 struct table_area_style
165 struct cell_style cell_style;
166 struct font_style font_style;
169 #define TABLE_AREA_STYLE_INITIALIZER { TABLE_AREA_STYLE_INITIALIZER__ }
170 #define TABLE_AREA_STYLE_INITIALIZER__ \
171 .cell_style = CELL_STYLE_INITIALIZER, \
172 .font_style = FONT_STYLE_INITIALIZER
174 struct table_area_style *table_area_style_clone (
175 struct pool *, const struct table_area_style *);
176 void table_area_style_copy (struct pool *, struct table_area_style *,
177 const struct table_area_style *);
178 void table_area_style_uninit (struct table_area_style *);
179 void table_area_style_free (struct table_area_style *);
181 /* Properties of a table cell. */
185 TAB_ROTATE = 1 << 4, /* Rotate cell contents 90 degrees. */
188 TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT,
190 /* Internal use by tab.c only. */
197 struct pool *container;
201 n[TABLE_HORZ]: Number of columns.
202 n[TABLE_VERT]: Number of rows. */
207 Rows at the top and bottom of a table and columns at the left and right
208 edges of a table can be designated as headers. If the table must be
209 broken across more than one page for output, headers rows and columns
210 are repeated on each page.
212 h[TABLE_HORZ][0]: Left header columns.
213 h[TABLE_HORZ][1]: Right header columns.
214 h[TABLE_VERT][0]: Top header rows.
215 h[TABLE_VERT][1]: Bottom header rows. */
216 int h[TABLE_N_AXES][2];
218 /* Reference count. A table may be shared between multiple owners,
219 indicated by a reference count greater than 1. When this is the case,
220 the table must not be modified. */
225 Each array element in cc[] is ordinarily a "struct pivot_value *".
226 If TAB_JOIN (defined in table.c) is set in ct[] for the element,
227 however, it is a joined cell and the corresponding element of cc[]
228 points to a struct table_cell. */
229 void **cc; /* Cell contents; void *[nr][nc]. */
230 unsigned short *ct; /* Cell types; unsigned short[nr][nc]. */
231 struct table_area_style *styles[8];
234 unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */
235 unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */
236 struct cell_color *rule_colors[32];
239 /* Reference counting. */
240 struct table *table_ref (const struct table *);
241 void table_unref (struct table *);
242 bool table_is_shared (const struct table *);
245 #define TAB_RULE_TYPE_MASK 7
246 #define TAB_RULE_TYPE_SHIFT 0
247 #define TAB_RULE_STYLE_MASK (31 << TAB_RULE_STYLE_SHIFT)
248 #define TAB_RULE_STYLE_SHIFT 3
251 struct table *table_create (int nc, int nr, int hl, int hr, int ht, int hb);
254 void table_hline (struct table *, int style, int x1, int x2, int y);
255 void table_vline (struct table *, int style, int x, int y1, int y2);
256 void table_box (struct table *, int f_h, int f_v, int i_h, int i_v,
257 int x1, int y1, int x2, int y2);
260 void table_put (struct table *, int x1, int y1, int x2, int y2,
261 unsigned opt, const struct pivot_value *);
262 void table_put_owned (struct table *, int x1, int y1, int x2, int y2,
263 unsigned opt, struct pivot_value *);
265 bool table_cell_is_empty (const struct table *, int c, int r);
267 #endif /* output/table.h */