X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable.h;h=a212aa4be2e3c7e09425911480daeb95d12648dd;hb=28e907dd4809de2c44feb9f402ab7f19660d6459;hp=aa1edc107c307165399e46cbe3404aa6fb898067;hpb=2a6b7a4eeccbef99357e07c7f5face4e9be14b6d;p=pspp diff --git a/src/output/table.h b/src/output/table.h index aa1edc107c..a212aa4be2 100644 --- a/src/output/table.h +++ b/src/output/table.h @@ -19,18 +19,13 @@ /* Tables. -. A table is a rectangular grid of cells. Cells can be joined to form larger + A table is a rectangular grid of cells. Cells can be joined to form larger cells. Rows and columns can be separated by rules of various types. Rows at the top and bottom of a table and columns at the left and right edges of a table can be designated as headers, which means that if the table must be broken across more than one page, those rows or columns are repeated on each page. - Every table is an instance of a particular table class that is responsible - for keeping track of cell data. By far the most common table class is - struct tab_table (see output/tab.h). This header also declares some other - kinds of table classes, near the end of the file. - A table is not itself an output_item, and thus a table cannot by itself be used for output, but they can be embedded inside struct table_item (see table-item.h) for that purpose. */ @@ -38,6 +33,7 @@ #include #include #include +#include "libpspp/compiler.h" struct casereader; struct fmt_spec; @@ -90,6 +86,15 @@ enum table_stroke const char *table_stroke_to_string (enum table_stroke); +/* Given strokes A and B, returns a stroke that "combines" them, that is, that + gives a reasonable stroke choice for a rule for different reasons should + have both styles A and B. */ +static inline int +table_stroke_combine (enum table_stroke a, enum table_stroke b) +{ + return a > b ? a : b; +} + struct table_border_style { enum table_stroke stroke; @@ -139,7 +144,7 @@ struct font_style bool bold, italic, underline, markup; struct cell_color fg[2], bg[2]; char *typeface; - int size; + int size; /* In 1/72" units. */ }; #define FONT_STYLE_INITIALIZER { FONT_STYLE_INITIALIZER__ } @@ -147,25 +152,28 @@ struct font_style .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK}, \ .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE}, -void font_style_copy (struct font_style *, const struct font_style *); +void font_style_copy (struct pool *, + struct font_style *, const struct font_style *); void font_style_uninit (struct font_style *); void font_style_dump (const struct font_style *); -struct area_style +struct table_area_style { struct cell_style cell_style; struct font_style font_style; }; -#define AREA_STYLE_INITIALIZER { AREA_STYLE_INITIALIZER__ } -#define AREA_STYLE_INITIALIZER__ \ +#define TABLE_AREA_STYLE_INITIALIZER { TABLE_AREA_STYLE_INITIALIZER__ } +#define TABLE_AREA_STYLE_INITIALIZER__ \ .cell_style = CELL_STYLE_INITIALIZER, \ .font_style = FONT_STYLE_INITIALIZER -struct area_style *area_style_clone (struct pool *, const struct area_style *); -void area_style_copy (struct area_style *, const struct area_style *); -void area_style_uninit (struct area_style *); -void area_style_free (struct area_style *); +struct table_area_style *table_area_style_clone ( + struct pool *, const struct table_area_style *); +void table_area_style_copy (struct pool *, struct table_area_style *, + const struct table_area_style *); +void table_area_style_uninit (struct table_area_style *); +void table_area_style_free (struct table_area_style *); /* Properties of a table cell. */ enum @@ -176,38 +184,18 @@ enum TAB_NUMERIC = 1 << 3, /* Cell contents are numeric. */ TAB_ROTATE = 1 << 4, /* Rotate cell contents 90 degrees. */ - /* Bits with values (1 << TAB_FIRST_AVAILABLE) and higher are - not used, so they are available for subclasses to use as - they wish. */ - TAB_FIRST_AVAILABLE = 5 - }; + TAB_STYLE_SHIFT = 5, + TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT, -/* Styles for the rules around table cells. */ -enum - { - TAL_NONE = TABLE_STROKE_NONE, -#define TAL_0 TAL_NONE - TAL_SOLID = TABLE_STROKE_SOLID, -#define TAL_1 TAL_SOLID - TAL_DASHED = TABLE_STROKE_DASHED, - TAL_THICK = TABLE_STROKE_THICK, - TAL_THIN = TABLE_STROKE_THIN, - TAL_DOUBLE = TABLE_STROKE_DOUBLE, -#define TAL_2 TAL_DOUBLE + /* Internal use by tab.c only. */ + TAB_JOIN = 1 << 14, }; -/* Given line styles A and B (each one of the TAL_* enumeration constants - above), returns a line style that "combines" them, that is, that gives a - reasonable line style choice for a rule for different reasons should have - both styles A and B. */ -static inline int table_rule_combine (int a, int b) -{ - return a > b ? a : b; -} - /* A table. */ struct table { + struct pool *container; + /* Table size. n[TABLE_HORZ]: Number of columns. @@ -231,6 +219,21 @@ struct table indicated by a reference count greater than 1. When this is the case, the table must not be modified. */ int ref_cnt; + + /* Table contents. + + Each array element in cc[] is ordinarily a "char *" pointer to a string. + If TAB_JOIN (defined in table.c) is set in ct[] for the element, + however, it is a joined cell and the corresponding element of cc[] + points to a struct table_cell. */ + void **cc; /* Cell contents; void *[nr][nc]. */ + unsigned short *ct; /* Cell types; unsigned short[nr][nc]. */ + struct table_area_style *styles[8]; + + /* Rules. */ + unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */ + unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */ + struct cell_color *rule_colors[32]; }; /* Reference counting. */ @@ -238,32 +241,45 @@ struct table *table_ref (const struct table *); void table_unref (struct table *); bool table_is_shared (const struct table *); -/* Returns the number of columns or rows, respectively, in T. */ -static inline int table_nc (const struct table *t) - { return t->n[TABLE_HORZ]; } -static inline int table_nr (const struct table *t) - { return t->n[TABLE_VERT]; } - -/* Returns the number of left, right, top, or bottom headers, respectively, in - T. */ -static inline int table_hl (const struct table *t) - { return t->h[TABLE_HORZ][0]; } -static inline int table_hr (const struct table *t) - { return t->h[TABLE_HORZ][1]; } -static inline int table_ht (const struct table *t) - { return t->h[TABLE_VERT][0]; } -static inline int table_hb (const struct table *t) - { return t->h[TABLE_VERT][1]; } - -/* Set headers. */ -void table_set_hl (struct table *, int hl); -void table_set_hr (struct table *, int hr); -void table_set_ht (struct table *, int ht); -void table_set_hb (struct table *, int hb); - -/* Table classes. */ - -/* Simple kinds of tables. */ -struct table *table_from_string (const char *); +/* Rule masks. */ +#define TAB_RULE_TYPE_MASK 7 +#define TAB_RULE_TYPE_SHIFT 0 +#define TAB_RULE_STYLE_MASK (31 << TAB_RULE_STYLE_SHIFT) +#define TAB_RULE_STYLE_SHIFT 3 + +/* Tables. */ +struct table *table_create (int nc, int nr, int hl, int hr, int ht, int hb); + +/* Rules. */ +void table_hline (struct table *, int style, int x1, int x2, int y); +void table_vline (struct table *, int style, int x, int y1, int y2); +void table_box (struct table *, int f_h, int f_v, int i_h, int i_v, + int x1, int y1, int x2, int y2); + +/* Cells. */ +void table_text (struct table *, int c, int r, unsigned opt, const char *); +void table_text_format (struct table *, int c, int r, unsigned opt, + const char *, ...) + PRINTF_FORMAT (5, 6); +void table_joint_text (struct table *, int x1, int y1, int x2, int y2, + unsigned opt, const char *); + +void table_add_subscripts (struct table *, int x, int y, + char **subscripts, size_t n_subscripts); + +/* Footnotes. + + Use table_create_footnote() to create the footnotes themselves, then use + table_add_footnote() to create a reference from a table cell to a footnote. + There are two steps because a footnote may have multiple references. */ +struct footnote *table_create_footnote (struct table *, size_t idx, + const char *content, + const char *marker, + struct table_area_style *); +void table_add_footnote (struct table *, int x, int y, struct footnote *); + +void table_add_style (struct table *, int x, int y, struct table_area_style *); + +bool table_cell_is_empty (const struct table *, int c, int r); #endif /* output/table.h */