diff options
Diffstat (limited to 'gcc/text-art/theme.cc')
-rw-r--r-- | gcc/text-art/theme.cc | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/gcc/text-art/theme.cc b/gcc/text-art/theme.cc new file mode 100644 index 0000000..19c39fa --- /dev/null +++ b/gcc/text-art/theme.cc @@ -0,0 +1,184 @@ +/* Classes for abstracting ascii vs unicode output. + Copyright (C) 2023 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#define INCLUDE_VECTOR +#include "system.h" +#include "coretypes.h" +#include "pretty-print.h" +#include "selftest.h" +#include "text-art/selftests.h" +#include "text-art/ruler.h" +#include "text-art/theme.h" + +using namespace text_art; + +/* class theme. */ + +void +theme::paint_y_arrow (canvas &canvas, + int canvas_x, + canvas::range_t y_range, + y_arrow_dir dir, + style::id_t style_id) const +{ + int canvas_y; + int delta_y; + const canvas::cell_t head (get_cppchar (dir == y_arrow_dir::UP + ? cell_kind::Y_ARROW_UP_HEAD + : cell_kind::Y_ARROW_DOWN_HEAD), + false, style_id); + const canvas::cell_t tail (get_cppchar (dir == y_arrow_dir::UP + ? cell_kind::Y_ARROW_UP_TAIL + : cell_kind::Y_ARROW_DOWN_TAIL), + false, style_id); + if (dir == y_arrow_dir::UP) + { + canvas_y = y_range.get_max (); + delta_y = -1; + } + else + { + canvas_y = y_range.get_min (); + delta_y = 1; + } + for (int len = y_range.get_size (); len; len--) + { + const canvas::cell_t cell = (len > 1) ? tail : head; + canvas.paint (canvas::coord_t (canvas_x, canvas_y), cell); + canvas_y += delta_y; + } +} + +/* class ascii_theme : public theme. */ + +canvas::cell_t +ascii_theme::get_line_art (directions line_dirs) const +{ + if (line_dirs.m_up + && line_dirs.m_down + && !(line_dirs.m_left || line_dirs.m_right)) + return canvas::cell_t ('|'); + if (line_dirs.m_left + && line_dirs.m_right + && !(line_dirs.m_up || line_dirs.m_down)) + return canvas::cell_t ('-'); + if (line_dirs.m_up + || line_dirs.m_down + || line_dirs.m_left + || line_dirs.m_right) + return canvas::cell_t ('+'); + return canvas::cell_t (' '); +} + +cppchar_t +ascii_theme::get_cppchar (enum cell_kind kind) const +{ + switch (kind) + { + default: + gcc_unreachable (); + case cell_kind::X_RULER_LEFT_EDGE: + return '|'; + case cell_kind::X_RULER_MIDDLE: + return '~'; + case cell_kind::X_RULER_INTERNAL_EDGE: + return '|'; + case cell_kind::X_RULER_CONNECTOR_TO_LABEL_BELOW: + case cell_kind::X_RULER_CONNECTOR_TO_LABEL_ABOVE: + return '+'; + case cell_kind::X_RULER_RIGHT_EDGE: + return '|'; + case cell_kind::X_RULER_VERTICAL_CONNECTOR: + return '|'; + + case cell_kind::TEXT_BORDER_HORIZONTAL: + return '-'; + case cell_kind::TEXT_BORDER_VERTICAL: + return '|'; + case cell_kind::TEXT_BORDER_TOP_LEFT: + case cell_kind::TEXT_BORDER_TOP_RIGHT: + case cell_kind::TEXT_BORDER_BOTTOM_LEFT: + case cell_kind::TEXT_BORDER_BOTTOM_RIGHT: + return '+'; + + case cell_kind::Y_ARROW_UP_HEAD: return '^'; + case cell_kind::Y_ARROW_DOWN_HEAD: return 'v'; + + case cell_kind::Y_ARROW_UP_TAIL: + case cell_kind::Y_ARROW_DOWN_TAIL: + return '|'; + } +} + +/* class unicode_theme : public theme. */ + +canvas::cell_t +unicode_theme::get_line_art (directions line_dirs) const +{ + return canvas::cell_t (get_box_drawing_char (line_dirs)); +} + +cppchar_t +unicode_theme::get_cppchar (enum cell_kind kind) const +{ + switch (kind) + { + default: + gcc_unreachable (); + case cell_kind::X_RULER_LEFT_EDGE: + return 0x251C; /* "├": U+251C: BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + case cell_kind::X_RULER_MIDDLE: + return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */ + case cell_kind::X_RULER_INTERNAL_EDGE: + return 0x253C; /* "┼": U+253C: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + case cell_kind::X_RULER_CONNECTOR_TO_LABEL_BELOW: + return 0x252C; /* "┬": U+252C: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + case cell_kind::X_RULER_CONNECTOR_TO_LABEL_ABOVE: + return 0x2534; /* "┴": U+2534: BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + case cell_kind::X_RULER_RIGHT_EDGE: + return 0x2524; /* "┤": U+2524: BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + case cell_kind::X_RULER_VERTICAL_CONNECTOR: + return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */ + + case cell_kind::TEXT_BORDER_HORIZONTAL: + return 0x2500; /* "─": U+2500: BOX DRAWINGS LIGHT HORIZONTAL */ + case cell_kind::TEXT_BORDER_VERTICAL: + return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */ + + /* Round corners. */ + case cell_kind::TEXT_BORDER_TOP_LEFT: + return 0x256D; /* "╭": U+256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT. */ + case cell_kind::TEXT_BORDER_TOP_RIGHT: + return 0x256E; /* "╮": U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT. */ + case cell_kind::TEXT_BORDER_BOTTOM_LEFT: + return 0x2570; /* "╰": U+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT. */ + case cell_kind::TEXT_BORDER_BOTTOM_RIGHT: + return 0x256F; /* "╯": U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT. */ + + case cell_kind::Y_ARROW_UP_HEAD: + return '^'; + case cell_kind::Y_ARROW_DOWN_HEAD: + return 'v'; + case cell_kind::Y_ARROW_UP_TAIL: + case cell_kind::Y_ARROW_DOWN_TAIL: + return 0x2502; /* "│": U+2502: BOX DRAWINGS LIGHT VERTICAL */ + } +} |