output: Support decimal and mixed alignment,
[pspp] / src / output / render.c
index eb5f1cfe1aa213d1da56221fcc17e652e9fcf45c..4e9a15509585da846724945bb68414d6cf73b6c4 100644 (file)
@@ -507,7 +507,7 @@ measure_rule (const struct render_params *params, const struct table *table,
 
   /* Calculate maximum width of the rules that are present. */
   int width = 0;
-  for (size_t i = 0; i < N_LINES; i++)
+  for (size_t i = 0; i < TABLE_N_STROKES; i++)
     if (rules & (1u << i))
       width = MAX (width, params->line_widths[a][rule_to_render_type (i)]);
   return width;
@@ -952,7 +952,7 @@ render_rule (const struct render_page *page, const int ofs[TABLE_N_AXES],
 
       bb[H][0] = ofs[H] + page->cp[H][d[H]];
       bb[H][1] = ofs[H] + page->cp[H][d[H] + 1];
-      if (render_direction_rtl ())
+      if (page->params->rtl)
        {
          int temp = bb[H][0];
          bb[H][0] = render_page_get_size (page, H) - bb[H][1];
@@ -974,7 +974,7 @@ render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES],
 
   bb[H][0] = clip[H][0] = ofs[H] + page->cp[H][cell->d[H][0] * 2 + 1];
   bb[H][1] = clip[H][1] = ofs[H] + page->cp[H][cell->d[H][1] * 2];
-  if (render_direction_rtl ())
+  if (page->params->rtl)
     {
       int temp = bb[H][0];
       bb[H][0] = clip[H][0] = render_page_get_size (page, H) - bb[H][1];
@@ -983,17 +983,15 @@ render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES],
   bb[V][0] = clip[V][0] = ofs[V] + page->cp[V][cell->d[V][0] * 2 + 1];
   bb[V][1] = clip[V][1] = ofs[V] + page->cp[V][cell->d[V][1] * 2];
 
-  int valign = (cell->n_contents
-                ? cell->contents->options & TAB_VALIGN
-                : TAB_TOP);
-  if (valign != TAB_TOP)
+  enum table_valign valign = cell->style->cell_style.valign;
+  if (valign != TABLE_VALIGN_TOP)
     {
       int height = page->params->measure_cell_height (
         page->params->aux, cell, bb[H][1] - bb[H][0]);
       int extra = bb[V][1] - bb[V][0] - height;
       if (extra > 0)
         {
-          if (valign == TAB_MIDDLE)
+          if (valign == TABLE_VALIGN_CENTER)
             extra /= 2;
           bb[V][0] += extra;
         }
@@ -1028,7 +1026,12 @@ render_cell (const struct render_page *page, const int ofs[TABLE_N_AXES],
       spill[axis][1] = rule_width (page, axis, cell->d[axis][1]) / 2;
     }
 
-  page->params->draw_cell (page->params->aux, cell, bb, spill, clip);
+  int color_idx = (cell->d[V][0] < page->h[V][0]
+                   || page->n[V] - (cell->d[V][0] + 1) < page->h[V][1]
+                   ? 0
+                   : (cell->d[V][0] - page->h[V][0]) & 1);
+  page->params->draw_cell (page->params->aux, cell, color_idx,
+                           bb, spill, clip);
 }
 
 /* Draws the cells of PAGE indicated in BB. */
@@ -1450,11 +1453,11 @@ add_text_page (struct render_pager *p, const struct table_item_text *t,
     return;
 
   struct tab_table *tab = tab_create (1, 1);
-  tab_text (tab, 0, 0, t->halign, t->content);
+  tab_text (tab, 0, 0, 0, t->content);
   for (size_t i = 0; i < t->n_footnotes; i++)
     tab_add_footnote (tab, 0, 0, t->footnotes[i]);
   if (t->style)
-    tab->styles[0] = cell_style_clone (tab->container, t->style);
+    tab->styles[0] = area_style_clone (tab->container, t->style);
   render_pager_add_table (p, &tab->table, min_width);
 }