X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftab.c;h=435fa609ce06d4547f885f07aad3ad5c6e336e08;hb=01d6db8119ca4553d61841f2a9248712d4c6e0dc;hp=fe4b27402dddf71454691ef155fed65573fd644f;hpb=68dffb1e4a3a8f706b61265e1fd81dfe0b5a74d6;p=pspp diff --git a/src/output/tab.c b/src/output/tab.c index fe4b27402d..435fa609ce 100644 --- a/src/output/tab.c +++ b/src/output/tab.c @@ -45,11 +45,8 @@ #define _(msgid) gettext (msgid) -#if DEBUGGING static const bool debugging = true; -#else -static const bool debugging = false; -#endif + /* Cell options. */ #define TAB_JOIN (1u << TAB_FIRST_AVAILABLE) @@ -67,6 +64,8 @@ struct tab_joined_cell size_t n_footnotes; const struct footnote **footnotes; + + const struct cell_style *style; }; static const struct table_class tab_table_class; @@ -108,6 +107,9 @@ tab_create (int nc, int nr) t->fmtmap[RC_INTEGER] = ugly[RC_INTEGER]; t->fmtmap[RC_OTHER] = *settings_get_format (); + memset (t->styles, 0, sizeof t->styles); + memset (t->rule_colors, 0, sizeof t->rule_colors); + t->col_ofs = t->row_ofs = 0; return t; @@ -560,6 +562,7 @@ add_joined_cell (struct tab_table *table, int x1, int y1, int x2, int y2, j->d[TABLE_VERT][1] = ++y2 + table->row_ofs; j->n_footnotes = 0; j->footnotes = NULL; + j->style = NULL; { void **cc = &table->cc[x1 + y1 * table->cf]; @@ -618,12 +621,13 @@ tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, struct footnote * tab_create_footnote (struct tab_table *table, size_t idx, const char *content, - const char *marker) + const char *marker, struct cell_style *style) { struct footnote *f = pool_alloc (table->container, sizeof *f); f->idx = idx; f->content = pool_strdup (table->container, content); f->marker = pool_strdup (table->container, marker); + f->style = style; return f; } @@ -651,6 +655,27 @@ tab_add_footnote (struct tab_table *table, int x, int y, j->footnotes[j->n_footnotes++] = f; } +void +tab_add_style (struct tab_table *table, int x, int y, + const struct cell_style *style) +{ + int index = x + y * table->cf; + unsigned short opt = table->ct[index]; + struct tab_joined_cell *j; + + if (opt & TAB_JOIN) + j = table->cc[index]; + else + { + char *text = table->cc[index]; + + j = add_joined_cell (table, x, y, x, y, table->ct[index]); + j->u.text = text ? text : xstrdup (""); + } + + j->style = style; +} + bool tab_cell_is_empty (const struct tab_table *table, int c, int r) { @@ -793,6 +818,11 @@ tab_get_cell (const struct table *table, int x, int y, cell->inline_contents.n_footnotes = 0; cell->destructor = NULL; + int style_idx = (opt & TAB_STYLE_MASK) >> TAB_STYLE_SHIFT; + const struct cell_style *style = t->styles[style_idx]; + if (style) + cell->style = style; + if (opt & TAB_JOIN) { const struct tab_joined_cell *jc = cc; @@ -807,6 +837,9 @@ tab_get_cell (const struct table *table, int x, int y, cell->d[TABLE_HORZ][1] = jc->d[TABLE_HORZ][1]; cell->d[TABLE_VERT][0] = jc->d[TABLE_VERT][0]; cell->d[TABLE_VERT][1] = jc->d[TABLE_VERT][1]; + + if (jc->style) + cell->style = jc->style; } else { @@ -829,11 +862,17 @@ tab_get_cell (const struct table *table, int x, int y, } static int -tab_get_rule (const struct table *table, enum table_axis axis, int x, int y) +tab_get_rule (const struct table *table, enum table_axis axis, int x, int y, + struct cell_color *color) { const struct tab_table *t = tab_cast (table); - return (axis == TABLE_VERT - ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]); + uint8_t raw = (axis == TABLE_VERT + ? t->rh[x + t->cf * y] : t->rv[x + (t->cf + 1) * y]); + struct cell_color *p = t->rule_colors[(raw & TAB_RULE_STYLE_MASK) + >> TAB_RULE_STYLE_SHIFT]; + if (p) + *color = *p; + return (raw & TAB_RULE_TYPE_MASK) >> TAB_RULE_TYPE_SHIFT; } static const struct table_class tab_table_class = {