# HG changeset patch # User Teemu Piippo # Date 1418673564 -7200 # Node ID 19be47c9bab77ed81f4cc22ba9b17e8ce62a2988 # Parent 87b180260a5d31a307b90c9bbd0c7c1b35648680 - renamed RendererLine to ColoredLine and split it into its own files diff -r 87b180260a5d -r 19be47c9bab7 CMakeLists.txt --- a/CMakeLists.txt Mon Dec 15 21:46:05 2014 +0200 +++ b/CMakeLists.txt Mon Dec 15 21:59:24 2014 +0200 @@ -2,6 +2,7 @@ project (zfc9000) set (SOURCE_FILES + sources/coloredline.cpp sources/format.cpp sources/interface.cpp sources/main.cpp diff -r 87b180260a5d -r 19be47c9bab7 sources/coloredline.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/coloredline.cpp Mon Dec 15 21:59:24 2014 +0200 @@ -0,0 +1,151 @@ +/* + Copyright 2014 Teemu Piippo + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "coloredline.h" + +static const struct { Color color; bool bold; } g_colorCodes['v' - 'a' + 1] = +{ + { RED, true }, // a - brick + { YELLOW, true }, // b - tan + { WHITE, false }, // c - gray + { GREEN, true }, // d - light green + { YELLOW, false }, // e - brown + { YELLOW, true }, // f - gold yellow + { RED, true }, // g - bright red + { BLUE, false }, // h - dark blue + { YELLOW, false }, // i - orange + { WHITE, true }, // j - white + { YELLOW, true }, // k - fire yellow + { DEFAULT, false }, // l - untranslated + { BLACK, false }, // m - black + { BLUE, true }, // n - light blue + { YELLOW, true }, // o - cream + { GREEN, true }, // p - olive green + { GREEN, false }, // q - dark green + { RED, false }, // r - dark red + { YELLOW, false }, // s - dark brown + { MAGENTA, false }, // t - purple + { BLACK, true }, // u - dark gray + { CYAN, true }, // v - cyan +}; + +// ------------------------------------------------------------------------------------------------- +// +METHOD +ColoredLine::finalize() -> void +{ + if (m_activeColor != DEFAULT) + this->set_color (m_activeColor, false); + + if (m_boldActive) + m_data << RLINE_OFF_BOLD; + + m_final = true; +} + +// ------------------------------------------------------------------------------------------------- +// +METHOD +ColoredLine::add_char (char ch) -> void +{ + if (m_final) + return; // Don't touch finalized lines. + + if (ch == '\x1C' and m_colorCodeStage == 0) + { + m_colorCodeStage = 1; + return; + } + + if (m_colorCodeStage == 1) + { + if (m_activeColor != DEFAULT) + this->set_color (m_activeColor, false); + + if (m_boldActive) + m_data << RLINE_OFF_BOLD; + + if (ch >= 'a' and ch <= 'v' and ch != 'l') + { + auto colorInfo = g_colorCodes[ch - 'a']; + m_activeColor = colorInfo.color; + m_boldActive = colorInfo.bold; + assert (m_activeColor < 8); + this->set_color (m_activeColor, true); + + if (m_boldActive) + m_data << RLINE_ON_BOLD; + } + + m_colorCodeStage = 0; + return; + } + + if (isprint (ch)) + { + m_string += ch; + m_data << int (ch); + ++m_length; + } +} + +// ------------------------------------------------------------------------------------------------- +// +METHOD +ColoredLine::set_color (Color a, bool on) -> void +{ + switch (a) + { + case BLACK: m_data << (on ? RLINE_ON_BLACK : RLINE_OFF_BLACK); break; + case RED: m_data << (on ? RLINE_ON_RED : RLINE_OFF_RED); break; + case GREEN: m_data << (on ? RLINE_ON_GREEN : RLINE_OFF_GREEN); break; + case YELLOW: m_data << (on ? RLINE_ON_YELLOW : RLINE_OFF_YELLOW); break; + case BLUE: m_data << (on ? RLINE_ON_BLUE : RLINE_OFF_BLUE); break; + case MAGENTA: m_data << (on ? RLINE_ON_MAGENTA : RLINE_OFF_MAGENTA); break; + case CYAN: m_data << (on ? RLINE_ON_CYAN : RLINE_OFF_CYAN); break; + case WHITE: m_data << (on ? RLINE_ON_WHITE : RLINE_OFF_WHITE); break; + case NUM_COLORS: + case DEFAULT: assert (false); break; + } +} + +// ------------------------------------------------------------------------------------------------- +// How many rows does this line take up? +// +METHOD +ColoredLine::rows (int cols) const -> int +{ + int rows = length() / cols; + + if (length() % cols != 0) + rows++; + + return max (rows, 1); +} diff -r 87b180260a5d -r 19be47c9bab7 sources/coloredline.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/coloredline.h Mon Dec 15 21:59:24 2014 +0200 @@ -0,0 +1,77 @@ +/* + Copyright 2014 Teemu Piippo + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#pragma once +#include "main.h" + +enum +{ + RLINE_ON_BLACK = 256, + RLINE_ON_RED, + RLINE_ON_GREEN, + RLINE_ON_YELLOW, + RLINE_ON_BLUE, + RLINE_ON_MAGENTA, + RLINE_ON_CYAN, + RLINE_ON_WHITE, + RLINE_ON_BOLD, + RLINE_OFF_BLACK, + RLINE_OFF_RED, + RLINE_OFF_GREEN, + RLINE_OFF_YELLOW, + RLINE_OFF_BLUE, + RLINE_OFF_MAGENTA, + RLINE_OFF_CYAN, + RLINE_OFF_WHITE, + RLINE_OFF_BOLD, +}; + +class ColoredLine +{ +public: + ColoredLine() {} + + METHOD data() const -> const Vector& { return m_data; } + METHOD length() const -> int { return m_length; } + METHOD add_char (char ch) -> void; + METHOD finalize() -> void; + METHOD rows (int cols) const -> int; + +private: + METHOD set_color (Color a, bool on) -> void; + + Vector m_data; + int m_length = 0; + bool m_final = false; + Color m_activeColor = DEFAULT; + bool m_boldActive = false; + int m_colorCodeStage = 0; + String m_string; +}; diff -r 87b180260a5d -r 19be47c9bab7 sources/interface.cpp --- a/sources/interface.cpp Mon Dec 15 21:46:05 2014 +0200 +++ b/sources/interface.cpp Mon Dec 15 21:59:24 2014 +0200 @@ -32,51 +32,7 @@ #include "interface.h" #include "network/rconsession.h" #include "network/ipaddress.h" - -enum -{ - RLINE_ON_BLACK = 256, - RLINE_ON_RED, - RLINE_ON_GREEN, - RLINE_ON_YELLOW, - RLINE_ON_BLUE, - RLINE_ON_MAGENTA, - RLINE_ON_CYAN, - RLINE_ON_WHITE, - RLINE_ON_BOLD, - RLINE_OFF_BLACK, - RLINE_OFF_RED, - RLINE_OFF_GREEN, - RLINE_OFF_YELLOW, - RLINE_OFF_BLUE, - RLINE_OFF_MAGENTA, - RLINE_OFF_CYAN, - RLINE_OFF_WHITE, - RLINE_OFF_BOLD, -}; - -class RendererLine -{ -public: - RendererLine() {} - - METHOD data() const -> const Vector& { return m_data; } - METHOD length() const -> int { return m_length; } - METHOD add_char (char ch) -> void; - METHOD finalize() -> void; - METHOD rows (int cols) const -> int; - -private: - METHOD set_color (Color a, bool on) -> void; - - Vector m_data; - int m_length = 0; - bool m_final = false; - Color m_activeColor = DEFAULT; - bool m_boldActive = false; - int m_colorCodeStage = 0; - String m_string; -}; +#include "coloredline.h" static const int g_pageSize = 10; @@ -97,7 +53,7 @@ static bool g_needInputRender = false; static bool g_needOutputRender = false; static struct { char ch; int x; } g_cursorChar; -static Vector g_output;; +static Vector g_output;; static int g_outputScroll = 0; static String g_title; static InputState g_inputState = INPUTSTATE_NORMAL; @@ -105,32 +61,6 @@ static IPAddress g_address; static String g_statusBarText; -static const struct { Color color; bool bold; } g_colorCodes['v' - 'a' + 1] = -{ - { RED, true }, // a - brick - { YELLOW, true }, // b - tan - { WHITE, false }, // c - gray - { GREEN, true }, // d - light green - { YELLOW, false }, // e - brown - { YELLOW, true }, // f - gold yellow - { RED, true }, // g - bright red - { BLUE, false }, // h - dark blue - { YELLOW, false }, // i - orange - { WHITE, true }, // j - white - { YELLOW, true }, // k - fire yellow - { DEFAULT, false }, // l - untranslated - { BLACK, false }, // m - black - { BLUE, true }, // n - light blue - { YELLOW, true }, // o - cream - { GREEN, true }, // p - olive green - { GREEN, false }, // q - dark green - { RED, false }, // r - dark red - { YELLOW, false }, // s - dark brown - { MAGENTA, false }, // t - purple - { BLACK, true }, // u - dark gray - { CYAN, true }, // v - cyan -}; - // ------------------------------------------------------------------------------------------------- // static FUNCTION @@ -255,7 +185,7 @@ g_input.clear(); g_input << ""; g_output.clear(); - g_output << RendererLine(); + g_output << ColoredLine(); g_title = format (APPNAME " %1 (%2)", full_version_string(), changeset_date_string()); for (int i = 0; i < NUM_COLORS; ++i) @@ -908,7 +838,7 @@ if (ch == '\n') { g_output[g_output.size() - 1].finalize(); - g_output << RendererLine(); + g_output << ColoredLine(); continue; } @@ -940,97 +870,3 @@ session->set_password (password); session->connect (g_address); } - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::finalize() -> void -{ - if (m_activeColor != DEFAULT) - this->set_color (m_activeColor, false); - - if (m_boldActive) - m_data << RLINE_OFF_BOLD; - - m_final = true; -} - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::add_char (char ch) -> void -{ - if (m_final) - return; // Don't touch finalized lines. - - if (ch == '\x1C' and m_colorCodeStage == 0) - { - m_colorCodeStage = 1; - return; - } - - if (m_colorCodeStage == 1) - { - if (m_activeColor != DEFAULT) - this->set_color (m_activeColor, false); - - if (m_boldActive) - m_data << RLINE_OFF_BOLD; - - if (ch >= 'a' and ch <= 'v' and ch != 'l') - { - auto colorInfo = g_colorCodes[ch - 'a']; - m_activeColor = colorInfo.color; - m_boldActive = colorInfo.bold; - assert (m_activeColor < 8); - this->set_color (m_activeColor, true); - - if (m_boldActive) - m_data << RLINE_ON_BOLD; - } - - m_colorCodeStage = 0; - return; - } - - if (isprint (ch)) - { - m_string += ch; - m_data << int (ch); - ++m_length; - } -} - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::set_color (Color a, bool on) -> void -{ - switch (a) - { - case BLACK: m_data << (on ? RLINE_ON_BLACK : RLINE_OFF_BLACK); break; - case RED: m_data << (on ? RLINE_ON_RED : RLINE_OFF_RED); break; - case GREEN: m_data << (on ? RLINE_ON_GREEN : RLINE_OFF_GREEN); break; - case YELLOW: m_data << (on ? RLINE_ON_YELLOW : RLINE_OFF_YELLOW); break; - case BLUE: m_data << (on ? RLINE_ON_BLUE : RLINE_OFF_BLUE); break; - case MAGENTA: m_data << (on ? RLINE_ON_MAGENTA : RLINE_OFF_MAGENTA); break; - case CYAN: m_data << (on ? RLINE_ON_CYAN : RLINE_OFF_CYAN); break; - case WHITE: m_data << (on ? RLINE_ON_WHITE : RLINE_OFF_WHITE); break; - case NUM_COLORS: - case DEFAULT: assert (false); break; - } -} - -// ------------------------------------------------------------------------------------------------- -// How many rows does this line take up? -// -METHOD -RendererLine::rows (int cols) const -> int -{ - int rows = length() / cols; - - if (length() % cols != 0) - rows++; - - return max (rows, 1); -}