+static enum pivot_border
+pivot_border_fallback (enum pivot_border border)
+{
+ switch (border)
+ {
+ case PIVOT_BORDER_TITLE:
+ case PIVOT_BORDER_OUTER_LEFT:
+ case PIVOT_BORDER_OUTER_TOP:
+ case PIVOT_BORDER_OUTER_RIGHT:
+ case PIVOT_BORDER_OUTER_BOTTOM:
+ case PIVOT_BORDER_INNER_LEFT:
+ case PIVOT_BORDER_INNER_TOP:
+ case PIVOT_BORDER_INNER_RIGHT:
+ case PIVOT_BORDER_INNER_BOTTOM:
+ case PIVOT_BORDER_DATA_LEFT:
+ case PIVOT_BORDER_DATA_TOP:
+ return border;
+
+ /* Dimensions. */
+ case PIVOT_BORDER_DIM_ROW_HORZ:
+ return PIVOT_BORDER_CAT_ROW_HORZ;
+ case PIVOT_BORDER_DIM_ROW_VERT:
+ return PIVOT_BORDER_CAT_ROW_VERT;
+ case PIVOT_BORDER_DIM_COL_HORZ:
+ return PIVOT_BORDER_CAT_COL_HORZ;
+ case PIVOT_BORDER_DIM_COL_VERT:
+ return PIVOT_BORDER_CAT_COL_VERT;
+
+ /* Categories. */
+ case PIVOT_BORDER_CAT_ROW_HORZ:
+ case PIVOT_BORDER_CAT_ROW_VERT:
+ case PIVOT_BORDER_CAT_COL_HORZ:
+ case PIVOT_BORDER_CAT_COL_VERT:
+ return border;
+
+ case PIVOT_N_BORDERS:
+ default:
+ NOT_REACHED ();
+ }
+}
+
+static struct table_border_style
+resolve_border_style (const struct pivot_table_look *look, enum pivot_border b,
+ bool show_grid_lines)
+{
+ struct table_border_style style = look->borders[b];
+ if (style.stroke != TABLE_STROKE_NONE)
+ return style;
+
+ style = look->borders[pivot_border_fallback (b)];
+ if (style.stroke != TABLE_STROKE_NONE)
+ return style;
+
+ if (show_grid_lines)
+ return (struct table_border_style) { .stroke = TABLE_STROKE_DASHED,
+ .color = CELL_COLOR_BLACK };
+
+ return style;
+}
+