| 27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ |
29 */ |
| 30 |
30 |
| 31 #include "coloredline.h" |
31 #include "coloredline.h" |
| |
32 BEGIN_ZFC_NAMESPACE |
| 32 |
33 |
| 33 static const struct |
34 struct ColorCodeInfo |
| 34 { |
35 { |
| 35 const char* name; |
36 const char* name; |
| 36 Color color; |
37 Color color; |
| 37 bool bold; |
38 bool bold; |
| 38 } g_colorCodes['v' - 'a' + 1] = |
|
| 39 { |
|
| 40 { "Brick", RED, true }, // a |
|
| 41 { "Tan", YELLOW, true }, // b |
|
| 42 { "Gray", WHITE, false }, // c |
|
| 43 { "Green", GREEN, true }, // d |
|
| 44 { "Brown", YELLOW, false }, // e |
|
| 45 { "Gold", YELLOW, true }, // f |
|
| 46 { "Red", RED, true }, // g |
|
| 47 { "Blue", BLUE, false }, // h |
|
| 48 { "Orange", YELLOW, false }, // i |
|
| 49 { "White", WHITE, true }, // j |
|
| 50 { "Yellow", YELLOW, true }, // k |
|
| 51 { "Untranslated", DEFAULT, false }, // l |
|
| 52 { "Black", BLACK, false }, // m |
|
| 53 { "Blue", BLUE, true }, // n |
|
| 54 { "Cream", YELLOW, true }, // o |
|
| 55 { "Olive", GREEN, true }, // p |
|
| 56 { "Dark Green", GREEN, false }, // q |
|
| 57 { "Dark Red", RED, false }, // r |
|
| 58 { "Dark Brown", YELLOW, false }, // s |
|
| 59 { "Purple", MAGENTA, false }, // t |
|
| 60 { "Dark Gray", BLACK, true }, // u |
|
| 61 { "Cyan", CYAN, true }, // v |
|
| 62 }; |
39 }; |
| |
40 |
| |
41 ColoredLine::ColoredLine() : |
| |
42 m_length (0), |
| |
43 m_final (false), |
| |
44 m_activeColor (DEFAULT), |
| |
45 m_boldActive (false), |
| |
46 m_colorCodeStage (0) {} |
| 63 |
47 |
| 64 // ------------------------------------------------------------------------------------------------- |
48 // ------------------------------------------------------------------------------------------------- |
| 65 // |
49 // |
| 66 void ColoredLine::finalize() |
50 void ColoredLine::finalize() |
| 67 { |
51 { |
| 76 |
60 |
| 77 // ------------------------------------------------------------------------------------------------- |
61 // ------------------------------------------------------------------------------------------------- |
| 78 // |
62 // |
| 79 void ColoredLine::add_char (char ch) |
63 void ColoredLine::add_char (char ch) |
| 80 { |
64 { |
| |
65 static const ColorCodeInfo colorCodes[] = |
| |
66 { |
| |
67 { "Brick", RED, true }, // a |
| |
68 { "Tan", YELLOW, true }, // b |
| |
69 { "Gray", WHITE, false }, // c |
| |
70 { "Green", GREEN, true }, // d |
| |
71 { "Brown", YELLOW, false }, // e |
| |
72 { "Gold", YELLOW, true }, // f |
| |
73 { "Red", RED, true }, // g |
| |
74 { "Blue", BLUE, false }, // h |
| |
75 { "Orange", YELLOW, false }, // i |
| |
76 { "White", WHITE, true }, // j |
| |
77 { "Yellow", YELLOW, true }, // k |
| |
78 { "Untranslated", DEFAULT, false }, // l |
| |
79 { "Black", BLACK, false }, // m |
| |
80 { "Blue", BLUE, true }, // n |
| |
81 { "Cream", YELLOW, true }, // o |
| |
82 { "Olive", GREEN, true }, // p |
| |
83 { "Dark Green", GREEN, false }, // q |
| |
84 { "Dark Red", RED, false }, // r |
| |
85 { "Dark Brown", YELLOW, false }, // s |
| |
86 { "Purple", MAGENTA, false }, // t |
| |
87 { "Dark Gray", BLACK, true }, // u |
| |
88 { "Cyan", CYAN, true }, // v |
| |
89 }; |
| |
90 |
| 81 if (m_final) |
91 if (m_final) |
| 82 return; // Don't touch finalized lines. |
92 return; // Don't touch finalized lines. |
| 83 |
93 |
| 84 if (ch == '\x1C' and m_colorCodeStage == 0) |
94 if (ch == '\x1C' and m_colorCodeStage == 0) |
| 85 { |
95 { |
| 99 if (ch >= 'A' and ch <= 'V') |
109 if (ch >= 'A' and ch <= 'V') |
| 100 ch += 'a' - 'A'; |
110 ch += 'a' - 'A'; |
| 101 |
111 |
| 102 if (ch >= 'a' and ch <= 'v' and ch != 'l') |
112 if (ch >= 'a' and ch <= 'v' and ch != 'l') |
| 103 { |
113 { |
| 104 auto colorInfo = g_colorCodes[ch - 'a']; |
114 auto colorInfo = colorCodes[ch - 'a']; |
| 105 m_activeColor = colorInfo.color; |
115 m_activeColor = colorInfo.color; |
| 106 m_boldActive = colorInfo.bold; |
116 m_boldActive = colorInfo.bold; |
| 107 assert (m_activeColor < 8); |
117 assert (m_activeColor < 8); |
| 108 set_color (m_activeColor, true); |
118 set_color (m_activeColor, true); |
| 109 |
119 |
| 133 |
143 |
| 134 // ------------------------------------------------------------------------------------------------- |
144 // ------------------------------------------------------------------------------------------------- |
| 135 // |
145 // |
| 136 void ColoredLine::set_color (Color a, bool on) |
146 void ColoredLine::set_color (Color a, bool on) |
| 137 { |
147 { |
| 138 switch (a) |
148 assert (a < 8); |
| 139 { |
149 m_data << (a + (on ? RLINE_ON_COLOR : RLINE_OFF_COLOR)); |
| 140 case BLACK: m_data << (on ? RLINE_ON_BLACK : RLINE_OFF_BLACK); break; |
|
| 141 case RED: m_data << (on ? RLINE_ON_RED : RLINE_OFF_RED); break; |
|
| 142 case GREEN: m_data << (on ? RLINE_ON_GREEN : RLINE_OFF_GREEN); break; |
|
| 143 case YELLOW: m_data << (on ? RLINE_ON_YELLOW : RLINE_OFF_YELLOW); break; |
|
| 144 case BLUE: m_data << (on ? RLINE_ON_BLUE : RLINE_OFF_BLUE); break; |
|
| 145 case MAGENTA: m_data << (on ? RLINE_ON_MAGENTA : RLINE_OFF_MAGENTA); break; |
|
| 146 case CYAN: m_data << (on ? RLINE_ON_CYAN : RLINE_OFF_CYAN); break; |
|
| 147 case WHITE: m_data << (on ? RLINE_ON_WHITE : RLINE_OFF_WHITE); break; |
|
| 148 case NUM_COLORS: |
|
| 149 case DEFAULT: assert (false); break; |
|
| 150 } |
|
| 151 } |
150 } |
| 152 |
151 |
| 153 // ------------------------------------------------------------------------------------------------- |
152 // ------------------------------------------------------------------------------------------------- |
| 154 // How many rows does this line take up? |
153 // How many rows does this line take up? |
| 155 // |
154 // |