X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fascii.c;h=5fe9dc0e6f973fa8c5cf89757226a83be2a98072;hb=3c5630105991133a09971a4c107141767a2c7d0c;hp=bc1b225a405f5eab2cba4c641d67dea895ade199;hpb=0d0bd0c9669427f7cd43c3d34886bf22a146c451;p=pspp diff --git a/src/output/ascii.c b/src/output/ascii.c index bc1b225a40..5fe9dc0e6f 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,7 +48,6 @@ #include "output/table-item.h" #include "output/text-item.h" -#include "gl/error.h" #include "gl/minmax.h" #include "gl/xalloc.h" @@ -127,7 +126,7 @@ static const ucs4_t unicode_box_chars[N_BOX] = static inline int make_box_index (int left, int right, int top, int bottom) { - return ((right * 3 + bottom) * 3 + left) * 3 + top; + return ((right * RENDER_N_LINES + bottom) * RENDER_N_LINES + left) * RENDER_N_LINES + top; } /* How to emphasize text. */ @@ -151,6 +150,12 @@ struct ascii_driver enum emphasis_style emphasis; /* How to emphasize text. */ char *chart_file_name; /* Name of files used for charts. */ +#ifdef HAVE_CAIRO + /* Colours for charts */ + struct xr_color fg; + struct xr_color bg; +#endif + int width; /* Page width. */ int length; /* Page length minus margins and header. */ bool auto_width; /* Use viewwidth as page width? */ @@ -257,7 +262,10 @@ ascii_create (const char *file_name, enum settings_output_devices device_type, a->auto_width = a->width < 0; a->auto_length = paper_length < 0; a->length = paper_length - vertical_margins (a); - +#ifdef HAVE_CAIRO + parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &a->bg); + parse_color (d, o, "foreground-color", "#000000000000", &a->fg); +#endif box = parse_enum (opt (d, o, "box", "ascii"), "ascii", BOX_ASCII, "unicode", BOX_UNICODE, @@ -304,7 +312,7 @@ parse_page_size (struct driver_option *option) if (dim >= 1 && errno != ERANGE && *tail == '\0') dim = value; else - error (0, 0, _("%s: %s must be positive integer or `auto'"), + msg (MW, _("%s: %s must be positive integer or `auto'"), option->driver_name, option->name); } } @@ -336,7 +344,7 @@ update_page_size (struct ascii_driver *a, bool issue_error) if (a->width < MIN_WIDTH || a->length < MIN_LENGTH) { if (issue_error) - error (0, 0, + msg (ME, _("ascii: page excluding margins and headers " "must be at least %d characters wide by %d lines long, but " "as configured is only %d characters by %d lines"), @@ -385,8 +393,7 @@ ascii_flush (struct output_driver *driver) ascii_close_page (a); if (fn_close (a->file_name, a->file) != 0) - error (0, errno, _("ascii: closing output file `%s'"), - a->file_name); + msg_error (errno, _("ascii: closing output file `%s'"), a->file_name); a->file = NULL; } } @@ -522,7 +529,9 @@ ascii_submit (struct output_driver *driver, char *file_name; file_name = xr_draw_png_chart (chart_item, a->chart_file_name, - a->chart_cnt++); + a->chart_cnt++, + &a->fg, + &a->bg); if (file_name != NULL) { struct text_item *text_item; @@ -858,6 +867,7 @@ ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell, size_t last_break_ofs = 0; int last_break_width = 0; int width = 0; + size_t graph_ofs; size_t ofs; for (ofs = 0; ofs < n; ) @@ -893,25 +903,27 @@ ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell, } ofs += mblen; } - if (b[ofs] != UC_BREAK_MANDATORY) - { - while (ofs > 0 && isspace (line[ofs - 1])) - { - ofs--; - width--; - } - } - if (width > *widthp) - *widthp = width; + + /* Trim any trailing spaces off the end of the text to be drawn. */ + for (graph_ofs = ofs; graph_ofs > 0; graph_ofs--) + if (!isspace (line[graph_ofs - 1])) + break; + width -= ofs - graph_ofs; /* Draw text. */ - text_draw (a, cell->options, bb, clip, y, line, ofs, width); + text_draw (a, cell->options, bb, clip, y, line, graph_ofs, width); - /* Next line. */ - pos += ofs; - if (ofs < n && isspace (line[ofs])) - pos++; + /* If a new-line ended the line, just skip the new-line. Otherwise, skip + past any spaces past the end of the line (but not past a new-line). */ + if (b[ofs] == UC_BREAK_MANDATORY) + ofs++; + else + while (ofs < n && isspace (line[ofs]) && b[ofs] != UC_BREAK_MANDATORY) + ofs++; + if (width > *widthp) + *widthp = width; + pos += ofs; } *heightp = y - bb[V][0]; @@ -999,7 +1011,7 @@ ascii_open_page (struct ascii_driver *a) } else { - error (0, errno, _("ascii: opening output file `%s'"), + msg_error (errno, _("ascii: opening output file `%s'"), a->file_name); a->error = true; return false;