DO REPEAT: Order PRINT output correctly.
[pspp] / src / output / table.h
index 9f84f5dd3f26a00df5e8eb9f1c61d05019d8baa5..1fe78d8e767ab2e69bd636a643cfb3737d76b439 100644 (file)
 
 /* Tables.
 
 
 /* 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.
 
    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.
 
-   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. */
+   Some drivers use tables as an implementation detail of rendering pivot
+   tables.
+*/
 
 #include <stdbool.h>
 #include <stdint.h>
 
 #include <stdbool.h>
 #include <stdint.h>
@@ -37,6 +37,8 @@
 
 struct casereader;
 struct fmt_spec;
 
 struct casereader;
 struct fmt_spec;
+struct pivot_footnote;
+struct pivot_value;
 struct pool;
 struct table_item;
 struct variable;
 struct pool;
 struct table_item;
 struct variable;
@@ -66,16 +68,16 @@ struct cell_color
 #define CELL_COLOR_WHITE CELL_COLOR (255, 255, 255)
 
 static inline bool
 #define CELL_COLOR_WHITE CELL_COLOR (255, 255, 255)
 
 static inline bool
-cell_color_equal (const struct cell_color *a, const struct cell_color *b)
+cell_color_equal (const struct cell_color a, const struct cell_color b)
 {
 {
-  return a->alpha == b->alpha && a->r == b->r && a->g == b->g && a->b == b->b;
+  return a.alpha == b.alpha && a.r == b.r && a.g == b.g && a.b == b.b;
 }
 
 void cell_color_dump (const struct cell_color *);
 
 enum table_stroke
   {
 }
 
 void cell_color_dump (const struct cell_color *);
 
 enum table_stroke
   {
-    TABLE_STROKE_NONE,
+    TABLE_STROKE_NONE = 0,      /* Must be zero. */
     TABLE_STROKE_SOLID,
     TABLE_STROKE_DASHED,
     TABLE_STROKE_THICK,
     TABLE_STROKE_SOLID,
     TABLE_STROKE_DASHED,
     TABLE_STROKE_THICK,
@@ -144,7 +146,7 @@ struct font_style
     bool bold, italic, underline, markup;
     struct cell_color fg[2], bg[2];
     char *typeface;
     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__ }
   };
 
 #define FONT_STYLE_INITIALIZER { FONT_STYLE_INITIALIZER__ }
@@ -156,38 +158,33 @@ 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 font_style *, const struct font_style *);
 void font_style_uninit (struct font_style *);
 void font_style_dump (const struct font_style *);
+bool font_style_equal (const struct font_style *, const struct font_style *);
 
 
-struct area_style
+struct table_area_style
   {
     struct cell_style cell_style;
     struct font_style font_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
 
        .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 pool *,
-                      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. */
+/* Cell properties. */
 enum
   {
 enum
   {
-    TAB_NONE = 0,
-    TAB_FIX        = 1 << 1,    /* Use fixed font. */
-    TAB_MARKUP     = 1 << 2,    /* Text contains Pango markup. */
-    TAB_NUMERIC    = 1 << 3,    /* Cell contents are numeric. */
-    TAB_ROTATE     = 1 << 4,    /* Rotate cell contents 90 degrees. */
-
-    TAB_STYLE_SHIFT = 5,
-    TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT,
-
-    /* Internal use by tab.c only. */
-    TAB_JOIN = 1 << 14,
+    TABLE_CELL_ROTATE     = 1 << 0,    /* Rotate cell contents 90 degrees. */
+    TABLE_CELL_JOIN       = 1 << 1,    /* Joined cell (internal use only). */
+    TABLE_CELL_STYLE_SHIFT = 2,
+    TABLE_CELL_STYLE_MASK = 7 << TABLE_CELL_STYLE_SHIFT,
   };
 
 /* A table. */
   };
 
 /* A table. */
@@ -221,18 +218,19 @@ struct table
 
     /* Table contents.
 
 
     /* 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. */
+       Each array element in cc[] is ordinarily a "struct pivot_value *".  If
+       TABLE_CELL_JOIN is set in cp[] 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]. */
     void **cc;                  /* Cell contents; void *[nr][nc]. */
-    unsigned short *ct;                /* Cell types; unsigned short[nr][nc]. */
-    struct area_style *styles[8];
+    unsigned char *cp;         /* Cell properties; unsigned char[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]. */
 
     /* 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];
+    struct table_border_style *borders;
+    size_t n_borders;
   };
 
 /* Reference counting. */
   };
 
 /* Reference counting. */
@@ -240,67 +238,18 @@ struct table *table_ref (const struct table *);
 void table_unref (struct table *);
 bool table_is_shared (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]; }
-
-/* Simple kinds of output. */
-struct table *table_from_string (const char *);
-void table_output_text (int options, const char *string);
-void table_output_text_format (int options, const char *, ...)
-  PRINTF_FORMAT (2, 3);
-
-/* 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);
 /* 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. */
 
 /* 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 *);
-
-/* 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 area_style *);
-void table_add_footnote (struct table *, int x, int y,
-                         const struct footnote *);
-
-void table_add_style (struct table *, int x, int y,
-                      const struct area_style *);
+void table_put (struct table *, int x1, int y1, int x2, int y2,
+                unsigned opt, const struct pivot_value *);
+void table_put_owned (struct table *, int x1, int y1, int x2, int y2,
+                      unsigned opt, struct pivot_value *);
 
 bool table_cell_is_empty (const struct table *, int c, int r);
 
 
 bool table_cell_is_empty (const struct table *, int c, int r);