• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

gansm / finalcut / #746

31 Dec 2025 10:25PM UTC coverage: 68.505% (+0.05%) from 68.454%
#746

push

travis-ci

gansm
The "FindFinalCut.cmake" file has been added to simplify the integration of FINAL CUT into CMake projects

37261 of 54392 relevant lines covered (68.5%)

226.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.61
/test/ftermlinux-test.cpp
1
/***********************************************************************
2
* ftermlinux-test.cpp - FTermLinux unit tests                          *
3
*                                                                      *
4
* This file is part of the FINAL CUT widget toolkit                    *
5
*                                                                      *
6
* Copyright 2019-2025 Markus Gans                                      *
7
*                                                                      *
8
* FINAL CUT is free software; you can redistribute it and/or modify    *
9
* it under the terms of the GNU Lesser General Public License as       *
10
* published by the Free Software Foundation; either version 3 of       *
11
* the License, or (at your option) any later version.                  *
12
*                                                                      *
13
* FINAL CUT is distributed in the hope that it will be useful, but     *
14
* WITHOUT ANY WARRANTY; without even the implied warranty of           *
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
16
* GNU Lesser General Public License for more details.                  *
17
*                                                                      *
18
* You should have received a copy of the GNU Lesser General Public     *
19
* License along with this program.  If not, see                        *
20
* <http://www.gnu.org/licenses/>.                                      *
21
***********************************************************************/
22

23
#include <term.h>
24
#undef back_tab         // from term.h
25
#undef buttons          // from term.h
26
#undef carriage_return  // from term.h
27
#undef clr_bol          // from term.h
28
#undef clr_eol          // from term.h
29
#undef column_address   // from term.h
30
#undef erase_chars      // from term.h
31
#undef orig_colors      // from term.h
32
#undef orig_pair        // from term.h
33
#undef repeat_char      // from term.h
34
#undef row_address      // from term.h
35
#undef tab              // from term.h
36

37
#include <limits>
38
#include <string>
39

40
#include <cppunit/BriefTestProgressListener.h>
41
#include <cppunit/CompilerOutputter.h>
42
#include <cppunit/extensions/HelperMacros.h>
43
#include <cppunit/TestFixture.h>
44
#include <cppunit/TestResult.h>
45
#include <cppunit/TestResultCollector.h>
46
#include <cppunit/TestRunner.h>
47
#include <unistd.h>
48

49
#if defined(__linux__)
50
  #include <linux/version.h>
51
#endif
52

53
#include <conemu.h>
54
#include <final/final.h>
55

56
#define CPPUNIT_ASSERT_CSTRING(expected, actual) \
57
            check_c_string (expected, actual, CPPUNIT_SOURCELINE())
58

59
//----------------------------------------------------------------------
60
void check_c_string ( const char* s1
15✔
61
                    , const char* s2
62
                    , const CppUnit::SourceLine& sourceLine )
63
{
64
  if ( s1 == nullptr && s2 == nullptr )  // Strings are equal
15✔
65
    return;
×
66

67
  if ( s1 && s2 && std::strcmp (s1, s2) == 0 )  // Strings are equal
15✔
68
      return;
15✔
69

70
  ::CppUnit::Asserter::fail ("Strings are not equal", sourceLine);
×
71
}
72

73

74
namespace test
75
{
76

77
//----------------------------------------------------------------------
78
// class FSystemTest
79
//----------------------------------------------------------------------
80

81
class FSystemTest : public finalcut::FSystem
82
{
83
  public:
84
    // Typedefs and Enumerations
85
    struct ShiftState
86
    {
87
      uChar shift  : 1;
88
      uChar alt_gr : 1;
89
      uChar ctrl   : 1;
90
      uChar alt    : 1;
91
      uChar        : 4;  // padding bits
92
    };
93

94
    struct RGB
95
    {
96
      uChar red;
97
      uChar green;
98
      uChar blue;
99
    };
100

101
    struct ColorMap
102
    {
103
      RGB color[16];
104
    };
105

106
    enum class AccessMode
107
    {
108
      index,
109
      data
110
    };
111

112
    enum class Codeset
113
    {
114
      cp437,
115
      lat15
116
    };
117

118
    // Constructor
119
    FSystemTest();
120

121
    // Destructor
122
    ~FSystemTest() override;
123

124
    // Methods
125
    auto inPortByte (uShort) noexcept -> uChar override;
126
    void outPortByte (uChar, uShort) noexcept override;
127
    auto isTTY (int) const noexcept -> int override;
128
    auto ioctl (int, uLong, ...) noexcept -> int override;
129
    auto pipe (finalcut::PipeData&) noexcept -> int override;
130
    auto open (const char*, int, ...) noexcept -> int override;
131
    auto close (int) noexcept -> int override;
132
    auto fopen (const char*, const char*) noexcept -> FILE* override;
133
    auto fclose (FILE*) noexcept -> int override;
134
    auto fputs (const char*, FILE*) noexcept -> int override;
135
    auto putchar (int) noexcept -> int override;
136
    auto putstring (const char*, std::size_t) noexcept -> int override;
137
    auto sigaction ( int, const struct sigaction*
138
                   , struct sigaction*) noexcept -> int override;
139
    auto timer_create ( clockid_t, struct sigevent*
140
                      , timer_t* ) noexcept -> int override;
141
    auto timer_settime ( timer_t, int
142
                       , const struct itimerspec*
143
                       , struct itimerspec* ) noexcept -> int override;
144
    auto timer_delete (timer_t) noexcept -> int override;
145
    auto kqueue() noexcept -> int override;
146
    auto kevent ( int, const struct kevent*
147
                , int, struct kevent*
148
                , int, const struct timespec* ) noexcept -> int override;
149
    auto getuid() noexcept -> uid_t override;
150
    auto geteuid() noexcept -> uid_t override;
151
    auto getpwuid_r ( uid_t, struct passwd*, char*
152
                    , size_t, struct passwd** ) noexcept -> int override;
153
    auto realpath (const char*, char*) noexcept -> char* override;
154
    auto getRGB (finalcut::FColor) noexcept -> RGB&;
155
    auto getConsoleFont() noexcept -> console_font_op&;
156
    auto getShiftState() noexcept -> ShiftState&;
157
    auto getCharacters() noexcept -> std::string&;
158
    void setCodeset (Codeset) noexcept;
159

160
  private:
161
    // Methods
162
    static void initVScreenInfo();
163
    static void initFScreenInfo();
164

165
    // Data members
166
    std::string characters;
167
    static ShiftState shift_state;
168
    static RGB terminal_color[16];
169
    static RGB defaultColor[16];
170
    static struct console_font_op terminal_font;
171
    static unimapdesc terminal_unicode_map;
172
    static struct fb_var_screeninfo fb_terminal_info;
173
    static struct fb_fix_screeninfo fb_terminal_fix_info;
174
    static bool vga_port_access;
175

176
    AccessMode attribute_controller_mode = AccessMode::index;
177
    uChar ac_address_register[21] = \
178
    {
179
      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
180
      0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
181
      0x0e, 0x0f, 0x0c, 0x00, 0x0f, 0x08, 0x00
182
    };
183
    uChar ac_index{0};
184
    bool palette_addr_source_field{true};
185
    uChar port_3cc{0x67};  // Miscellaneous output
186
    uChar port_3da{0};     // Input status 1
187
    Codeset codeset{Codeset::cp437};
188
    static uChar vga8x16[];
189
    static struct unipair unicode_cp437_pairs[];
190
    static struct unipair unicode_lat15_pairs[];
191
};
192

193

194
// private data member of FSystemTest
195
//----------------------------------------------------------------------
196
uChar FSystemTest::vga8x16[] =
197
{
198
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0
199
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200
  0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 1
201
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202
  0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 2
203
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204
  0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  // 3
205
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206
  0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  // 4
207
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208
  0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 5
209
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210
  0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 6
211
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 7
213
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // 8
215
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,  // 9
217
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff,  // 10
219
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220
  0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,  // 11
221
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222
  0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 12
223
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224
  0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00,  // 13
225
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226
  0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,  // 14
227
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228
  0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 15
229
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230
  0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,  // 16
231
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232
  0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  // 17
233
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234
  0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  // 18
235
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236
  0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  // 19
237
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238
  0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,  // 20
239
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240
  0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,  // 21
241
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 22
243
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244
  0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 23
245
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246
  0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 24
247
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248
  0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,  // 25
249
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250
  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 26
251
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252
  0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 27
253
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 28
255
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256
  0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 29
257
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258
  0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,  // 30
259
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260
  0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,  // 31
261
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 32
263
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264
  0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 33
265
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266
  0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 34
267
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268
  0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,  // 35
269
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270
  0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00,  // 36
271
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272
  0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00,  // 37
273
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274
  0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 38
275
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276
  0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 39
277
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278
  0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,  // 40
279
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280
  0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  // 41
281
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282
  0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 42
283
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284
  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 43
285
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,  // 44
287
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 45
289
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 46
291
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292
  0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,  // 47
293
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294
  0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,  // 48
295
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296
  0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 49
297
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298
  0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 50
299
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300
  0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 51
301
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302
  0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,  // 52
303
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304
  0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 53
305
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306
  0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 54
307
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308
  0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,  // 55
309
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 56
311
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00,  // 57
313
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314
  0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  // 58
315
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316
  0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,  // 59
317
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318
  0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00,  // 60
319
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 61
321
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322
  0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,  // 62
323
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 63
325
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326
  0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 64
327
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328
  0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 65
329
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330
  0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00,  // 66
331
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332
  0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 67
333
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334
  0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,  // 68
335
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336
  0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 69
337
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338
  0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,  // 70
339
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340
  0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,  // 71
341
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342
  0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 72
343
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344
  0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 73
345
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346
  0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,  // 74
347
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348
  0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,  // 75
349
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350
  0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 76
351
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352
  0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 77
353
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354
  0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 78
355
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 79
357
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358
  0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,  // 80
359
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00,  // 81
361
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362
  0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,  // 82
363
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364
  0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 83
365
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366
  0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 84
367
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368
  0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 85
369
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370
  0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,  // 86
371
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372
  0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00,  // 87
373
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374
  0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 88
375
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376
  0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 89
377
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378
  0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 90
379
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380
  0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 91
381
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382
  0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,  // 92
383
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384
  0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 93
385
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386
  0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 94
387
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,  // 95
389
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390
  0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 96
391
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392
  0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 97
393
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394
  0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 98
395
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 99
397
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398
  0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 100
399
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 101
401
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402
  0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,  // 102
403
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404
  0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00,  // 103
405
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406
  0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,  // 104
407
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408
  0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 105
409
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410
  0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00,  // 106
411
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412
  0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,  // 107
413
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414
  0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 108
415
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416
  0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 109
417
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418
  0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  // 110
419
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 111
421
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422
  0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,  // 112
423
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424
  0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,  // 113
425
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426
  0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,  // 114
427
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 115
429
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430
  0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,  // 116
431
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432
  0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 117
433
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
434
  0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,  // 118
435
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436
  0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00,  // 119
437
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
438
  0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 120
439
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440
  0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,  // 121
441
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442
  0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 122
443
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444
  0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,  // 123
445
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446
  0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 124
447
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448
  0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,  // 125
449
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450
  0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 126
451
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452
  0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,  // 127
453
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454
  0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,  // 128
455
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456
  0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 129
457
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458
  0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 130
459
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460
  0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 131
461
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462
  0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 132
463
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464
  0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 133
465
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466
  0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 134
467
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468
  0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00,  // 135
469
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470
  0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 136
471
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472
  0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 137
473
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474
  0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 138
475
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476
  0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 139
477
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478
  0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 140
479
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480
  0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 141
481
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482
  0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 142
483
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484
  0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 143
485
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486
  0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 144
487
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488
  0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00,  // 145
489
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490
  0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,  // 146
491
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492
  0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 147
493
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494
  0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 148
495
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496
  0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 149
497
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498
  0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 150
499
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500
  0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 151
501
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502
  0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,  // 152
503
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504
  0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 153
505
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
506
  0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 154
507
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
508
  0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 155
509
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
510
  0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00,  // 156
511
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
512
  0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 157
513
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
514
  0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 158
515
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
516
  0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00,  // 159
517
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
518
  0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 160
519
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520
  0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 161
521
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522
  0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 162
523
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524
  0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 163
525
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526
  0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,  // 164
527
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
528
  0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 165
529
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530
  0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 166
531
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532
  0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 167
533
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
534
  0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,  // 168
535
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,  // 169
537
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
538
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,  // 170
539
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540
  0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00,  // 171
541
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542
  0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 0x00,  // 172
543
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
544
  0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,  // 173
545
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
546
  0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 174
547
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548
  0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 175
549
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550
  0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,  // 176
551
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552
  0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,  // 177
553
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554
  0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,  // 178
555
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
556
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 179
557
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 180
559
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
560
  0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 181
561
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 182
563
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 183
565
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566
  0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 184
567
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568
  0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 185
569
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
570
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 186
571
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572
  0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 187
573
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
574
  0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 188
575
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
576
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 189
577
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578
  0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 190
579
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 191
581
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
582
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 192
583
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 193
585
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 194
587
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 195
589
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 196
591
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
592
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 197
593
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594
  0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 198
595
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 199
597
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598
  0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 200
599
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 201
601
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602
  0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 202
603
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604
  0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 203
605
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606
  0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 204
607
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608
  0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 205
609
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610
  0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 206
611
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612
  0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 207
613
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
614
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 208
615
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
616
  0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 209
617
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 210
619
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 211
621
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622
  0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 212
623
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624
  0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 213
625
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
626
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 214
627
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628
  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,  // 215
629
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630
  0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 216
631
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 217
633
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
634
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 218
635
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // 219
637
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // 220
639
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640
  0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,  // 221
641
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642
  0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,  // 222
643
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 223
645
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646
  0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,  // 224
647
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648
  0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00,  // 225
649
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650
  0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,  // 226
651
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652
  0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,  // 227
653
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654
  0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,  // 228
655
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,  // 229
657
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
658
  0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,  // 230
659
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660
  0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,  // 231
661
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
662
  0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 232
663
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
664
  0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,  // 233
665
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
666
  0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00,  // 234
667
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668
  0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,  // 235
669
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
670
  0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 236
671
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
672
  0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00,  // 237
673
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674
  0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,  // 238
675
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676
  0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,  // 239
677
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678
  0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,  // 240
679
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680
  0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,  // 241
681
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682
  0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 242
683
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684
  0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,  // 243
685
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686
  0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,  // 244
687
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688
  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,  // 245
689
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690
  0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,  // 246
691
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692
  0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 247
693
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694
  0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 248
695
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 249
697
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 250
699
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700
  0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,  // 251
701
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702
  0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 252
703
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704
  0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 253
705
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706
  0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,  // 254
707
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 255
709
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
710
};
711

712
struct unipair FSystemTest::unicode_cp437_pairs[] =
713
{
714
  //  .----------- unicode
715
  //  |      .---- fontpos
716
  //  |      |
717
  {0x0020, 0x20},
718
  {0x0021, 0x21},
719
  {0x0022, 0x22},
720
  {0x0023, 0x23},
721
  {0x0024, 0x24},
722
  {0x0025, 0x25},
723
  {0x0026, 0x26},
724
  {0x0027, 0x27},
725
  {0x0028, 0x28},
726
  {0x0029, 0x29},
727
  {0x002a, 0x2a},
728
  {0x002b, 0x2b},
729
  {0x002c, 0x2c},
730
  {0x002d, 0x2d},
731
  {0x002e, 0x2e},
732
  {0x002f, 0x2f},
733
  {0x0030, 0x30},
734
  {0x0031, 0x31},
735
  {0x0032, 0x32},
736
  {0x0033, 0x33},
737
  {0x0034, 0x34},
738
  {0x0035, 0x35},
739
  {0x0036, 0x36},
740
  {0x0037, 0x37},
741
  {0x0038, 0x38},
742
  {0x0039, 0x39},
743
  {0x003a, 0x3a},
744
  {0x003b, 0x3b},
745
  {0x003c, 0x3c},
746
  {0x003d, 0x3d},
747
  {0x003e, 0x3e},
748
  {0x003f, 0x3f},
749
  {0x0040, 0x40},
750
  {0x0041, 0x41},
751
  {0x0042, 0x42},
752
  {0x0043, 0x43},
753
  {0x0044, 0x44},
754
  {0x0045, 0x45},
755
  {0x0046, 0x46},
756
  {0x0047, 0x47},
757
  {0x0048, 0x48},
758
  {0x0049, 0x49},
759
  {0x004a, 0x4a},
760
  {0x004b, 0x4b},
761
  {0x004c, 0x4c},
762
  {0x004d, 0x4d},
763
  {0x004e, 0x4e},
764
  {0x004f, 0x4f},
765
  {0x0050, 0x50},
766
  {0x0051, 0x51},
767
  {0x0052, 0x52},
768
  {0x0053, 0x53},
769
  {0x0054, 0x54},
770
  {0x0055, 0x55},
771
  {0x0056, 0x56},
772
  {0x0057, 0x57},
773
  {0x0058, 0x58},
774
  {0x0059, 0x59},
775
  {0x005a, 0x5a},
776
  {0x005b, 0x5b},
777
  {0x005c, 0x5c},
778
  {0x005d, 0x5d},
779
  {0x005e, 0x5e},
780
  {0x005f, 0x5f},
781
  {0x0060, 0x60},
782
  {0x0061, 0x61},
783
  {0x0062, 0x62},
784
  {0x0063, 0x63},
785
  {0x0064, 0x64},
786
  {0x0065, 0x65},
787
  {0x0066, 0x66},
788
  {0x0067, 0x67},
789
  {0x0068, 0x68},
790
  {0x0069, 0x69},
791
  {0x006a, 0x6a},
792
  {0x006b, 0x6b},
793
  {0x006c, 0x6c},
794
  {0x006d, 0x6d},
795
  {0x006e, 0x6e},
796
  {0x006f, 0x6f},
797
  {0x0070, 0x70},
798
  {0x0071, 0x71},
799
  {0x0072, 0x72},
800
  {0x0073, 0x73},
801
  {0x0074, 0x74},
802
  {0x0075, 0x75},
803
  {0x0076, 0x76},
804
  {0x0077, 0x77},
805
  {0x0078, 0x78},
806
  {0x0079, 0x79},
807
  {0x007a, 0x7a},
808
  {0x007b, 0x7b},
809
  {0x007c, 0x7c},
810
  {0x007d, 0x7d},
811
  {0x007e, 0x7e},
812
  {0x00a0, 0xff},
813
  {0x00a1, 0xad},
814
  {0x00a2, 0x9b},
815
  {0x00a3, 0x9c},
816
  {0x00a5, 0x9d},
817
  {0x00a7, 0x15},
818
  {0x00aa, 0xa6},
819
  {0x00ab, 0xae},
820
  {0x00ac, 0xaa},
821
  {0x00b0, 0xf8},
822
  {0x00b1, 0xf1},
823
  {0x00b2, 0xfd},
824
  {0x00b5, 0xe6},
825
  {0x00b6, 0x14},
826
  {0x00b7, 0xfa},
827
  {0x00ba, 0xa7},
828
  {0x00bb, 0xaf},
829
  {0x00bc, 0xac},
830
  {0x00bd, 0xab},
831
  {0x00bf, 0xa8},
832
  {0x00c4, 0x8e},
833
  {0x00c5, 0x8f},
834
  {0x00c6, 0x92},
835
  {0x00c7, 0x80},
836
  {0x00c9, 0x90},
837
  {0x00d1, 0xa5},
838
  {0x00d6, 0x99},
839
  {0x00dc, 0x9a},
840
  {0x00df, 0xe1},
841
  {0x00e0, 0x85},
842
  {0x00e1, 0xa0},
843
  {0x00e2, 0x83},
844
  {0x00e4, 0x84},
845
  {0x00e5, 0x86},
846
  {0x00e6, 0x91},
847
  {0x00e7, 0x87},
848
  {0x00e8, 0x8a},
849
  {0x00e9, 0x82},
850
  {0x00ea, 0x88},
851
  {0x00eb, 0x89},
852
  {0x00ec, 0x8d},
853
  {0x00ed, 0xa1},
854
  {0x00ee, 0x8c},
855
  {0x00ef, 0x8b},
856
  {0x00f1, 0xa4},
857
  {0x00f2, 0x95},
858
  {0x00f3, 0xa2},
859
  {0x00f4, 0x93},
860
  {0x00f6, 0x94},
861
  {0x00f7, 0xf6},
862
  {0x00f9, 0x97},
863
  {0x00fa, 0xa3},
864
  {0x00fb, 0x96},
865
  {0x00fc, 0x81},
866
  {0x00ff, 0x98},
867
  {0x0192, 0x9f},
868
  {0x0393, 0xe2},
869
  {0x0398, 0xe9},
870
  {0x03a3, 0xe4},
871
  {0x03a6, 0xe8},
872
  {0x03a9, 0xea},
873
  {0x03b1, 0xe0},
874
  {0x03b2, 0xe1},
875
  {0x03b4, 0xeb},
876
  {0x03b5, 0xee},
877
  {0x03bc, 0xe6},
878
  {0x03c0, 0xe3},
879
  {0x03c3, 0xe5},
880
  {0x03c4, 0xe7},
881
  {0x03c6, 0xed},
882
  {0x2008, 0x00},
883
  {0x2022, 0x07},
884
  {0x203c, 0x13},
885
  {0x207f, 0xfc},
886
  {0x20a7, 0x9e},
887
  {0x2126, 0xea},
888
  {0x212b, 0x8f},
889
  {0x2190, 0x1b},
890
  {0x2191, 0x18},
891
  {0x2192, 0x1a},
892
  {0x2193, 0x19},
893
  {0x2194, 0x1d},
894
  {0x2195, 0x12},
895
  {0x21a8, 0x17},
896
  {0x2205, 0xed},
897
  {0x2208, 0xee},
898
  {0x220e, 0xfe},
899
  {0x2219, 0xf9},
900
  {0x221a, 0xfb},
901
  {0x221e, 0xec},
902
  {0x221f, 0x1c},
903
  {0x2229, 0xef},
904
  {0x2248, 0xf7},
905
  {0x2261, 0xf0},
906
  {0x2264, 0xf3},
907
  {0x2265, 0xf2},
908
  {0x22c5, 0xf9},
909
  {0x2300, 0xed},
910
  {0x2302, 0x7f},
911
  {0x2310, 0xa9},
912
  {0x2319, 0x1c},
913
  {0x2320, 0xf4},
914
  {0x2321, 0xf5},
915
  {0x2500, 0xc4},
916
  {0x2502, 0xb3},
917
  {0x250c, 0xda},
918
  {0x2510, 0xbf},
919
  {0x2514, 0xc0},
920
  {0x2518, 0xd9},
921
  {0x251c, 0xc3},
922
  {0x2524, 0xb4},
923
  {0x252c, 0xc2},
924
  {0x2534, 0xc1},
925
  {0x253c, 0xc5},
926
  {0x2550, 0xcd},
927
  {0x2551, 0xba},
928
  {0x2552, 0xd5},
929
  {0x2553, 0xd6},
930
  {0x2554, 0xc9},
931
  {0x2555, 0xb8},
932
  {0x2556, 0xb7},
933
  {0x2557, 0xbb},
934
  {0x2558, 0xd4},
935
  {0x2559, 0xd3},
936
  {0x255a, 0xc8},
937
  {0x255b, 0xbe},
938
  {0x255c, 0xbd},
939
  {0x255d, 0xbc},
940
  {0x255e, 0xc6},
941
  {0x255f, 0xc7},
942
  {0x2560, 0xcc},
943
  {0x2561, 0xb5},
944
  {0x2562, 0xb6},
945
  {0x2563, 0xb9},
946
  {0x2564, 0xd1},
947
  {0x2565, 0xd2},
948
  {0x2566, 0xcb},
949
  {0x2567, 0xcf},
950
  {0x2568, 0xd0},
951
  {0x2569, 0xca},
952
  {0x256a, 0xd8},
953
  {0x256b, 0xd7},
954
  {0x256c, 0xce},
955
  {0x2580, 0xdf},
956
  {0x2584, 0xdc},
957
  {0x2588, 0xdb},
958
  {0x258c, 0xdd},
959
  {0x2590, 0xde},
960
  {0x2591, 0xb0},
961
  {0x2592, 0xb1},
962
  {0x2593, 0xb2},
963
  {0x25a0, 0xfe},
964
  {0x25ac, 0x16},
965
  {0x25b2, 0x1e},
966
  {0x25b6, 0x10},
967
  {0x25ba, 0x10},
968
  {0x25bc, 0x1f},
969
  {0x25c0, 0x11},
970
  {0x25c4, 0x11},
971
  {0x25cb, 0x09},
972
  {0x25d8, 0x08},
973
  {0x25d9, 0x0a},
974
  {0x263a, 0x01},
975
  {0x263b, 0x02},
976
  {0x263c, 0x0f},
977
  {0x2640, 0x0c},
978
  {0x2642, 0x0b},
979
  {0x2660, 0x06},
980
  {0x2663, 0x05},
981
  {0x2665, 0x03},
982
  {0x2666, 0x04},
983
  {0x266a, 0x0d},
984
  {0x266b, 0x0e},
985
  {0x266c, 0x0e}
986
};
987

988
struct unipair FSystemTest::unicode_lat15_pairs[] =
989
{
990
  //  .----------- unicode
991
  //  |      .---- fontpos
992
  //  |      |
993
  {0x0020, 0x20},
994
  {0x0021, 0x21},
995
  {0x0022, 0x22},
996
  {0x0023, 0x23},
997
  {0x0024, 0x24},
998
  {0x0025, 0x25},
999
  {0x0026, 0x26},
1000
  {0x0027, 0x27},
1001
  {0x0028, 0x28},
1002
  {0x0029, 0x29},
1003
  {0x002a, 0x2a},
1004
  {0x002b, 0x2b},
1005
  {0x002c, 0x2c},
1006
  {0x002d, 0x2d},
1007
  {0x002e, 0x2e},
1008
  {0x002f, 0x2f},
1009
  {0x0030, 0x30},
1010
  {0x0031, 0x31},
1011
  {0x0032, 0x32},
1012
  {0x0033, 0x33},
1013
  {0x0034, 0x34},
1014
  {0x0035, 0x35},
1015
  {0x0036, 0x36},
1016
  {0x0037, 0x37},
1017
  {0x0038, 0x38},
1018
  {0x0039, 0x39},
1019
  {0x003a, 0x3a},
1020
  {0x003b, 0x3b},
1021
  {0x003c, 0x3c},
1022
  {0x003d, 0x3d},
1023
  {0x003e, 0x3e},
1024
  {0x003f, 0x3f},
1025
  {0x0040, 0x40},
1026
  {0x0041, 0x41},
1027
  {0x0042, 0x42},
1028
  {0x0043, 0x43},
1029
  {0x0044, 0x44},
1030
  {0x0045, 0x45},
1031
  {0x0046, 0x46},
1032
  {0x0047, 0x47},
1033
  {0x0048, 0x48},
1034
  {0x0049, 0x49},
1035
  {0x004a, 0x4a},
1036
  {0x004b, 0x4b},
1037
  {0x004c, 0x4c},
1038
  {0x004d, 0x4d},
1039
  {0x004e, 0x4e},
1040
  {0x004f, 0x4f},
1041
  {0x0050, 0x50},
1042
  {0x0051, 0x51},
1043
  {0x0052, 0x52},
1044
  {0x0053, 0x53},
1045
  {0x0054, 0x54},
1046
  {0x0055, 0x55},
1047
  {0x0056, 0x56},
1048
  {0x0057, 0x57},
1049
  {0x0058, 0x58},
1050
  {0x0059, 0x59},
1051
  {0x005a, 0x5a},
1052
  {0x005b, 0x5b},
1053
  {0x005c, 0x5c},
1054
  {0x005d, 0x5d},
1055
  {0x005e, 0x5e},
1056
  {0x005f, 0x5f},
1057
  {0x0060, 0x60},
1058
  {0x0061, 0x61},
1059
  {0x0062, 0x62},
1060
  {0x0063, 0x63},
1061
  {0x0064, 0x64},
1062
  {0x0065, 0x65},
1063
  {0x0066, 0x66},
1064
  {0x0067, 0x67},
1065
  {0x0068, 0x68},
1066
  {0x0069, 0x69},
1067
  {0x006a, 0x6a},
1068
  {0x006b, 0x6b},
1069
  {0x006c, 0x6c},
1070
  {0x006d, 0x6d},
1071
  {0x006e, 0x6e},
1072
  {0x006f, 0x6f},
1073
  {0x0070, 0x70},
1074
  {0x0071, 0x71},
1075
  {0x0072, 0x72},
1076
  {0x0073, 0x73},
1077
  {0x0074, 0x74},
1078
  {0x0075, 0x75},
1079
  {0x0076, 0x76},
1080
  {0x0077, 0x77},
1081
  {0x0078, 0x78},
1082
  {0x0079, 0x79},
1083
  {0x007a, 0x7a},
1084
  {0x007b, 0x7b},
1085
  {0x007c, 0x7c},
1086
  {0x007d, 0x7d},
1087
  {0x007e, 0x7e},
1088
  {0x00a0, 0x20},
1089
  {0x00a1, 0xad},
1090
  {0x00a2, 0x9b},
1091
  {0x00a3, 0x9c},
1092
  {0x00a4, 0x11},
1093
  {0x00a5, 0x9d},
1094
  {0x00a6, 0x12},
1095
  {0x00a7, 0x15},
1096
  {0x00a8, 0x16},
1097
  {0x00a9, 0x00},
1098
  {0x00aa, 0xa6},
1099
  {0x00ab, 0xae},
1100
  {0x00ac, 0xaa},
1101
  {0x00ad, 0x2d},
1102
  {0x00ae, 0x01},
1103
  {0x00af, 0x17},
1104
  {0x00b0, 0xf8},
1105
  {0x00b1, 0xf1},
1106
  {0x00b2, 0xfd},
1107
  {0x00b3, 0x1c},
1108
  {0x00b4, 0x1d},
1109
  {0x00b5, 0xe6},
1110
  {0x00b6, 0x14},
1111
  {0x00b7, 0xfa},
1112
  {0x00b8, 0x1e},
1113
  {0x00b9, 0x1f},
1114
  {0x00ba, 0xa7},
1115
  {0x00bb, 0xaf},
1116
  {0x00bc, 0xac},
1117
  {0x00bd, 0xab},
1118
  {0x00be, 0x7f},
1119
  {0x00bf, 0xa8},
1120
  {0x00c0, 0xa9},
1121
  {0x00c1, 0xb2},
1122
  {0x00c2, 0xb5},
1123
  {0x00c3, 0xb6},
1124
  {0x00c4, 0x8e},
1125
  {0x00c5, 0x8f},
1126
  {0x00c6, 0x92},
1127
  {0x00c7, 0x80},
1128
  {0x00c8, 0xb7},
1129
  {0x00c9, 0x90},
1130
  {0x00ca, 0xb8},
1131
  {0x00cb, 0xb9},
1132
  {0x00cc, 0xba},
1133
  {0x00cd, 0xbb},
1134
  {0x00ce, 0xbc},
1135
  {0x00cf, 0xbd},
1136
  {0x00d0, 0xbe},
1137
  {0x00d1, 0xa5},
1138
  {0x00d2, 0xc6},
1139
  {0x00d3, 0xc7},
1140
  {0x00d4, 0xc8},
1141
  {0x00d5, 0xc9},
1142
  {0x00d6, 0x99},
1143
  {0x00d7, 0xca},
1144
  {0x00d8, 0xcb},
1145
  {0x00d9, 0xcc},
1146
  {0x00da, 0xcd},
1147
  {0x00db, 0xcf},
1148
  {0x00dc, 0x9a},
1149
  {0x00dd, 0x02},
1150
  {0x00de, 0xd0},
1151
  {0x00df, 0xe1},
1152
  {0x00e0, 0x85},
1153
  {0x00e1, 0xa0},
1154
  {0x00e2, 0x83},
1155
  {0x00e3, 0xd1},
1156
  {0x00e4, 0x84},
1157
  {0x00e5, 0x86},
1158
  {0x00e6, 0x91},
1159
  {0x00e7, 0x87},
1160
  {0x00e8, 0x8a},
1161
  {0x00e9, 0x82},
1162
  {0x00ea, 0x88},
1163
  {0x00eb, 0x89},
1164
  {0x00ec, 0x8d},
1165
  {0x00ed, 0xa1},
1166
  {0x00ee, 0x8c},
1167
  {0x00ef, 0x8b},
1168
  {0x00f0, 0xd2},
1169
  {0x00f1, 0xa4},
1170
  {0x00f2, 0x95},
1171
  {0x00f3, 0xa2},
1172
  {0x00f4, 0x93},
1173
  {0x00f5, 0xd3},
1174
  {0x00f6, 0x94},
1175
  {0x00f7, 0xf6},
1176
  {0x00f8, 0xd4},
1177
  {0x00f9, 0x97},
1178
  {0x00fa, 0xa3},
1179
  {0x00fb, 0x96},
1180
  {0x00fc, 0x81},
1181
  {0x00fd, 0xd5},
1182
  {0x00fe, 0xd6},
1183
  {0x00ff, 0x98},
1184
  {0x0110, 0xbe},
1185
  {0x011e, 0xd7},
1186
  {0x011f, 0xdc},
1187
  {0x0130, 0xdd},
1188
  {0x0131, 0xde},
1189
  {0x0152, 0x03},
1190
  {0x0153, 0x05},
1191
  {0x015e, 0xdf},
1192
  {0x015f, 0xe0},
1193
  {0x0160, 0xe2},
1194
  {0x0161, 0xe4},
1195
  {0x0178, 0x06},
1196
  {0x017d, 0xe5},
1197
  {0x017e, 0xe7},
1198
  {0x0192, 0x9f},
1199
  {0x02c6, 0xe8},
1200
  {0x02c9, 0x17},
1201
  {0x02dc, 0xe9},
1202
  {0x0391, 0x41},
1203
  {0x0392, 0x42},
1204
  {0x0395, 0x45},
1205
  {0x0396, 0x5a},
1206
  {0x0397, 0x48},
1207
  {0x0399, 0x49},
1208
  {0x039a, 0x4b},
1209
  {0x039c, 0x4d},
1210
  {0x039d, 0x4e},
1211
  {0x039f, 0x4f},
1212
  {0x03a1, 0x50},
1213
  {0x03a4, 0x54},
1214
  {0x03a7, 0x58},
1215
  {0x03bc, 0xe6},
1216
  {0x03c0, 0xe3},
1217
  {0x0401, 0xb9},
1218
  {0x0405, 0x53},
1219
  {0x0406, 0x49},
1220
  {0x0407, 0xbd},
1221
  {0x0408, 0x4a},
1222
  {0x0410, 0x41},
1223
  {0x0412, 0x42},
1224
  {0x0415, 0x45},
1225
  {0x041a, 0x4b},
1226
  {0x041c, 0x4d},
1227
  {0x041d, 0x48},
1228
  {0x041e, 0x4f},
1229
  {0x0420, 0x50},
1230
  {0x0421, 0x43},
1231
  {0x0422, 0x54},
1232
  {0x0425, 0x58},
1233
  {0x0430, 0x61},
1234
  {0x0435, 0x65},
1235
  {0x043e, 0x6f},
1236
  {0x0440, 0x70},
1237
  {0x0441, 0x63},
1238
  {0x0443, 0x79},
1239
  {0x0445, 0x78},
1240
  {0x0451, 0x89},
1241
  {0x0455, 0x73},
1242
  {0x0456, 0x69},
1243
  {0x0457, 0x8b},
1244
  {0x0458, 0x6a},
1245
  {0x04ae, 0x59},
1246
  {0x2000, 0x20},
1247
  {0x2001, 0x20},
1248
  {0x2002, 0x20},
1249
  {0x2003, 0x20},
1250
  {0x2004, 0x20},
1251
  {0x2005, 0x20},
1252
  {0x2006, 0x20},
1253
  {0x2007, 0x20},
1254
  {0x2008, 0x20},
1255
  {0x2009, 0x20},
1256
  {0x200a, 0x20},
1257
  {0x2010, 0x2d},
1258
  {0x2011, 0x2d},
1259
  {0x2012, 0x2d},
1260
  {0x2013, 0x2d},
1261
  {0x2014, 0x07},
1262
  {0x2015, 0x07},
1263
  {0x2018, 0xea},
1264
  {0x2019, 0xeb},
1265
  {0x201a, 0xec},
1266
  {0x201c, 0xed},
1267
  {0x201d, 0xee},
1268
  {0x201e, 0xef},
1269
  {0x2020, 0x08},
1270
  {0x2021, 0x09},
1271
  {0x2022, 0x0a},
1272
  {0x2026, 0x0b},
1273
  {0x202f, 0x20},
1274
  {0x2030, 0x0c},
1275
  {0x2039, 0xf4},
1276
  {0x203a, 0xf5},
1277
  {0x203c, 0x13},
1278
  {0x207f, 0xfc},
1279
  {0x20a7, 0x9e},
1280
  {0x20ac, 0xf9},
1281
  {0x20ae, 0x0f},
1282
  {0x2116, 0x0e},
1283
  {0x2122, 0x0d},
1284
  {0x212a, 0x4b},
1285
  {0x212b, 0x8f},
1286
  {0x2190, 0x1b},
1287
  {0x2191, 0x18},
1288
  {0x2192, 0x1a},
1289
  {0x2193, 0x19},
1290
  {0x2205, 0x10},
1291
  {0x2208, 0xff},
1292
  {0x2212, 0x2d},
1293
  {0x2248, 0xf7},
1294
  {0x2260, 0xfb},
1295
  {0x2261, 0xf0},
1296
  {0x2264, 0xf3},
1297
  {0x2265, 0xf2},
1298
  {0x226a, 0xae},
1299
  {0x226b, 0xaf},
1300
  {0x2295, 0x25},
1301
  {0x2296, 0x2d},
1302
  {0x2298, 0x2f},
1303
  {0x2299, 0x2e},
1304
  {0x229b, 0x2a},
1305
  {0x229c, 0x3d},
1306
  {0x2460, 0x31},
1307
  {0x2461, 0x32},
1308
  {0x2462, 0x33},
1309
  {0x2463, 0x34},
1310
  {0x2464, 0x35},
1311
  {0x2465, 0x36},
1312
  {0x2466, 0x37},
1313
  {0x2467, 0x38},
1314
  {0x2468, 0x39},
1315
  {0x24b6, 0x41},
1316
  {0x24b7, 0x42},
1317
  {0x24b8, 0x43},
1318
  {0x24b9, 0x44},
1319
  {0x24ba, 0x45},
1320
  {0x24bb, 0x46},
1321
  {0x24bc, 0x47},
1322
  {0x24bd, 0x48},
1323
  {0x24be, 0x49},
1324
  {0x24bf, 0x4a},
1325
  {0x24c0, 0x4b},
1326
  {0x24c1, 0x4c},
1327
  {0x24c2, 0x4d},
1328
  {0x24c3, 0x4e},
1329
  {0x24c4, 0x4f},
1330
  {0x24c5, 0x50},
1331
  {0x24c6, 0x51},
1332
  {0x24c7, 0x52},
1333
  {0x24c8, 0x53},
1334
  {0x24c9, 0x54},
1335
  {0x24ca, 0x55},
1336
  {0x24cb, 0x56},
1337
  {0x24cc, 0x57},
1338
  {0x24cd, 0x58},
1339
  {0x24ce, 0x59},
1340
  {0x24cf, 0x5a},
1341
  {0x24d0, 0x61},
1342
  {0x24d1, 0x62},
1343
  {0x24d2, 0x63},
1344
  {0x24d3, 0x64},
1345
  {0x24d4, 0x65},
1346
  {0x24d5, 0x66},
1347
  {0x24d6, 0x67},
1348
  {0x24d7, 0x68},
1349
  {0x24d8, 0x69},
1350
  {0x24d9, 0x6a},
1351
  {0x24da, 0x6b},
1352
  {0x24db, 0x6c},
1353
  {0x24dc, 0x6d},
1354
  {0x24dd, 0x6e},
1355
  {0x24de, 0x6f},
1356
  {0x24df, 0x70},
1357
  {0x24e0, 0x71},
1358
  {0x24e1, 0x72},
1359
  {0x24e2, 0x73},
1360
  {0x24e3, 0x74},
1361
  {0x24e4, 0x75},
1362
  {0x24e5, 0x76},
1363
  {0x24e6, 0x77},
1364
  {0x24e7, 0x78},
1365
  {0x24e8, 0x79},
1366
  {0x24e9, 0x7a},
1367
  {0x24ea, 0x30},
1368
  {0x2500, 0xc4},
1369
  {0x2501, 0xc4},
1370
  {0x2502, 0xb3},
1371
  {0x2503, 0xb3},
1372
  {0x250c, 0xda},
1373
  {0x250d, 0xda},
1374
  {0x250e, 0xda},
1375
  {0x250f, 0xda},
1376
  {0x2510, 0xbf},
1377
  {0x2511, 0xbf},
1378
  {0x2512, 0xbf},
1379
  {0x2513, 0xbf},
1380
  {0x2514, 0xc0},
1381
  {0x2515, 0xc0},
1382
  {0x2516, 0xc0},
1383
  {0x2517, 0xc0},
1384
  {0x2518, 0xd9},
1385
  {0x2519, 0xd9},
1386
  {0x251a, 0xd9},
1387
  {0x251b, 0xd9},
1388
  {0x251c, 0xc3},
1389
  {0x251d, 0xc3},
1390
  {0x251e, 0xc3},
1391
  {0x251f, 0xc3},
1392
  {0x2520, 0xc3},
1393
  {0x2521, 0xc3},
1394
  {0x2522, 0xc3},
1395
  {0x2523, 0xc3},
1396
  {0x2524, 0xb4},
1397
  {0x2525, 0xb4},
1398
  {0x2526, 0xb4},
1399
  {0x2527, 0xb4},
1400
  {0x2528, 0xb4},
1401
  {0x2529, 0xb4},
1402
  {0x252a, 0xb4},
1403
  {0x252b, 0xb4},
1404
  {0x252c, 0xc2},
1405
  {0x252d, 0xc2},
1406
  {0x252e, 0xc2},
1407
  {0x252f, 0xc2},
1408
  {0x2530, 0xc2},
1409
  {0x2531, 0xc2},
1410
  {0x2532, 0xc2},
1411
  {0x2533, 0xc2},
1412
  {0x2534, 0xc1},
1413
  {0x2535, 0xc1},
1414
  {0x2536, 0xc1},
1415
  {0x2537, 0xc1},
1416
  {0x2538, 0xc1},
1417
  {0x2539, 0xc1},
1418
  {0x253a, 0xc1},
1419
  {0x253b, 0xc1},
1420
  {0x253c, 0xc5},
1421
  {0x253d, 0xc5},
1422
  {0x253e, 0xc5},
1423
  {0x253f, 0xc5},
1424
  {0x2540, 0xc5},
1425
  {0x2541, 0xc5},
1426
  {0x2542, 0xc5},
1427
  {0x2543, 0xc5},
1428
  {0x2544, 0xc5},
1429
  {0x2545, 0xc5},
1430
  {0x2546, 0xc5},
1431
  {0x2547, 0xc5},
1432
  {0x2548, 0xc5},
1433
  {0x2549, 0xc5},
1434
  {0x254a, 0xc5},
1435
  {0x254b, 0xc5},
1436
  {0x256a, 0xd8},
1437
  {0x256c, 0xce},
1438
  {0x2574, 0xc4},
1439
  {0x2575, 0xb3},
1440
  {0x2576, 0xc4},
1441
  {0x2577, 0xb3},
1442
  {0x2578, 0xc4},
1443
  {0x2579, 0xb3},
1444
  {0x257a, 0xc4},
1445
  {0x257b, 0xb3},
1446
  {0x257c, 0xc4},
1447
  {0x257d, 0xb3},
1448
  {0x257e, 0xc4},
1449
  {0x257f, 0xb3},
1450
  {0x2588, 0xdb},
1451
  {0x2591, 0xb0},
1452
  {0x2592, 0xb1},
1453
  {0x25a0, 0xfe},
1454
  {0x25ae, 0xfe},
1455
  {0x25b2, 0x18},
1456
  {0x25b4, 0x18},
1457
  {0x25b6, 0x1a},
1458
  {0x25b8, 0x1a},
1459
  {0x25bc, 0x19},
1460
  {0x25be, 0x19},
1461
  {0x25c0, 0x1b},
1462
  {0x25c2, 0x1b},
1463
  {0x25c8, 0x04},
1464
  {0x25cf, 0x0a},
1465
  {0x2666, 0x04},
1466
  {0xfffd, 0x04}
1467
};
1468

1469
FSystemTest::RGB FSystemTest::terminal_color[16] { };
1470

1471
FSystemTest::RGB FSystemTest::defaultColor[16]
1472
{
1473
  {0x00, 0x00, 0x00}, {0xaa, 0x00, 0x00},
1474
  {0x00, 0xaa, 0x00}, {0xaa, 0x55, 0x00},
1475
  {0x00, 0x00, 0xaa}, {0xaa, 0x00, 0xaa},
1476
  {0x00, 0xaa, 0xaa}, {0xaa, 0xaa, 0xaa},
1477
  {0x55, 0x55, 0x55}, {0xff, 0x55, 0x55},
1478
  {0x55, 0xff, 0x55}, {0xff, 0xff, 0x55},
1479
  {0x55, 0x55, 0xff}, {0xff, 0x55, 0xff},
1480
  {0x55, 0xff, 0xff}, {0xff, 0xff, 0xff}
1481
};
1482

1483

1484
// static class attributes
1485
//----------------------------------------------------------------------
1486
FSystemTest::ShiftState   FSystemTest::shift_state{};
1487
struct console_font_op    FSystemTest::terminal_font{};
1488
unimapdesc                FSystemTest::terminal_unicode_map{};
1489
struct fb_var_screeninfo  FSystemTest::fb_terminal_info{};
1490
struct fb_fix_screeninfo  FSystemTest::fb_terminal_fix_info{};
1491
bool                      FSystemTest::vga_port_access{false};
1492

1493

1494
// constructors and destructor
1495
//----------------------------------------------------------------------
1496
FSystemTest::FSystemTest()  // constructor
21✔
1497
{
1498
  // fill bit field with 0
1499
  memset (&shift_state, 0x00, sizeof(shift_state));
21✔
1500
  memset (&terminal_font, 0x00, sizeof(terminal_font));
21✔
1501
  memset (&terminal_unicode_map, 0x00, sizeof(terminal_unicode_map));
21✔
1502

1503
  static constexpr auto font_data_size = std::size_t(4 * 32 * 512);
1504
  terminal_font.data = new uChar[font_data_size]{ };
1,376,277✔
1505

1506
  // init framebuffer
1507
  initVScreenInfo();
21✔
1508
  initFScreenInfo();
21✔
1509
}
21✔
1510

1511
//----------------------------------------------------------------------
1512
FSystemTest::~FSystemTest()  // destructor
34✔
1513
{
1514
  if ( terminal_font.data )
17✔
1515
  {
1516
    delete[] terminal_font.data;
16✔
1517
    terminal_font.data = nullptr;
16✔
1518
  }
1519

1520
  if ( terminal_unicode_map.entries )
17✔
1521
  {
1522
    delete[] terminal_unicode_map.entries;
6✔
1523
    terminal_unicode_map.entries = nullptr;
6✔
1524
  }
1525
}
34✔
1526

1527

1528
// public methods of FSystemTest
1529
//----------------------------------------------------------------------
1530
auto FSystemTest::inPortByte (uShort port) noexcept -> uChar
53✔
1531
{
1532
  std::cerr << "Call: im (port=" << port << ")\n";
53✔
1533

1534
  switch ( port )
53✔
1535
  {
1536
    case 0x3c1:
14✔
1537
      if ( attribute_controller_mode == AccessMode::data )
14✔
1538
        return ac_address_register[ac_index];
14✔
1539
      break;
×
1540

1541
    case 0x3cc:
13✔
1542
      return port_3cc;
13✔
1543

1544
    case 0x3da:
26✔
1545
      attribute_controller_mode = AccessMode::index;
26✔
1546
      return port_3da;
26✔
1547
  }
1548

1549
  return 0;
×
1550
}
1551

1552
//----------------------------------------------------------------------
1553
void FSystemTest::outPortByte (uChar value, uShort port) noexcept
38✔
1554
{
1555
  std::cerr << "Call: outb (value=" << value
1556
            << ", port=" << port << ")\n";
38✔
1557

1558
  switch ( port )
38✔
1559
  {
1560
    case 0x3c0:
38✔
1561
      if ( attribute_controller_mode == AccessMode::index )
38✔
1562
      {
1563
        ac_index = value & 0x1f;
26✔
1564
        palette_addr_source_field = bool(value & 0x20);
26✔
1565
        attribute_controller_mode = AccessMode::data;
26✔
1566
      }
1567
      else
1568
      {
1569
        ac_address_register[ac_index] = value;
12✔
1570
        attribute_controller_mode = AccessMode::index;
12✔
1571
      }
1572
      break;
38✔
1573

1574
    default:
×
1575
      return;
×
1576
  }
1577
}
1578

1579
//----------------------------------------------------------------------
1580
auto FSystemTest::isTTY (int file_descriptor) const noexcept -> int
9✔
1581
{
1582
  std::cerr << "Call: isatty (file_descriptor=" << file_descriptor << ")\n";
9✔
1583
  return 1;
9✔
1584
}
1585

1586
//----------------------------------------------------------------------
1587
auto FSystemTest::ioctl (int file_descriptor, uLong request, ...) noexcept -> int
190✔
1588
{
1589
  va_list args{};
190✔
1590
  void* argp{};
190✔
1591
  std::string req_string{};
190✔
1592
  int ret_val{-1};
190✔
1593

1594
  va_start (args, request);
190✔
1595
  argp = va_arg (args, void*);
190✔
1596

1597
  switch ( request )
190✔
1598
  {
1599
    case TIOCLINUX:
88✔
1600
    {
1601
      req_string = "TIOCLINUX";
88✔
1602
      auto subcode = static_cast<char*>(argp);
88✔
1603
      auto state = reinterpret_cast<uChar*>(&shift_state);
88✔
1604

1605
      if ( *subcode == 6 )
88✔
1606
        *subcode = static_cast<char>(*state);
88✔
1607

1608
      ret_val = 0;
88✔
1609
      break;
88✔
1610
    }
1611

1612
    case KDFONTOP:
9✔
1613
    {
1614
      req_string = "KDFONTOP";
9✔
1615
      static constexpr auto font_data_size = std::size_t (4 * 32 * 512);
1616
      auto fn = static_cast<console_font_op*>(argp);
9✔
1617

1618
      if ( fn->op == KD_FONT_OP_GET )
9✔
1619
      {
1620
        // If data is empty
1621
        if ( ! terminal_font.data )
6✔
1622
        {
1623
          terminal_font.data = new uChar[font_data_size]{ };
×
1624
        }
1625

1626
        // Set Default
1627
        if ( terminal_font.data[static_cast<ptrdiff_t>(219 * 32)] == 0 )
6✔
1628
        {
1629
          terminal_font.width = 8;
6✔
1630
          terminal_font.height = 16;
6✔
1631
          terminal_font.charcount = 256;
6✔
1632

1633
          if ( fn->data )
6✔
1634
            std::memcpy (terminal_font.data, &vga8x16, sizeof(vga8x16));
6✔
1635
        }
1636

1637
        fn->flags     = terminal_font.flags;
6✔
1638
        fn->width     = terminal_font.width;
6✔
1639
        fn->height    = terminal_font.height;
6✔
1640
        fn->charcount = terminal_font.charcount;
6✔
1641

1642
        if ( fn->data && terminal_font.data )
6✔
1643
          std::memcpy (fn->data, terminal_font.data, font_data_size);
6✔
1644

1645
        terminal_font.op = KD_FONT_OP_GET;
6✔
1646
      }
1647

1648
      if ( fn->op == KD_FONT_OP_SET )
9✔
1649
      {
1650
        terminal_font.flags      = fn->flags;
3✔
1651
        terminal_font.width      = fn->width;
3✔
1652
        terminal_font.height     = fn->height;
3✔
1653
        terminal_font.charcount  = fn->charcount;
3✔
1654
        static constexpr int fix_height = 32;  // This value is identical for all fonts
1655
        auto size = fn->width / 8 * fix_height * fn->charcount;
3✔
1656

1657
        if ( ! terminal_font.data )  // If data is empty on a second run
3✔
1658
        {
1659
          try
1660
          {
1661
            terminal_font.data = new uChar[font_data_size]{ };
×
1662
          }
1663
          catch (const std::bad_alloc&)
×
1664
          {
1665
            return -1;
×
1666
          }
×
1667
        }
1668

1669
        if ( fn->data )
3✔
1670
          std::memcpy (terminal_font.data, fn->data, size);
3✔
1671

1672
        terminal_font.op = KD_FONT_OP_SET;
3✔
1673
      }
1674

1675
      ret_val = 0;
9✔
1676
      break;
9✔
1677
    }
1678

1679
    case KDGKBTYPE:
9✔
1680
    {
1681
      req_string = "KDGKBTYPE";
9✔
1682
      char* keyboard_type = static_cast<char*>(argp);
9✔
1683
      *keyboard_type = KB_101;
9✔
1684
      ret_val = 0;
9✔
1685
      break;
9✔
1686
    }
1687

1688
    case GIO_CMAP:
7✔
1689
    {
1690
      req_string = "GIO_CMAP";
7✔
1691
      auto cmap = static_cast<ColorMap*>(argp);
7✔
1692
      // Set Default
1693
      if ( terminal_color[15].red   == 0
7✔
1694
        && terminal_color[15].green == 0
6✔
1695
        && terminal_color[15].blue  == 0 )
6✔
1696
      {
1697
        for (std::size_t index = 0; index < 16; index++)
102✔
1698
        {
1699
          terminal_color[index].red   = defaultColor[index].red;
96✔
1700
          terminal_color[index].green = defaultColor[index].green;
96✔
1701
          terminal_color[index].blue  = defaultColor[index].blue;
96✔
1702
        }
1703
      }
1704

1705
      for (std::size_t index = 0; index < 16; index++)
119✔
1706
      {
1707
        cmap->color[index].red   = terminal_color[index].red;
112✔
1708
        cmap->color[index].green = terminal_color[index].green;
112✔
1709
        cmap->color[index].blue  = terminal_color[index].blue;
112✔
1710
      }
1711

1712
      ret_val = 0;
7✔
1713
      break;
7✔
1714
    }
1715

1716
    case PIO_CMAP:
24✔
1717
    {
1718
      req_string = "PIO_CMAP";
24✔
1719
      auto cmap = static_cast<ColorMap*>(argp);
24✔
1720

1721
      for (std::size_t index = 0; index < 16; index++)
408✔
1722
      {
1723
        terminal_color[index].red   = cmap->color[index].red;
384✔
1724
        terminal_color[index].green = cmap->color[index].green;
384✔
1725
        terminal_color[index].blue  = cmap->color[index].blue;
384✔
1726
      }
1727

1728
      ret_val = 0;
24✔
1729
      break;
24✔
1730
    }
1731

1732
    case GIO_UNIMAP:
12✔
1733
    {
1734
      req_string = "GIO_UNIMAP";
12✔
1735
      auto umap = static_cast<unimapdesc*>(argp);
12✔
1736
      std::size_t unipair_size = sizeof(unipair);
12✔
1737
      std::size_t pairs = ( codeset == Codeset::cp437 )
24✔
1738
                        ? sizeof(unicode_cp437_pairs) / unipair_size
12✔
1739
                        : sizeof(unicode_lat15_pairs) / unipair_size;
1740
      std::size_t pairs_size = pairs * unipair_size;
12✔
1741

1742
      // Sets the default unicode map of the terminal on the first call
1743
      if ( ! terminal_unicode_map.entries )
12✔
1744
      {
1745
        terminal_unicode_map.entry_ct = pairs;
6✔
1746
        terminal_unicode_map.entries = new unipair[pairs]();
1,825✔
1747

1748
        if ( codeset == Codeset::cp437 )
6✔
1749
          std::memcpy (terminal_unicode_map.entries, &unicode_cp437_pairs, pairs_size);
5✔
1750
        else
1751
          std::memcpy (terminal_unicode_map.entries, &unicode_lat15_pairs, pairs_size);
1✔
1752
      }
1753

1754
      umap->entry_ct = terminal_unicode_map.entry_ct;
12✔
1755

1756
      if ( umap->entries && terminal_unicode_map.entries )
12✔
1757
      {
1758
        std::memcpy (umap->entries, terminal_unicode_map.entries, pairs_size);
6✔
1759
        errno = 0;
6✔
1760
        ret_val = 0;
6✔
1761
      }
1762
      else
1763
      {
1764
        errno = ENOMEM;
6✔
1765
        ret_val = -1;
6✔
1766
      }
1767

1768
      break;
12✔
1769
    }
1770

1771
    case PIO_UNIMAP:
3✔
1772
    {
1773
      req_string = "PIO_UNIMAP";
3✔
1774
      auto umap = static_cast<unimapdesc*>(argp);
3✔
1775
      std::size_t pairs = umap->entry_ct;
3✔
1776
      terminal_unicode_map.entry_ct = umap->entry_ct;
3✔
1777

1778
      if ( terminal_unicode_map.entries )
3✔
1779
      {
1780
        delete[] terminal_unicode_map.entries;
3✔
1781
        terminal_unicode_map.entries = nullptr;
3✔
1782
      }
1783

1784
      try
1785
      {
1786
        terminal_unicode_map.entries = new unipair[pairs]();
853✔
1787
      }
1788
      catch (const std::bad_alloc&)
×
1789
      {
1790
        return -1;
×
1791
      }
×
1792

1793
      if ( umap->entries )
3✔
1794
      {
1795
        std::size_t pairs_size = pairs * sizeof(unipair);
3✔
1796
        std::memcpy (terminal_unicode_map.entries, umap->entries, pairs_size);
3✔
1797
        errno = 0;
3✔
1798
        ret_val = 0;
3✔
1799
      }
1800
      else
1801
      {
1802
        errno = ENOMEM;
×
1803
        ret_val = 0;
×
1804
      }
1805

1806
      break;
3✔
1807
    }
1808

1809
    case PIO_UNIMAPCLR:
3✔
1810
      req_string = "PIO_UNIMAPCLR";
3✔
1811
      ret_val = 0;
3✔
1812
      break;
3✔
1813

1814
    case FBIOGET_VSCREENINFO:
6✔
1815
    {
1816
      req_string = "FBIOGET_VSCREENINFO";
6✔
1817
      auto fb_var = static_cast<fb_var_screeninfo*>(argp);
6✔
1818
      std::memcpy (fb_var, &fb_terminal_info, sizeof(fb_terminal_info));
6✔
1819
      ret_val = 0;
6✔
1820
      break;
6✔
1821
    }
1822

1823
    case FBIOGET_FSCREENINFO:
6✔
1824
    {
1825
      req_string = "FBIOGET_FSCREENINFO";
6✔
1826
      auto fb_fix = static_cast<fb_fix_screeninfo*>(argp);
6✔
1827
      std::memcpy (fb_fix, &fb_terminal_fix_info, sizeof(fb_terminal_fix_info));
6✔
1828
      ret_val = 0;
6✔
1829
      break;
6✔
1830
    }
1831

1832
    case KDENABIO:
7✔
1833
    {
1834
      req_string = "KDENABIO";
7✔
1835
      vga_port_access = true;
7✔
1836
      ret_val = 0;
7✔
1837
      break;
7✔
1838
    }
1839

1840
    case KDDISABIO:
7✔
1841
    {
1842
      req_string = "KDDISABIO";
7✔
1843
      vga_port_access = false;
7✔
1844
      ret_val = 0;
7✔
1845
      break;
7✔
1846
    }
1847

1848
    case TIOCGWINSZ:
9✔
1849
    {
1850
      req_string = "TIOCGWINSZ";
9✔
1851
      auto win_size = static_cast<winsize*>(argp);
9✔
1852
      win_size->ws_col = 96;
9✔
1853
      win_size->ws_row = 36;
9✔
1854
      ret_val = 0;
9✔
1855
      break;
9✔
1856
    }
1857
  }
1858

1859
  va_end (args);
190✔
1860

1861
  std::cerr << "Call: ioctl (file_descriptor=" << file_descriptor
190✔
1862
            << ", request=" << req_string
1863
            << "(0x" << std::hex << request << ")"
190✔
1864
            << ", argp=" << argp << std::dec << ")\n";
190✔
1865
  return ret_val;
190✔
1866
}
190✔
1867

1868
//----------------------------------------------------------------------
1869
auto FSystemTest::pipe (finalcut::PipeData& pipe) noexcept -> int
×
1870
{
1871
  std::cerr << "Call: pipe (pipefd={"
×
1872
            << pipe.getReadFd() << ", "
×
1873
            << pipe.getWriteFd() << "})\n";
×
1874
  return 0;
×
1875
}
1876

1877
//----------------------------------------------------------------------
1878
auto FSystemTest::open (const char* pathname, int flags, ...) noexcept -> int
10✔
1879
{
1880
  va_list args{};
10✔
1881
  va_start (args, flags);
10✔
1882
  auto mode = static_cast<mode_t>(va_arg (args, int));
10✔
1883
  va_end (args);
10✔
1884

1885
  std::cerr << "Call: open (pathname=\"" << pathname
1886
            << "\", flags=" << flags
10✔
1887
            << ", mode=" << mode << ")\n";
10✔
1888

1889
  if ( std::memcmp(pathname, "/dev/fb0", 8) == 0
10✔
1890
    || std::memcmp(pathname, "/dev/fb/0", 9) == 0 )
10✔
1891
    return 99;  // File descriptor
6✔
1892

1893
  return 0;
4✔
1894
}
1895

1896
//----------------------------------------------------------------------
1897
auto FSystemTest::close (int file_descriptor) noexcept -> int
15✔
1898
{
1899
  std::cerr << "Call: close (file_descriptor=" << file_descriptor << ")\n";
15✔
1900
  return 0;
15✔
1901
}
1902

1903
//----------------------------------------------------------------------
1904
auto FSystemTest::fopen (const char* path, const char* mode) noexcept -> FILE*
×
1905
{
1906
  std::cerr << "Call: fopen (path=" << path
1907
            << ", mode=" << mode << ")\n";
×
1908
  return nullptr;
×
1909
}
1910

1911
//----------------------------------------------------------------------
1912
auto FSystemTest::fclose (FILE* file_ptr) noexcept -> int
×
1913
{
1914
  std::cerr << "Call: fclose (file_ptr=" << file_ptr << ")\n";
×
1915
  return 0;
×
1916
}
1917

1918
//----------------------------------------------------------------------
1919
auto FSystemTest::fputs (const char* str, FILE* stream) noexcept -> int
×
1920
{
1921
  std::cerr << "Call: fputs (" << str << ", " << stream << ")\n";
×
1922
  std::string string = str;
×
1923
  int count = 0;
×
1924

1925
  for (auto&& ch : string)
×
1926
  {
1927
    characters.push_back(ch);
×
1928
    count++;
×
1929
  }
1930

1931
  return count;
×
1932
}
×
1933

1934
//----------------------------------------------------------------------
1935
auto FSystemTest::putchar (int c) noexcept -> int
147✔
1936
{
1937
  std::cerr << "Call: putchar (" << c << ")\n";
147✔
1938
  characters.push_back(char(c));
147✔
1939
  return 1;
147✔
1940
}
1941

1942
//----------------------------------------------------------------------
1943
auto FSystemTest::putstring (const char* str, std::size_t len) noexcept -> int
×
1944
{
1945
  return std::fwrite(str, 1, len, stdout);
×
1946
}
1947

1948
//----------------------------------------------------------------------
1949
auto FSystemTest::sigaction ( int, const struct sigaction*
×
1950
                            , struct sigaction* ) noexcept -> int
1951
{
1952
  return 0;
×
1953
}
1954

1955
//----------------------------------------------------------------------
1956
auto FSystemTest::timer_create ( clockid_t, struct sigevent*
×
1957
                               , timer_t* ) noexcept -> int
1958
{
1959
  return 0;
×
1960
}
1961

1962
//----------------------------------------------------------------------
1963
auto FSystemTest::timer_settime ( timer_t, int
×
1964
                                , const struct itimerspec*
1965
                                , struct itimerspec* ) noexcept -> int
1966
{
1967
  return 0;
×
1968
}
1969

1970
//----------------------------------------------------------------------
1971
auto FSystemTest::timer_delete (timer_t) noexcept -> int
×
1972
{
1973
  return 0;
×
1974
}
1975

1976
//----------------------------------------------------------------------
1977
auto FSystemTest::kqueue() noexcept -> int
×
1978
{
1979
  return 0;
×
1980
}
1981

1982
//----------------------------------------------------------------------
1983
auto FSystemTest::kevent ( int, const struct kevent*
×
1984
                         , int, struct kevent*
1985
                         , int, const struct timespec*) noexcept -> int
1986
{
1987
  return 0;
×
1988
}
1989

1990
//----------------------------------------------------------------------
1991
auto FSystemTest::getuid() noexcept -> uid_t
12✔
1992
{
1993
  return 0;
12✔
1994
}
1995

1996
//----------------------------------------------------------------------
1997
auto FSystemTest::geteuid() noexcept -> uid_t
×
1998
{
1999
  return 0;
×
2000
}
2001

2002
//----------------------------------------------------------------------
2003
auto FSystemTest::getpwuid_r ( uid_t, struct passwd*, char*
×
2004
                            , size_t, struct passwd** ) noexcept -> int
2005
{
2006
  return 0;
×
2007
}
2008

2009
//----------------------------------------------------------------------
2010
auto FSystemTest::realpath (const char*, char*) noexcept -> char*
×
2011
{
2012
  return const_cast<char*>("");
×
2013
}
2014

2015
//----------------------------------------------------------------------
2016
auto FSystemTest::getRGB (finalcut::FColor c) noexcept -> RGB&
16✔
2017
{
2018
  auto i = std::size_t(c);
16✔
2019

2020
  if ( i < 16 )
16✔
2021
    return terminal_color[i];
16✔
2022

2023
  return terminal_color[0];
×
2024
}
2025

2026
//----------------------------------------------------------------------
2027
auto FSystemTest::getConsoleFont() noexcept -> console_font_op&
1✔
2028
{
2029
  return terminal_font;
1✔
2030
}
2031

2032
//----------------------------------------------------------------------
2033
auto FSystemTest::getShiftState() noexcept -> ShiftState&
1✔
2034
{
2035
  return shift_state;
1✔
2036
}
2037

2038
//----------------------------------------------------------------------
2039
auto FSystemTest::getCharacters() noexcept -> std::string&
2✔
2040
{
2041
  return characters;
2✔
2042
}
2043

2044
//----------------------------------------------------------------------
2045
void FSystemTest::setCodeset (Codeset cs) noexcept
5✔
2046
{
2047
  codeset = cs;
5✔
2048
}
5✔
2049

2050

2051
// private methods of FSystemTest
2052
//----------------------------------------------------------------------
2053
void FSystemTest::initVScreenInfo()
21✔
2054
{
2055
  fb_terminal_info.xres = 800;
21✔
2056
  fb_terminal_info.yres = 600;
21✔
2057
  fb_terminal_info.xres_virtual = 1176;
21✔
2058
  fb_terminal_info.yres_virtual = 885;
21✔
2059
  fb_terminal_info.xoffset = 0;
21✔
2060
  fb_terminal_info.yoffset = 0;
21✔
2061
  fb_terminal_info.bits_per_pixel = 32;
21✔
2062
  fb_terminal_info.grayscale = 0;
21✔
2063
  fb_terminal_info.red.offset = 16;
21✔
2064
  fb_terminal_info.red.length = 8;
21✔
2065
  fb_terminal_info.red.msb_right = 0;
21✔
2066
  fb_terminal_info.green.offset = 8;
21✔
2067
  fb_terminal_info.green.length = 8,
21✔
2068
  fb_terminal_info.green.msb_right = 0;
21✔
2069
  fb_terminal_info.blue.offset = 0;
21✔
2070
  fb_terminal_info.blue.length = 8;
21✔
2071
  fb_terminal_info.blue.msb_right = 0;
21✔
2072
  fb_terminal_info.transp.offset = 0;
21✔
2073
  fb_terminal_info.transp.length = 0;
21✔
2074
  fb_terminal_info.transp.msb_right = 0;
21✔
2075
  fb_terminal_info.nonstd = 0;
21✔
2076
  fb_terminal_info.activate = 0;
21✔
2077
  fb_terminal_info.height = 0xffffffff;
21✔
2078
  fb_terminal_info.width = 0xffffffff;
21✔
2079
  fb_terminal_info.accel_flags = 0;
21✔
2080
  fb_terminal_info.pixclock = 0;
21✔
2081
  fb_terminal_info.left_margin = 0;
21✔
2082
  fb_terminal_info.right_margin = 0;
21✔
2083
  fb_terminal_info.upper_margin = 0;
21✔
2084
  fb_terminal_info.lower_margin = 0;
21✔
2085
  fb_terminal_info.hsync_len = 0;
21✔
2086
  fb_terminal_info.vsync_len = 0;
21✔
2087
  fb_terminal_info.sync = 0;
21✔
2088
  fb_terminal_info.vmode = 0;
21✔
2089
  fb_terminal_info.rotate = 0;
21✔
2090
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)
2091
  fb_terminal_info.colorspace = 0;
21✔
2092
#endif
2093
  fb_terminal_info.reserved[0] = 0;
21✔
2094
  fb_terminal_info.reserved[1] = 0;
21✔
2095
  fb_terminal_info.reserved[2] = 0;
21✔
2096
  fb_terminal_info.reserved[3] = 0;
21✔
2097
}
21✔
2098

2099
//----------------------------------------------------------------------
2100
void FSystemTest::initFScreenInfo()
21✔
2101
{
2102
  char id[16] { "VESA VGA" };
21✔
2103
  std::strncpy (fb_terminal_fix_info.id, id, sizeof(fb_terminal_fix_info.id));
21✔
2104
  fb_terminal_fix_info.smem_start = 0xf9000000;
21✔
2105
  fb_terminal_fix_info.smem_len = 0x00500000;
21✔
2106
  fb_terminal_fix_info.type = 0;
21✔
2107
  fb_terminal_fix_info.type_aux = 0;
21✔
2108
  fb_terminal_fix_info.visual = 2;
21✔
2109
  fb_terminal_fix_info.xpanstep = 0;
21✔
2110
  fb_terminal_fix_info.ypanstep = 0;
21✔
2111
  fb_terminal_fix_info.ywrapstep = 0;
21✔
2112
  fb_terminal_fix_info.line_length = 5120;
21✔
2113
  fb_terminal_fix_info.mmio_start = 0;
21✔
2114
  fb_terminal_fix_info.mmio_len = 0;
21✔
2115
  fb_terminal_fix_info.accel = 0;
21✔
2116
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)
2117
  fb_terminal_fix_info.capabilities = 0;
21✔
2118
#endif
2119
  fb_terminal_fix_info.reserved[0] = 0;
21✔
2120
  fb_terminal_fix_info.reserved[1] = 0;
21✔
2121
}
21✔
2122

2123
}  // namespace test
2124

2125

2126
//----------------------------------------------------------------------
2127
// class FTermLinuxTest
2128
//----------------------------------------------------------------------
2129

2130
class FTermLinuxTest : public CPPUNIT_NS::TestFixture
2131
                     , test::ConEmu
2132
{
2133
  public:
2134
    FTermLinuxTest() = default;
42✔
2135

2136
  protected:
2137
    void classNameTest();
2138
    void linuxConsoleTest();
2139
    void linuxConsoleLat15Test();
2140
    void linuxCursorStyleTest();
2141
    void linuxColorPaletteTest();
2142
    void linuxFontTest();
2143
    void modifierKeyTest();
2144

2145
  private:
2146
    // Adds code needed to register the test suite
2147
    CPPUNIT_TEST_SUITE (FTermLinuxTest);
12✔
2148

2149
    // Add a methods to the test suite
2150
    CPPUNIT_TEST (classNameTest);
12✔
2151
    CPPUNIT_TEST (linuxConsoleTest);
12✔
2152
    CPPUNIT_TEST (linuxConsoleLat15Test);
12✔
2153
    CPPUNIT_TEST (linuxCursorStyleTest);
12✔
2154
    CPPUNIT_TEST (linuxColorPaletteTest);
12✔
2155
    CPPUNIT_TEST (linuxFontTest);
12✔
2156
    CPPUNIT_TEST (modifierKeyTest);
12✔
2157

2158
    // End of test suite definition
2159
    CPPUNIT_TEST_SUITE_END();
18✔
2160
};
2161

2162
//----------------------------------------------------------------------
2163
void FTermLinuxTest::classNameTest()
6✔
2164
{
2165
  const finalcut::FTermLinux p{};
6✔
2166
  const finalcut::FString& classname = p.getClassName();
6✔
2167
  CPPUNIT_ASSERT ( classname == "FTermLinux" );
30✔
2168
}
6✔
2169

2170
//----------------------------------------------------------------------
2171
void FTermLinuxTest::linuxConsoleTest()
6✔
2172
{
2173
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
6✔
2174
  finalcut::FTerm::setFSystem(fsys);
6✔
2175
  std::cout << "\n";
6✔
2176
  auto& data = finalcut::FTermData::getInstance();
6✔
2177

2178
  auto& encoding_list = data.getEncodingList();
6✔
2179
  encoding_list["UTF-8"] = finalcut::Encoding::UTF8;
12✔
2180
  encoding_list["UTF8"]  = finalcut::Encoding::UTF8;
12✔
2181
  encoding_list["VT100"] = finalcut::Encoding::VT100;
12✔
2182
  encoding_list["PC"]    = finalcut::Encoding::PC;
12✔
2183
  encoding_list["ASCII"] = finalcut::Encoding::ASCII;
6✔
2184

2185
  data.setTermEncoding(finalcut::Encoding::PC);
6✔
2186
  data.setBaudrate(38400);
6✔
2187
  data.setTermType("linux");
12✔
2188
  data.setTermFileName("/dev/tty2");
6✔
2189

2190
#if DEBUG
2191
  data.setFramebufferBpp(32);
6✔
2192
#endif
2193

2194
  data.supportShadowCharacter (false);
6✔
2195
  data.supportHalfBlockCharacter (false);
6✔
2196
  data.supportCursorOptimisation (true);
6✔
2197
  data.setCursorHidden (true);
6✔
2198
  data.useAlternateScreen (false);
6✔
2199
  data.setASCIIConsole (true);
6✔
2200
  data.setVT100Console (false);
6✔
2201
  data.setUTF8Console (false);
6✔
2202
  data.setUTF8 (false);
6✔
2203
  data.setNewFont (false);
6✔
2204
  data.setVGAFont (false);
6✔
2205
  data.setMonochron (false);
6✔
2206
  data.setTermResized (false);
6✔
2207
  setenv ("TERM", "linux", 1);
6✔
2208

2209
  auto& term_detection = finalcut::FTermDetection::getInstance();
6✔
2210
  finalcut::FTermcap::init();
6✔
2211
  finalcut::FTermLinux linux;
6✔
2212

2213
  // setupterm is needed for tputs in ncurses >= 6.1
2214
  setupterm (static_cast<char*>(nullptr), 1, static_cast<int*>(nullptr));
6✔
2215
  data.setTermType (finalcut::FTermType::linux_con);
6✔
2216

2217
  pid_t pid = forkConEmu();
6✔
2218

2219
  if ( isConEmuChildProcess(pid) )
6✔
2220
  {
2221
    // (gdb) set follow-fork-mode child
2222
    setenv ("TERM", "linux", 1);
1✔
2223
    setenv ("COLUMNS", "90", 1);
1✔
2224
    setenv ("LINES", "30", 1);
1✔
2225
    unsetenv("TERMCAP");
1✔
2226
    unsetenv("COLORTERM");
1✔
2227
    unsetenv("COLORFGBG");
1✔
2228
    unsetenv("VTE_VERSION");
1✔
2229
    unsetenv("XTERM_VERSION");
1✔
2230
    unsetenv("ROXTERM_ID");
1✔
2231
    unsetenv("KONSOLE_DBUS_SESSION");
1✔
2232
    unsetenv("KONSOLE_DCOP");
1✔
2233
    unsetenv("TMUX");
1✔
2234

2235
    term_detection.detect();
1✔
2236
    linux.init();
1✔
2237

2238
    CPPUNIT_ASSERT ( ::isatty(3) == 0 );
6✔
2239
    CPPUNIT_ASSERT ( data.isTermType(finalcut::FTermType::linux_con) );
6✔
2240
    CPPUNIT_ASSERT ( data.getTerminalGeometry().getWidth() == 96 );
6✔
2241
    CPPUNIT_ASSERT ( data.getTerminalGeometry().getHeight() == 36 );
6✔
2242
    CPPUNIT_ASSERT ( data.hasShadowCharacter() );
6✔
2243
    CPPUNIT_ASSERT ( data.hasHalfBlockCharacter() );
6✔
2244
    CPPUNIT_ASSERT ( linux.getFramebufferBpp() == 32 );
5✔
2245

2246
    const auto& fsystem = finalcut::FSystem::getInstance();
1✔
2247
    auto fsystest = static_cast<test::FSystemTest*>(fsystem.get());
1✔
2248
    std::string& characters = fsystest->getCharacters();
1✔
2249
    linux.setUTF8 (false);
1✔
2250

2251
    CPPUNIT_ASSERT ( characters == ESC "%@" );
5✔
2252
    characters.clear();
1✔
2253

2254
    linux.setUTF8 (true);
1✔
2255
    CPPUNIT_ASSERT ( characters == ESC "%G" );
5✔
2256
    characters.clear();
1✔
2257

2258
    linux.setBeep (20, 100);     // Hz < 21
1✔
2259
    CPPUNIT_ASSERT ( characters.empty() );
5✔
2260
    linux.setBeep (32767, 100);  // Hz > 32766
1✔
2261
    CPPUNIT_ASSERT ( characters.empty() );
5✔
2262
    linux.setBeep (200, -1);     // ms < 0
1✔
2263
    CPPUNIT_ASSERT ( characters.empty() );
5✔
2264
    linux.setBeep (200, 2000);   // ms > 1999
1✔
2265
    CPPUNIT_ASSERT ( characters.empty() );
5✔
2266
    linux.setBeep (200, 100);    // 200 Hz - 100 ms
1✔
2267
    CPPUNIT_ASSERT ( characters == CSI "10;200]" CSI "11;100]" );
5✔
2268
    characters.clear();
1✔
2269

2270
    linux.resetBeep();
1✔
2271
    CPPUNIT_ASSERT ( characters == CSI "10;750]" CSI "11;125]" );
5✔
2272
    characters.clear();
1✔
2273

2274
    linux.initCharMap();
1✔
2275
    auto& character_map = data.getCharSubstitutionMap();
1✔
2276
    CPPUNIT_ASSERT ( ! character_map.isEmpty() );
6✔
2277
    CPPUNIT_ASSERT ( character_map.getMappedChar(wchar_t(finalcut::UniChar::BlackCircle)) == L'*' );
6✔
2278
    CPPUNIT_ASSERT ( character_map.getMappedChar(wchar_t(finalcut::UniChar::Times)) == L'x' );
6✔
2279
    CPPUNIT_ASSERT ( character_map.getMappedChar(L'ˣ') == L'ⁿ' );
5✔
2280
    linux.finish();
1✔
2281

2282
    closeConEmuStdStreams();
1✔
2283
    exit(EXIT_SUCCESS);
1✔
2284
  }
2285
  else  // Parent
2286
  {
2287
    // Start the terminal emulation
2288
    startConEmuTerminal (ConEmu::console::linux_con);
5✔
2289
    int wstatus;
2290

2291
    if ( waitpid(pid, &wstatus, WUNTRACED) != pid )
5✔
2292
      std::cerr << "waitpid error" << std::endl;
×
2293

2294
    if ( WIFEXITED(wstatus) )
5✔
2295
      CPPUNIT_ASSERT ( WEXITSTATUS(wstatus) == 0 );
30✔
2296
  }
2297
}
5✔
2298

2299
//----------------------------------------------------------------------
2300
void FTermLinuxTest::linuxConsoleLat15Test()
5✔
2301
{
2302
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
5✔
2303
  auto fsystest = static_cast<test::FSystemTest*>(fsys.get());
5✔
2304
  fsystest->setCodeset(test::FSystemTest::Codeset::lat15);
5✔
2305
  finalcut::FTerm::setFSystem(fsys);
5✔
2306
  std::cout << "\n";
5✔
2307
  auto& data = finalcut::FTermData::getInstance();
5✔
2308

2309
  auto& encoding_list = data.getEncodingList();
5✔
2310
  encoding_list["UTF-8"] = finalcut::Encoding::UTF8;
10✔
2311
  encoding_list["UTF8"]  = finalcut::Encoding::UTF8;
10✔
2312
  encoding_list["VT100"] = finalcut::Encoding::VT100;
10✔
2313
  encoding_list["PC"]    = finalcut::Encoding::PC;
10✔
2314
  encoding_list["ASCII"] = finalcut::Encoding::ASCII;
5✔
2315

2316
  data.setTermEncoding(finalcut::Encoding::PC);
5✔
2317
  data.setBaudrate(38400);
5✔
2318
  data.setTermType("linux");
10✔
2319
  data.setTermFileName("/dev/tty3");
5✔
2320
  data.setTTYFileDescriptor(0);
5✔
2321

2322
#if DEBUG
2323
  data.setFramebufferBpp(32);
5✔
2324
#endif
2325

2326
  data.supportShadowCharacter (true);
5✔
2327
  data.supportHalfBlockCharacter (true);
5✔
2328
  data.supportCursorOptimisation (true);
5✔
2329
  data.setCursorHidden (true);
5✔
2330
  data.useAlternateScreen (false);
5✔
2331
  data.setASCIIConsole (true);
5✔
2332
  data.setVT100Console (false);
5✔
2333
  data.setUTF8Console (false);
5✔
2334
  data.setUTF8 (false);
5✔
2335
  data.setNewFont (false);
5✔
2336
  data.setVGAFont (false);
5✔
2337
  data.setMonochron (false);
5✔
2338
  data.setTermResized (false);
5✔
2339

2340
  auto& term_detection = finalcut::FTermDetection::getInstance();
5✔
2341
  finalcut::FTermLinux linux;
5✔
2342

2343
  // setupterm is needed for tputs in ncurses >= 6.1
2344
  setupterm (static_cast<char*>(nullptr), 1, static_cast<int*>(nullptr));
5✔
2345
  data.setTermType (finalcut::FTermType::linux_con);
5✔
2346

2347
  pid_t pid = forkConEmu();
5✔
2348

2349
  if ( isConEmuChildProcess(pid) )
5✔
2350
  {
2351
    // (gdb) set follow-fork-mode child
2352
    setenv ("TERM", "linux", 1);
1✔
2353
    setenv ("COLUMNS", "90", 1);
1✔
2354
    setenv ("LINES", "30", 1);
1✔
2355
    unsetenv("TERMCAP");
1✔
2356
    unsetenv("COLORTERM");
1✔
2357
    unsetenv("COLORFGBG");
1✔
2358
    unsetenv("VTE_VERSION");
1✔
2359
    unsetenv("XTERM_VERSION");
1✔
2360
    unsetenv("ROXTERM_ID");
1✔
2361
    unsetenv("KONSOLE_DBUS_SESSION");
1✔
2362
    unsetenv("KONSOLE_DCOP");
1✔
2363
    unsetenv("TMUX");
1✔
2364

2365
    term_detection.detect();
1✔
2366

2367
    linux.init();
1✔
2368
    linux.initCharMap();
1✔
2369
    CPPUNIT_ASSERT ( data.isTermType(finalcut::FTermType::linux_con) );
6✔
2370
    CPPUNIT_ASSERT ( ! data.hasShadowCharacter() );
6✔
2371
    CPPUNIT_ASSERT ( ! data.hasHalfBlockCharacter() );
5✔
2372
    auto& character_map = data.getCharSubstitutionMap();
1✔
2373
    CPPUNIT_ASSERT ( ! character_map.isEmpty() );
6✔
2374
    CPPUNIT_ASSERT ( character_map.getMappedChar(wchar_t(finalcut::UniChar::SquareRoot)) == L'x' );
6✔
2375
    CPPUNIT_ASSERT ( character_map.getMappedChar(wchar_t(finalcut::UniChar::BlackLeftPointingPointer)) == L'◀' );
6✔
2376
    CPPUNIT_ASSERT ( character_map.getMappedChar(wchar_t(finalcut::UniChar::BlackRightPointingPointer)) == L'▶' );
6✔
2377
    CPPUNIT_ASSERT ( character_map.getMappedChar(L'ˣ') == L'ⁿ' );
5✔
2378
    linux.finish();
1✔
2379

2380
    closeConEmuStdStreams();
1✔
2381
    exit(EXIT_SUCCESS);
1✔
2382
  }
2383
  else  // Parent
2384
  {
2385
    // Start the terminal emulation
2386
    startConEmuTerminal (ConEmu::console::linux_con);
4✔
2387
    int wstatus;
2388

2389
    if ( waitpid(pid, &wstatus, WUNTRACED) != pid )
4✔
2390
      std::cerr << "waitpid error" << std::endl;
×
2391

2392
    if ( WIFEXITED(wstatus) )
4✔
2393
      CPPUNIT_ASSERT ( WEXITSTATUS(wstatus) == 0 );
24✔
2394
  }
2395
}
4✔
2396

2397
//----------------------------------------------------------------------
2398
void FTermLinuxTest::linuxCursorStyleTest()
4✔
2399
{
2400
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
4✔
2401
  finalcut::FTerm::setFSystem(fsys);
4✔
2402
  std::cout << "\n";
4✔
2403
  auto& data = finalcut::FTermData::getInstance();
4✔
2404

2405
  auto& encoding_list = data.getEncodingList();
4✔
2406
  encoding_list["UTF-8"] = finalcut::Encoding::UTF8;
8✔
2407
  encoding_list["UTF8"]  = finalcut::Encoding::UTF8;
8✔
2408
  encoding_list["VT100"] = finalcut::Encoding::VT100;
8✔
2409
  encoding_list["PC"]    = finalcut::Encoding::PC;
8✔
2410
  encoding_list["ASCII"] = finalcut::Encoding::ASCII;
4✔
2411

2412
  data.setTermEncoding(finalcut::Encoding::PC);
4✔
2413
  data.setBaudrate(38400);
4✔
2414
  data.setTermType("linux");
8✔
2415
  data.setTermFileName("/dev/tty2");
4✔
2416

2417
#if DEBUG
2418
  data.setFramebufferBpp(32);
4✔
2419
#endif
2420

2421
  data.supportShadowCharacter (false);
4✔
2422
  data.supportHalfBlockCharacter (false);
4✔
2423
  data.supportCursorOptimisation (true);
4✔
2424
  data.setCursorHidden (false);
4✔
2425
  data.useAlternateScreen (false);
4✔
2426
  data.setASCIIConsole (true);
4✔
2427
  data.setVT100Console (false);
4✔
2428
  data.setUTF8Console (false);
4✔
2429
  data.setUTF8 (false);
4✔
2430
  data.setNewFont (false);
4✔
2431
  data.setVGAFont (false);
4✔
2432
  data.setMonochron (false);
4✔
2433
  data.setTermResized (false);
4✔
2434

2435
  // setupterm is needed for tputs in ncurses >= 6.1
2436
  setupterm (static_cast<char*>(nullptr), 1, static_cast<int*>(nullptr));
4✔
2437
  auto& term_detection = finalcut::FTermDetection::getInstance();
4✔
2438
  finalcut::FTermcap::init();
4✔
2439
  finalcut::FTermLinux linux;
4✔
2440

2441
  pid_t pid = forkConEmu();
4✔
2442

2443
  if ( isConEmuChildProcess(pid) )
4✔
2444
  {
2445
    // (gdb) set follow-fork-mode child
2446
    setenv ("TERM", "linux", 1);
1✔
2447
    setenv ("COLUMNS", "90", 1);
1✔
2448
    setenv ("LINES", "30", 1);
1✔
2449
    unsetenv("TERMCAP");
1✔
2450
    unsetenv("COLORTERM");
1✔
2451
    unsetenv("COLORFGBG");
1✔
2452
    unsetenv("VTE_VERSION");
1✔
2453
    unsetenv("XTERM_VERSION");
1✔
2454
    unsetenv("ROXTERM_ID");
1✔
2455
    unsetenv("KONSOLE_DBUS_SESSION");
1✔
2456
    unsetenv("KONSOLE_DCOP");
1✔
2457
    unsetenv("TMUX");
1✔
2458

2459
    term_detection.detect();
1✔
2460
    linux.init();
1✔
2461

2462
    const auto& fsystem = finalcut::FSystem::getInstance();
1✔
2463
    auto fsystest = static_cast<test::FSystemTest*>(fsystem.get());
1✔
2464
    std::string& characters = fsystest->getCharacters();
1✔
2465
    characters.clear();
1✔
2466
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Default);
1✔
2467
    CPPUNIT_ASSERT ( characters == CSI "?0c" );
6✔
2468
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Default );
6✔
2469
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
1✔
2470
    characters.clear();
1✔
2471
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Invisible);
1✔
2472
    CPPUNIT_ASSERT ( characters == CSI "?1c" );
6✔
2473
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Invisible );
6✔
2474
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?1c" );
1✔
2475
    characters.clear();
1✔
2476
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Underscore);
1✔
2477
    CPPUNIT_ASSERT ( characters == CSI "?2c" );
6✔
2478
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?2c" );
2✔
2479
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Underscore );
5✔
2480
    characters.clear();
1✔
2481
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::LowerThird);
1✔
2482
    CPPUNIT_ASSERT ( characters == CSI "?3c" );
6✔
2483
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?3c" );
2✔
2484
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::LowerThird );
5✔
2485
    characters.clear();
1✔
2486
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::LowerHalf);
1✔
2487
    CPPUNIT_ASSERT ( characters == CSI "?4c" );
6✔
2488
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?4c" );
2✔
2489
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::LowerHalf );
5✔
2490
    characters.clear();
1✔
2491
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::TwoThirds);
1✔
2492
    CPPUNIT_ASSERT ( characters == CSI "?5c" );
6✔
2493
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?5c" );
2✔
2494
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::TwoThirds );
5✔
2495
    characters.clear();
1✔
2496
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::FullBlock);
1✔
2497
    CPPUNIT_ASSERT ( characters == CSI "?6c" );
6✔
2498
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?6c" );
2✔
2499
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::FullBlock );
5✔
2500
    characters.clear();
1✔
2501

2502
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Default);
1✔
2503
    CPPUNIT_ASSERT ( characters == CSI "?0c" );
6✔
2504
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
2✔
2505
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Default );
5✔
2506
    characters.clear();
1✔
2507
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2508
    CPPUNIT_ASSERT ( characters == CSI "?0c" );
6✔
2509
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
2✔
2510
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Default );
5✔
2511
    characters.clear();
1✔
2512
    data.setCursorHidden (true);
1✔
2513
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Invisible);
1✔
2514
    data.setCursorHidden (false);
1✔
2515
    CPPUNIT_ASSERT ( characters == "" );
6✔
2516
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Invisible );
5✔
2517
    characters.clear();
1✔
2518
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2519
    CPPUNIT_ASSERT ( characters == CSI "?1c" );
6✔
2520
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?1c" );
1✔
2521
    characters.clear();
1✔
2522
    data.setCursorHidden (true);
1✔
2523
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::Underscore);
1✔
2524
    data.setCursorHidden (false);
1✔
2525
    CPPUNIT_ASSERT ( characters == "" );
6✔
2526
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::Underscore );
5✔
2527
    characters.clear();
1✔
2528
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2529
    CPPUNIT_ASSERT ( characters == CSI "?2c" );
6✔
2530
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?2c" );
1✔
2531
    characters.clear();
1✔
2532
    data.setCursorHidden (true);
1✔
2533
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::LowerThird);
1✔
2534
    data.setCursorHidden (false);
1✔
2535
    CPPUNIT_ASSERT ( characters == "" );
6✔
2536
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::LowerThird );
5✔
2537
    characters.clear();
1✔
2538
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2539
    CPPUNIT_ASSERT ( characters == CSI "?3c" );
6✔
2540
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?3c" );
1✔
2541
    characters.clear();
1✔
2542
    data.setCursorHidden (true);
1✔
2543
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::LowerHalf);
1✔
2544
    data.setCursorHidden (false);
1✔
2545
    CPPUNIT_ASSERT ( characters == "" );
6✔
2546
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::LowerHalf );
5✔
2547
    characters.clear();
1✔
2548
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2549
    CPPUNIT_ASSERT ( characters == CSI "?4c" );
6✔
2550
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?4c" );
1✔
2551
    characters.clear();
1✔
2552
    data.setCursorHidden (true);
1✔
2553
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::TwoThirds);
1✔
2554
    data.setCursorHidden (false);
1✔
2555
    CPPUNIT_ASSERT ( characters == "" );
6✔
2556
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::TwoThirds );
5✔
2557
    characters.clear();
1✔
2558
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2559
    CPPUNIT_ASSERT ( characters == CSI "?5c" );
6✔
2560
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?5c" );
1✔
2561
    characters.clear();
1✔
2562
    data.setCursorHidden (true);
1✔
2563
    linux.setCursorStyle (finalcut::LinuxConsoleCursorStyle::FullBlock);
1✔
2564
    data.setCursorHidden (false);
1✔
2565
    CPPUNIT_ASSERT ( characters == "" );
6✔
2566
    CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::LinuxConsoleCursorStyle::FullBlock );
5✔
2567
    characters.clear();
1✔
2568
    linux.setCursorStyle (linux.getCursorStyle());
1✔
2569
    CPPUNIT_ASSERT ( characters == CSI "?6c" );
6✔
2570
    CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?6c" );
1✔
2571
    characters.clear();
1✔
2572

2573
    linux.finish();
1✔
2574

2575
    closeConEmuStdStreams();
1✔
2576
    exit(EXIT_SUCCESS);
1✔
2577
  }
2578
  else  // Parent
2579
  {
2580
    // Start the terminal emulation
2581
    startConEmuTerminal (ConEmu::console::linux_con);
3✔
2582
    int wstatus;
2583

2584
    if ( waitpid(pid, &wstatus, WUNTRACED) != pid )
3✔
2585
      std::cerr << "waitpid error" << std::endl;
×
2586

2587
    if ( WIFEXITED(wstatus) )
3✔
2588
      CPPUNIT_ASSERT ( WEXITSTATUS(wstatus) == 0 );
18✔
2589
  }
2590
}
3✔
2591

2592
//----------------------------------------------------------------------
2593
void FTermLinuxTest::linuxColorPaletteTest()
3✔
2594
{
2595
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
3✔
2596
  finalcut::FTerm::setFSystem(fsys);
3✔
2597
  std::cout << "\n";
3✔
2598
  auto& data = finalcut::FTermData::getInstance();
3✔
2599

2600
  auto& encoding_list = data.getEncodingList();
3✔
2601
  encoding_list["UTF-8"] = finalcut::Encoding::UTF8;
6✔
2602
  encoding_list["UTF8"]  = finalcut::Encoding::UTF8;
6✔
2603
  encoding_list["VT100"] = finalcut::Encoding::VT100;
6✔
2604
  encoding_list["PC"]    = finalcut::Encoding::PC;
6✔
2605
  encoding_list["ASCII"] = finalcut::Encoding::ASCII;
3✔
2606

2607
  data.setTermEncoding(finalcut::Encoding::PC);
3✔
2608
  data.setBaudrate(38400);
3✔
2609
  data.setTermType("linux");
6✔
2610
  data.setTermFileName("/dev/tty2");
3✔
2611

2612
#if DEBUG
2613
  data.setFramebufferBpp(32);
3✔
2614
#endif
2615

2616
  data.supportShadowCharacter (false);
3✔
2617
  data.supportHalfBlockCharacter (false);
3✔
2618
  data.supportCursorOptimisation (true);
3✔
2619
  data.setCursorHidden (true);
3✔
2620
  data.useAlternateScreen (false);
3✔
2621
  data.setASCIIConsole (true);
3✔
2622
  data.setVT100Console (false);
3✔
2623
  data.setUTF8Console (false);
3✔
2624
  data.setUTF8 (false);
3✔
2625
  data.setNewFont (false);
3✔
2626
  data.setVGAFont (false);
3✔
2627
  data.setMonochron (false);
3✔
2628
  data.setTermResized (false);
3✔
2629

2630
  // setupterm is needed for tputs in ncurses >= 6.1
2631
  setupterm (static_cast<char*>(nullptr), 1, static_cast<int*>(nullptr));
3✔
2632
  auto& term_detection = finalcut::FTermDetection::getInstance();
3✔
2633
  finalcut::FTermLinux linux;
3✔
2634
  data.setTermType (finalcut::FTermType::linux_con);
3✔
2635

2636
  pid_t pid = forkConEmu();
3✔
2637

2638
  if ( isConEmuChildProcess(pid) )
3✔
2639
  {
2640
    // (gdb) set follow-fork-mode child
2641
    setenv ("TERM", "linux", 1);
1✔
2642
    setenv ("COLUMNS", "90", 1);
1✔
2643
    setenv ("LINES", "30", 1);
1✔
2644
    unsetenv("TERMCAP");
1✔
2645
    unsetenv("COLORTERM");
1✔
2646
    unsetenv("COLORFGBG");
1✔
2647
    unsetenv("VTE_VERSION");
1✔
2648
    unsetenv("XTERM_VERSION");
1✔
2649
    unsetenv("ROXTERM_ID");
1✔
2650
    unsetenv("KONSOLE_DBUS_SESSION");
1✔
2651
    unsetenv("KONSOLE_DCOP");
1✔
2652
    unsetenv("TMUX");
1✔
2653

2654
    term_detection.detect();
1✔
2655
    linux.init();
1✔
2656
    const auto& fsystem = finalcut::FSystem::getInstance();
1✔
2657
    auto fsystest = static_cast<test::FSystemTest*>(fsystem.get());
1✔
2658

2659
    CPPUNIT_ASSERT ( linux.resetColorMap() == true );
6✔
2660
    CPPUNIT_ASSERT ( linux.saveColorMap() == true );
5✔
2661
    finalcut::FColor index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Black);
1✔
2662
    test::FSystemTest::RGB& RGB0 = fsystest->getRGB(index);
1✔
2663
    CPPUNIT_ASSERT ( RGB0.red   == 0x00 );
6✔
2664
    CPPUNIT_ASSERT ( RGB0.green == 0x00 );
6✔
2665
    CPPUNIT_ASSERT ( RGB0.blue  == 0x00 );
6✔
2666
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x01, 0x02, 0x03) );
6✔
2667
    CPPUNIT_ASSERT ( RGB0.red   == 0x01 );
6✔
2668
    CPPUNIT_ASSERT ( RGB0.green == 0x02 );
6✔
2669
    CPPUNIT_ASSERT ( RGB0.blue  == 0x03 );
5✔
2670

2671
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Blue);
1✔
2672
    test::FSystemTest::RGB& RGB1 = fsystest->getRGB(index);
1✔
2673
    CPPUNIT_ASSERT ( RGB1.red   == 0x00 );
6✔
2674
    CPPUNIT_ASSERT ( RGB1.green == 0x00 );
6✔
2675
    CPPUNIT_ASSERT ( RGB1.blue  == 0xaa );
6✔
2676
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x04, 0x05, 0x06) );
6✔
2677
    CPPUNIT_ASSERT ( RGB1.red   == 0x04 );
6✔
2678
    CPPUNIT_ASSERT ( RGB1.green == 0x05 );
6✔
2679
    CPPUNIT_ASSERT ( RGB1.blue  == 0x06 );
5✔
2680

2681
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Green);
1✔
2682
    test::FSystemTest::RGB& RGB2 = fsystest->getRGB(index);
1✔
2683
    CPPUNIT_ASSERT ( RGB2.red   == 0x00 );
6✔
2684
    CPPUNIT_ASSERT ( RGB2.green == 0xaa );
6✔
2685
    CPPUNIT_ASSERT ( RGB2.blue  == 0x00 );
6✔
2686
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x07, 0x08, 0x09) );
6✔
2687
    CPPUNIT_ASSERT ( RGB2.red   == 0x07 );
6✔
2688
    CPPUNIT_ASSERT ( RGB2.green == 0x08 );
6✔
2689
    CPPUNIT_ASSERT ( RGB2.blue  == 0x09 );
5✔
2690

2691
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Cyan);
1✔
2692
    test::FSystemTest::RGB& RGB3 = fsystest->getRGB(index);
1✔
2693
    CPPUNIT_ASSERT ( RGB3.red   == 0x00 );
6✔
2694
    CPPUNIT_ASSERT ( RGB3.green == 0xaa );
6✔
2695
    CPPUNIT_ASSERT ( RGB3.blue  == 0xaa );
6✔
2696
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x0a, 0x0b, 0x0c) );
6✔
2697
    CPPUNIT_ASSERT ( RGB3.red   == 0x0a );
6✔
2698
    CPPUNIT_ASSERT ( RGB3.green == 0x0b );
6✔
2699
    CPPUNIT_ASSERT ( RGB3.blue  == 0x0c );
5✔
2700

2701
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Red);
1✔
2702
    test::FSystemTest::RGB& RGB4 = fsystest->getRGB(index);
1✔
2703
    CPPUNIT_ASSERT ( RGB4.red   == 0xaa );
6✔
2704
    CPPUNIT_ASSERT ( RGB4.green == 0x00 );
6✔
2705
    CPPUNIT_ASSERT ( RGB4.blue  == 0x00 );
6✔
2706
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x0d, 0x0e, 0x0f) );
6✔
2707
    CPPUNIT_ASSERT ( RGB4.red   == 0x0d );
6✔
2708
    CPPUNIT_ASSERT ( RGB4.green == 0x0e );
6✔
2709
    CPPUNIT_ASSERT ( RGB4.blue  == 0x0f );
5✔
2710

2711
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Magenta);
1✔
2712
    test::FSystemTest::RGB& RGB5 = fsystest->getRGB(index);
1✔
2713
    CPPUNIT_ASSERT ( RGB5.red   == 0xaa );
6✔
2714
    CPPUNIT_ASSERT ( RGB5.green == 0x00 );
6✔
2715
    CPPUNIT_ASSERT ( RGB5.blue  == 0xaa );
6✔
2716
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x10, 0x11, 0x12) );
6✔
2717
    CPPUNIT_ASSERT ( RGB5.red   == 0x10 );
6✔
2718
    CPPUNIT_ASSERT ( RGB5.green == 0x11 );
6✔
2719
    CPPUNIT_ASSERT ( RGB5.blue  == 0x12 );
5✔
2720

2721
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Brown);
1✔
2722
    test::FSystemTest::RGB& RGB6 = fsystest->getRGB(index);
1✔
2723
    CPPUNIT_ASSERT ( RGB6.red   == 0xaa );
6✔
2724
    CPPUNIT_ASSERT ( RGB6.green == 0x55 );
6✔
2725
    CPPUNIT_ASSERT ( RGB6.blue  == 0x00 );
6✔
2726
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x13, 0x14, 0x15) );
6✔
2727
    CPPUNIT_ASSERT ( RGB6.red   == 0x13 );
6✔
2728
    CPPUNIT_ASSERT ( RGB6.green == 0x14 );
6✔
2729
    CPPUNIT_ASSERT ( RGB6.blue  == 0x15 );
5✔
2730

2731
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightGray);
1✔
2732
    test::FSystemTest::RGB& RGB7 = fsystest->getRGB(index);
1✔
2733
    CPPUNIT_ASSERT ( RGB7.red   == 0xaa );
6✔
2734
    CPPUNIT_ASSERT ( RGB7.green == 0xaa );
6✔
2735
    CPPUNIT_ASSERT ( RGB7.blue  == 0xaa );
6✔
2736
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x16, 0x17, 0x18) );
6✔
2737
    CPPUNIT_ASSERT ( RGB7.red   == 0x16 );
6✔
2738
    CPPUNIT_ASSERT ( RGB7.green == 0x17 );
6✔
2739
    CPPUNIT_ASSERT ( RGB7.blue  == 0x18 );
5✔
2740

2741
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::DarkGray);
1✔
2742
    test::FSystemTest::RGB& RGB8 = fsystest->getRGB(index);
1✔
2743
    CPPUNIT_ASSERT ( RGB8.red   == 0x55 );
6✔
2744
    CPPUNIT_ASSERT ( RGB8.green == 0x55 );
6✔
2745
    CPPUNIT_ASSERT ( RGB8.blue  == 0x55 );
6✔
2746
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x19, 0x20, 0x21) );
6✔
2747
    CPPUNIT_ASSERT ( RGB8.red   == 0x19 );
6✔
2748
    CPPUNIT_ASSERT ( RGB8.green == 0x20 );
6✔
2749
    CPPUNIT_ASSERT ( RGB8.blue  == 0x21 );
5✔
2750

2751
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightBlue);
1✔
2752
    test::FSystemTest::RGB& RGB9 = fsystest->getRGB(index);
1✔
2753
    CPPUNIT_ASSERT ( RGB9.red   == 0x55 );
6✔
2754
    CPPUNIT_ASSERT ( RGB9.green == 0x55 );
6✔
2755
    CPPUNIT_ASSERT ( RGB9.blue  == 0xff );
6✔
2756
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x22, 0x23, 0x24) );
6✔
2757
    CPPUNIT_ASSERT ( RGB9.red   == 0x22 );
6✔
2758
    CPPUNIT_ASSERT ( RGB9.green == 0x23 );
6✔
2759
    CPPUNIT_ASSERT ( RGB9.blue  == 0x24 );
5✔
2760

2761
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightGreen);
1✔
2762
    test::FSystemTest::RGB& RGB10 = fsystest->getRGB(index);
1✔
2763
    CPPUNIT_ASSERT ( RGB10.red   == 0x55 );
6✔
2764
    CPPUNIT_ASSERT ( RGB10.green == 0xff );
6✔
2765
    CPPUNIT_ASSERT ( RGB10.blue  == 0x55 );
6✔
2766
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x25, 0x26, 0x27) );
6✔
2767
    CPPUNIT_ASSERT ( RGB10.red   == 0x25 );
6✔
2768
    CPPUNIT_ASSERT ( RGB10.green == 0x26 );
6✔
2769
    CPPUNIT_ASSERT ( RGB10.blue  == 0x27 );
5✔
2770

2771
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightCyan);
1✔
2772
    test::FSystemTest::RGB& RGB11 = fsystest->getRGB(index);
1✔
2773
    CPPUNIT_ASSERT ( RGB11.red   == 0x55 );
6✔
2774
    CPPUNIT_ASSERT ( RGB11.green == 0xff );
6✔
2775
    CPPUNIT_ASSERT ( RGB11.blue  == 0xff );
6✔
2776
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x28, 0x29, 0x30) );
6✔
2777
    CPPUNIT_ASSERT ( RGB11.red   == 0x28 );
6✔
2778
    CPPUNIT_ASSERT ( RGB11.green == 0x29 );
6✔
2779
    CPPUNIT_ASSERT ( RGB11.blue  == 0x30 );
5✔
2780

2781
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightRed);
1✔
2782
    test::FSystemTest::RGB& RGB12 = fsystest->getRGB(index);
1✔
2783
    CPPUNIT_ASSERT ( RGB12.red   == 0xff );
6✔
2784
    CPPUNIT_ASSERT ( RGB12.green == 0x55 );
6✔
2785
    CPPUNIT_ASSERT ( RGB12.blue  == 0x55 );
6✔
2786
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x31, 0x32, 0x33) );
6✔
2787
    CPPUNIT_ASSERT ( RGB12.red   == 0x31 );
6✔
2788
    CPPUNIT_ASSERT ( RGB12.green == 0x32 );
6✔
2789
    CPPUNIT_ASSERT ( RGB12.blue  == 0x33 );
5✔
2790

2791
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::LightMagenta);
1✔
2792
    test::FSystemTest::RGB& RGB13 = fsystest->getRGB(index);
1✔
2793
    CPPUNIT_ASSERT ( RGB13.red   == 0xff );
6✔
2794
    CPPUNIT_ASSERT ( RGB13.green == 0x55 );
6✔
2795
    CPPUNIT_ASSERT ( RGB13.blue  == 0xff );
6✔
2796
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x34, 0x35, 0x36) );
6✔
2797
    CPPUNIT_ASSERT ( RGB13.red   == 0x34 );
6✔
2798
    CPPUNIT_ASSERT ( RGB13.green == 0x35 );
6✔
2799
    CPPUNIT_ASSERT ( RGB13.blue  == 0x36 );
5✔
2800

2801
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::Yellow);
1✔
2802
    test::FSystemTest::RGB& RGB14 = fsystest->getRGB(index);
1✔
2803
    CPPUNIT_ASSERT ( RGB14.red   == 0xff );
6✔
2804
    CPPUNIT_ASSERT ( RGB14.green == 0xff );
6✔
2805
    CPPUNIT_ASSERT ( RGB14.blue  == 0x55 );
6✔
2806
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x37, 0x38, 0x39) );
6✔
2807
    CPPUNIT_ASSERT ( RGB14.red   == 0x37 );
6✔
2808
    CPPUNIT_ASSERT ( RGB14.green == 0x38 );
6✔
2809
    CPPUNIT_ASSERT ( RGB14.blue  == 0x39 );
5✔
2810

2811
    index = finalcut::FOptiAttr::vga2ansi(finalcut::FColor::White);
1✔
2812
    test::FSystemTest::RGB& RGB15 = fsystest->getRGB(index);
1✔
2813
    CPPUNIT_ASSERT ( RGB15.red   == 0xff );
6✔
2814
    CPPUNIT_ASSERT ( RGB15.green == 0xff );
6✔
2815
    CPPUNIT_ASSERT ( RGB15.blue  == 0xff );
6✔
2816
    CPPUNIT_ASSERT ( linux.setPalette (index, 0x40, 0x41, 0x42) );
6✔
2817
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2818
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2819
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2820
    // Out of range -> no change
2821
    CPPUNIT_ASSERT ( linux.setPalette (index, -1, 0, 0) );
6✔
2822
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2823
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2824
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2825
    // Out of range -> no change
2826
    CPPUNIT_ASSERT ( linux.setPalette (index, 0, -1, 0) );
6✔
2827
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2828
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2829
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2830
    // Out of range -> no change
2831
    CPPUNIT_ASSERT ( linux.setPalette (index, 0, 0, -1) );
6✔
2832
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2833
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2834
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2835
    // Out of range -> no change
2836
    CPPUNIT_ASSERT ( linux.setPalette (index, 256, 0, 0) );
6✔
2837
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2838
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2839
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2840
    // Out of range -> no change
2841
    CPPUNIT_ASSERT ( linux.setPalette (index, 0, 256, 0) );
6✔
2842
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2843
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2844
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2845
    // Out of range -> no change
2846
    CPPUNIT_ASSERT ( linux.setPalette (index, 0, 0, 256) );
6✔
2847
    CPPUNIT_ASSERT ( RGB15.red   == 0x40 );
6✔
2848
    CPPUNIT_ASSERT ( RGB15.green == 0x41 );
6✔
2849
    CPPUNIT_ASSERT ( RGB15.blue  == 0x42 );
6✔
2850

2851
    CPPUNIT_ASSERT ( linux.resetColorMap() == true );
5✔
2852

2853
    linux.finish();
1✔
2854

2855
    closeConEmuStdStreams();
1✔
2856
    exit(EXIT_SUCCESS);
1✔
2857
  }
2858
  else  // Parent
2859
  {
2860
    // Start the terminal emulation
2861
    startConEmuTerminal (ConEmu::console::linux_con);
2✔
2862
    int wstatus;
2863

2864
    if ( waitpid(pid, &wstatus, WUNTRACED) != pid )
2✔
2865
      std::cerr << "waitpid error" << std::endl;
×
2866

2867
    if ( WIFEXITED(wstatus) )
2✔
2868
      CPPUNIT_ASSERT ( WEXITSTATUS(wstatus) == 0 );
12✔
2869
  }
2870
}
2✔
2871

2872
//----------------------------------------------------------------------
2873
void FTermLinuxTest::linuxFontTest()
2✔
2874
{
2875
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
2✔
2876
  finalcut::FTerm::setFSystem(fsys);
2✔
2877
  std::cout << "\n";
2✔
2878
  auto& data = finalcut::FTermData::getInstance();
2✔
2879

2880
  auto& encoding_list = data.getEncodingList();
2✔
2881
  encoding_list["UTF-8"] = finalcut::Encoding::UTF8;
4✔
2882
  encoding_list["UTF8"]  = finalcut::Encoding::UTF8;
4✔
2883
  encoding_list["VT100"] = finalcut::Encoding::VT100;
4✔
2884
  encoding_list["PC"]    = finalcut::Encoding::PC;
4✔
2885
  encoding_list["ASCII"] = finalcut::Encoding::ASCII;
2✔
2886

2887
  data.setTermEncoding(finalcut::Encoding::PC);
2✔
2888
  data.setBaudrate(38400);
2✔
2889
  data.setTermType("linux");
4✔
2890
  data.setTermFileName("/dev/tty2");
2✔
2891

2892
#if DEBUG
2893
  data.setFramebufferBpp(32);
2✔
2894
#endif
2895

2896
  data.supportShadowCharacter (false);
2✔
2897
  data.supportHalfBlockCharacter (false);
2✔
2898
  data.supportCursorOptimisation (true);
2✔
2899
  data.setCursorHidden (true);
2✔
2900
  data.useAlternateScreen (false);
2✔
2901
  data.setASCIIConsole (true);
2✔
2902
  data.setVT100Console (false);
2✔
2903
  data.setUTF8Console (false);
2✔
2904
  data.setUTF8 (false);
2✔
2905
  data.setNewFont (false);
2✔
2906
  data.setVGAFont (false);
2✔
2907
  data.setMonochron (false);
2✔
2908
  data.setTermResized (false);
2✔
2909

2910
  // setupterm is needed for tputs in ncurses >= 6.1
2911
  setupterm (static_cast<char*>(nullptr), 1, static_cast<int*>(nullptr));
2✔
2912
  auto& term_detection = finalcut::FTermDetection::getInstance();
2✔
2913
  finalcut::FTermLinux linux;
2✔
2914

2915
  pid_t pid = forkConEmu();
2✔
2916

2917
  if ( isConEmuChildProcess(pid) )
2✔
2918
  {
2919
    // (gdb) set follow-fork-mode child
2920
    setenv ("TERM", "linux", 1);
1✔
2921
    setenv ("COLUMNS", "90", 1);
1✔
2922
    setenv ("LINES", "30", 1);
1✔
2923
    unsetenv("TERMCAP");
1✔
2924
    unsetenv("COLORTERM");
1✔
2925
    unsetenv("COLORFGBG");
1✔
2926
    unsetenv("VTE_VERSION");
1✔
2927
    unsetenv("XTERM_VERSION");
1✔
2928
    unsetenv("ROXTERM_ID");
1✔
2929
    unsetenv("KONSOLE_DBUS_SESSION");
1✔
2930
    unsetenv("KONSOLE_DCOP");
1✔
2931
    unsetenv("TMUX");
1✔
2932

2933
    term_detection.detect();
1✔
2934
    linux.init();
1✔
2935
    const auto& fsystem = finalcut::FSystem::getInstance();
1✔
2936
    auto fsystest = static_cast<test::FSystemTest*>(fsystem.get());
1✔
2937
    console_font_op& font = fsystest->getConsoleFont();
1✔
2938
    CPPUNIT_ASSERT ( font.op == KD_FONT_OP_GET );
6✔
2939
    CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() );
6✔
2940
    CPPUNIT_ASSERT ( ! linux.isNewFontUsed() );
5✔
2941
    linux.loadVGAFont();
1✔
2942
    CPPUNIT_ASSERT ( data.hasShadowCharacter() );
6✔
2943
    CPPUNIT_ASSERT ( data.hasHalfBlockCharacter() );
6✔
2944
    CPPUNIT_ASSERT ( font.op == KD_FONT_OP_SET );
6✔
2945
    CPPUNIT_ASSERT ( linux.isVGAFontUsed() );
6✔
2946
    CPPUNIT_ASSERT ( ! linux.isNewFontUsed() );
6✔
2947
    CPPUNIT_ASSERT ( font.data );
5✔
2948

2949
    // Full block character test
2950
    for (std::size_t i = 0; i < 16 ; i++)
17✔
2951
      CPPUNIT_ASSERT ( font.data && font.data[static_cast<std::size_t>(219 * 32 + i)] == 0xff );
96✔
2952

2953
    linux.loadNewFont();
1✔
2954
    CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() );
6✔
2955
    CPPUNIT_ASSERT ( linux.isNewFontUsed() );
5✔
2956

2957
    // Full block character test
2958
    for (std::size_t i = 0; i < 16 ; i++)
17✔
2959
      CPPUNIT_ASSERT ( font.data[static_cast<std::size_t>(219 * 32 + i)] == 0xff );
96✔
2960

2961
    // New font bullet
2962
    CPPUNIT_ASSERT ( font.data[249 * 32 + 0] == 0x00 );
6✔
2963
    CPPUNIT_ASSERT ( font.data[249 * 32 + 1] == 0x00 );
6✔
2964
    CPPUNIT_ASSERT ( font.data[249 * 32 + 2] == 0x00 );
6✔
2965
    CPPUNIT_ASSERT ( font.data[249 * 32 + 3] == 0x00 );
6✔
2966
    CPPUNIT_ASSERT ( font.data[249 * 32 + 4] == 0x38 );
6✔
2967
    CPPUNIT_ASSERT ( font.data[249 * 32 + 5] == 0x7c );
6✔
2968
    CPPUNIT_ASSERT ( font.data[249 * 32 + 6] == 0xfe );
6✔
2969
    CPPUNIT_ASSERT ( font.data[249 * 32 + 7] == 0xfe );
6✔
2970
    CPPUNIT_ASSERT ( font.data[249 * 32 + 8] == 0xfe );
6✔
2971
    CPPUNIT_ASSERT ( font.data[249 * 32 + 9] == 0x7c );
6✔
2972
    CPPUNIT_ASSERT ( font.data[249 * 32 + 10] == 0x38 );
6✔
2973
    CPPUNIT_ASSERT ( font.data[249 * 32 + 11] == 0x00 );
6✔
2974
    CPPUNIT_ASSERT ( font.data[249 * 32 + 12] == 0x00 );
6✔
2975
    CPPUNIT_ASSERT ( font.data[249 * 32 + 13] == 0x00 );
6✔
2976
    CPPUNIT_ASSERT ( font.data[249 * 32 + 14] == 0x00 );
6✔
2977
    CPPUNIT_ASSERT ( font.data[249 * 32 + 15] == 0x00 );
5✔
2978

2979
    linux.loadOldFont();
1✔
2980
    CPPUNIT_ASSERT ( ! linux.isVGAFontUsed() );
6✔
2981
    CPPUNIT_ASSERT ( ! linux.isNewFontUsed() );
6✔
2982

2983
    // cp437 bullet operator
2984
    CPPUNIT_ASSERT ( font.data[249 * 32 + 0] == 0x00 );
6✔
2985
    CPPUNIT_ASSERT ( font.data[249 * 32 + 1] == 0x00 );
6✔
2986
    CPPUNIT_ASSERT ( font.data[249 * 32 + 2] == 0x00 );
6✔
2987
    CPPUNIT_ASSERT ( font.data[249 * 32 + 3] == 0x00 );
6✔
2988
    CPPUNIT_ASSERT ( font.data[249 * 32 + 4] == 0x00 );
6✔
2989
    CPPUNIT_ASSERT ( font.data[249 * 32 + 5] == 0x00 );
6✔
2990
    CPPUNIT_ASSERT ( font.data[249 * 32 + 6] == 0x00 );
6✔
2991
    CPPUNIT_ASSERT ( font.data[249 * 32 + 7] == 0x18 );
6✔
2992
    CPPUNIT_ASSERT ( font.data[249 * 32 + 8] == 0x18 );
6✔
2993
    CPPUNIT_ASSERT ( font.data[249 * 32 + 9] == 0x00 );
6✔
2994
    CPPUNIT_ASSERT ( font.data[249 * 32 + 10] == 0x00 );
6✔
2995
    CPPUNIT_ASSERT ( font.data[249 * 32 + 11] == 0x00 );
6✔
2996
    CPPUNIT_ASSERT ( font.data[249 * 32 + 12] == 0x00 );
6✔
2997
    CPPUNIT_ASSERT ( font.data[249 * 32 + 13] == 0x00 );
6✔
2998
    CPPUNIT_ASSERT ( font.data[249 * 32 + 14] == 0x00 );
6✔
2999
    CPPUNIT_ASSERT ( font.data[249 * 32 + 15] == 0x00 );
5✔
3000

3001
    linux.finish();
1✔
3002

3003
    closeConEmuStdStreams();
1✔
3004
    exit(EXIT_SUCCESS);
1✔
3005
  }
3006
  else  // Parent
3007
  {
3008
    // Start the terminal emulation
3009
    startConEmuTerminal (ConEmu::console::linux_con);
1✔
3010
    int wstatus;
3011

3012
    if ( waitpid(pid, &wstatus, WUNTRACED) != pid )
1✔
3013
      std::cerr << "waitpid error" << std::endl;
×
3014

3015
    if ( WIFEXITED(wstatus) )
1✔
3016
      CPPUNIT_ASSERT ( WEXITSTATUS(wstatus) == 0 );
6✔
3017
  }
3018
}
1✔
3019

3020
//----------------------------------------------------------------------
3021
void FTermLinuxTest::modifierKeyTest()
1✔
3022
{
3023
  std::unique_ptr<finalcut::FSystem> fsys = std::make_unique<test::FSystemTest>();
1✔
3024
  finalcut::FTerm::setFSystem(fsys);
1✔
3025

3026
  const auto& fsystem = finalcut::FSystem::getInstance();
1✔
3027
  auto fsystest = static_cast<test::FSystemTest*>(fsystem.get());
1✔
3028
  test::FSystemTest::ShiftState& mod_key = fsystest->getShiftState();
1✔
3029
  finalcut::FTermLinux linux{};
1✔
3030
  finalcut::FKey keycode{};
1✔
3031
  finalcut::FKey mod_keycode{};
1✔
3032
  linux.init();
1✔
3033

3034
  // Up key
3035
  keycode = finalcut::FKey::Up;
1✔
3036
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3037
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Up );
5✔
3038

3039
  mod_key.shift = 1;
1✔
3040
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3041
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Scroll_backward );
5✔
3042

3043
  mod_key.shift = 0;
1✔
3044
  mod_key.ctrl = 1;
1✔
3045
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3046
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_up );
5✔
3047

3048
  mod_key.ctrl = 0;
1✔
3049
  mod_key.alt = 1;
1✔
3050
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3051
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_up );
5✔
3052

3053
  mod_key.shift = 1;
1✔
3054
  mod_key.ctrl = 1;
1✔
3055
  mod_key.alt = 0;
1✔
3056
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3057
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_up );
5✔
3058

3059
  mod_key.ctrl = 0;
1✔
3060
  mod_key.alt = 1;
1✔
3061
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3062
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_up );
5✔
3063

3064
  mod_key.shift = 0;
1✔
3065
  mod_key.ctrl = 1;
1✔
3066
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3067
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_up );
5✔
3068

3069
  mod_key.shift = 1;
1✔
3070
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3071
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_up );
5✔
3072

3073
  // Down key
3074
  mod_key.shift = 0;
1✔
3075
  mod_key.ctrl = 0;
1✔
3076
  mod_key.alt = 0;
1✔
3077
  keycode = finalcut::FKey::Down;
1✔
3078
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3079
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Down );
5✔
3080

3081
  mod_key.shift = 1;
1✔
3082
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3083
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Scroll_forward );
5✔
3084

3085
  mod_key.shift = 0;
1✔
3086
  mod_key.ctrl = 1;
1✔
3087
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3088
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_down );
5✔
3089

3090
  mod_key.ctrl = 0;
1✔
3091
  mod_key.alt = 1;
1✔
3092
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3093
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_down );
5✔
3094

3095
  mod_key.shift = 1;
1✔
3096
  mod_key.ctrl = 1;
1✔
3097
  mod_key.alt = 0;
1✔
3098
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3099
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_down );
5✔
3100

3101
  mod_key.ctrl = 0;
1✔
3102
  mod_key.alt = 1;
1✔
3103
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3104
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_down );
5✔
3105

3106
  mod_key.shift = 0;
1✔
3107
  mod_key.ctrl = 1;
1✔
3108
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3109
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_down );
5✔
3110

3111
  mod_key.shift = 1;
1✔
3112
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3113
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_down );
5✔
3114

3115
  // Left key
3116
  mod_key.shift = 0;
1✔
3117
  mod_key.ctrl = 0;
1✔
3118
  mod_key.alt = 0;
1✔
3119
  keycode = finalcut::FKey::Left;
1✔
3120
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3121
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Left );
5✔
3122

3123
  mod_key.shift = 1;
1✔
3124
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3125
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_left );
5✔
3126

3127
  mod_key.shift = 0;
1✔
3128
  mod_key.ctrl = 1;
1✔
3129
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3130
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_left );
5✔
3131

3132
  mod_key.ctrl = 0;
1✔
3133
  mod_key.alt = 1;
1✔
3134
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3135
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_left );
5✔
3136

3137
  mod_key.shift = 1;
1✔
3138
  mod_key.ctrl = 1;
1✔
3139
  mod_key.alt = 0;
1✔
3140
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3141
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_left );
5✔
3142

3143
  mod_key.ctrl = 0;
1✔
3144
  mod_key.alt = 1;
1✔
3145
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3146
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_left );
5✔
3147

3148
  mod_key.shift = 0;
1✔
3149
  mod_key.ctrl = 1;
1✔
3150
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3151
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_left );
5✔
3152

3153
  mod_key.shift = 1;
1✔
3154
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3155
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_left );
5✔
3156

3157
  // Right key
3158
  mod_key.shift = 0;
1✔
3159
  mod_key.ctrl = 0;
1✔
3160
  mod_key.alt = 0;
1✔
3161
  keycode = finalcut::FKey::Right;
1✔
3162
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3163
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Right );
5✔
3164

3165
  mod_key.shift = 1;
1✔
3166
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3167
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_right );
5✔
3168

3169
  mod_key.shift = 0;
1✔
3170
  mod_key.ctrl = 1;
1✔
3171
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3172
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_right );
5✔
3173

3174
  mod_key.ctrl = 0;
1✔
3175
  mod_key.alt = 1;
1✔
3176
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3177
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_right );
5✔
3178

3179
  mod_key.shift = 1;
1✔
3180
  mod_key.ctrl = 1;
1✔
3181
  mod_key.alt = 0;
1✔
3182
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3183
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_right );
5✔
3184

3185
  mod_key.ctrl = 0;
1✔
3186
  mod_key.alt = 1;
1✔
3187
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3188
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_right );
5✔
3189

3190
  mod_key.shift = 0;
1✔
3191
  mod_key.ctrl = 1;
1✔
3192
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3193
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_right );
5✔
3194

3195
  mod_key.shift = 1;
1✔
3196
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3197
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_right );
5✔
3198

3199
  // Insert key
3200
  mod_key.shift = 0;
1✔
3201
  mod_key.ctrl = 0;
1✔
3202
  mod_key.alt = 0;
1✔
3203
  keycode = finalcut::FKey::Insert;
1✔
3204
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3205
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Insert );
5✔
3206

3207
  mod_key.shift = 1;
1✔
3208
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3209
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_insert );
5✔
3210

3211
  mod_key.shift = 0;
1✔
3212
  mod_key.ctrl = 1;
1✔
3213
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3214
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_insert );
5✔
3215

3216
  mod_key.ctrl = 0;
1✔
3217
  mod_key.alt = 1;
1✔
3218
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3219
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_insert );
5✔
3220

3221
  mod_key.shift = 1;
1✔
3222
  mod_key.ctrl = 1;
1✔
3223
  mod_key.alt = 0;
1✔
3224
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3225
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_insert );
5✔
3226

3227
  mod_key.ctrl = 0;
1✔
3228
  mod_key.alt = 1;
1✔
3229
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3230
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_insert );
5✔
3231

3232
  mod_key.shift = 0;
1✔
3233
  mod_key.ctrl = 1;
1✔
3234
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3235
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_insert );
5✔
3236

3237
  mod_key.shift = 1;
1✔
3238
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3239
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_insert );
5✔
3240

3241
  // Delete key
3242
  mod_key.shift = 0;
1✔
3243
  mod_key.ctrl = 0;
1✔
3244
  mod_key.alt = 0;
1✔
3245
  keycode = finalcut::FKey::Del_char;
1✔
3246
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3247
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Del_char );
5✔
3248

3249
  mod_key.shift = 1;
1✔
3250
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3251
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_del_char );
5✔
3252

3253
  mod_key.shift = 0;
1✔
3254
  mod_key.ctrl = 1;
1✔
3255
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3256
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_del_char );
5✔
3257

3258
  mod_key.ctrl = 0;
1✔
3259
  mod_key.alt = 1;
1✔
3260
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3261
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_del_char );
5✔
3262

3263
  mod_key.shift = 1;
1✔
3264
  mod_key.ctrl = 1;
1✔
3265
  mod_key.alt = 0;
1✔
3266
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3267
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_del_char );
5✔
3268

3269
  mod_key.ctrl = 0;
1✔
3270
  mod_key.alt = 1;
1✔
3271
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3272
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_del_char );
5✔
3273

3274
  mod_key.shift = 0;
1✔
3275
  mod_key.ctrl = 1;
1✔
3276
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3277
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_del_char );
5✔
3278

3279
  mod_key.shift = 1;
1✔
3280
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3281
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_del_char );
5✔
3282

3283
  // Home key
3284
  mod_key.shift = 0;
1✔
3285
  mod_key.ctrl = 0;
1✔
3286
  mod_key.alt = 0;
1✔
3287
  keycode = finalcut::FKey::Home;
1✔
3288
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3289
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Home );
5✔
3290

3291
  mod_key.shift = 1;
1✔
3292
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3293
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_home );
5✔
3294

3295
  mod_key.shift = 0;
1✔
3296
  mod_key.ctrl = 1;
1✔
3297
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3298
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_home );
5✔
3299

3300
  mod_key.ctrl = 0;
1✔
3301
  mod_key.alt = 1;
1✔
3302
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3303
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_home );
5✔
3304

3305
  mod_key.shift = 1;
1✔
3306
  mod_key.ctrl = 1;
1✔
3307
  mod_key.alt = 0;
1✔
3308
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3309
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_home );
5✔
3310

3311
  mod_key.ctrl = 0;
1✔
3312
  mod_key.alt = 1;
1✔
3313
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3314
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_home );
5✔
3315

3316
  mod_key.shift = 0;
1✔
3317
  mod_key.ctrl = 1;
1✔
3318
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3319
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_home );
5✔
3320

3321
  mod_key.shift = 1;
1✔
3322
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3323
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_home );
5✔
3324

3325
  // End key
3326
  mod_key.shift = 0;
1✔
3327
  mod_key.ctrl = 0;
1✔
3328
  mod_key.alt = 0;
1✔
3329
  keycode = finalcut::FKey::End;
1✔
3330
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3331
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::End );
5✔
3332

3333
  mod_key.shift = 1;
1✔
3334
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3335
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_end );
5✔
3336

3337
  mod_key.shift = 0;
1✔
3338
  mod_key.ctrl = 1;
1✔
3339
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3340
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_end );
5✔
3341

3342
  mod_key.ctrl = 0;
1✔
3343
  mod_key.alt = 1;
1✔
3344
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3345
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_end );
5✔
3346

3347
  mod_key.shift = 1;
1✔
3348
  mod_key.ctrl = 1;
1✔
3349
  mod_key.alt = 0;
1✔
3350
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3351
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_end );
5✔
3352

3353
  mod_key.ctrl = 0;
1✔
3354
  mod_key.alt = 1;
1✔
3355
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3356
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_end );
5✔
3357

3358
  mod_key.shift = 0;
1✔
3359
  mod_key.ctrl = 1;
1✔
3360
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3361
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_end );
5✔
3362

3363
  mod_key.shift = 1;
1✔
3364
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3365
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_end );
5✔
3366

3367
  // Page Up key
3368
  mod_key.shift = 0;
1✔
3369
  mod_key.ctrl = 0;
1✔
3370
  mod_key.alt = 0;
1✔
3371
  keycode = finalcut::FKey::Page_up;
1✔
3372
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3373
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Page_up );
5✔
3374

3375
  mod_key.shift = 1;
1✔
3376
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3377
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_page_up );
5✔
3378

3379
  mod_key.shift = 0;
1✔
3380
  mod_key.ctrl = 1;
1✔
3381
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3382
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_page_up );
5✔
3383

3384
  mod_key.ctrl = 0;
1✔
3385
  mod_key.alt = 1;
1✔
3386
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3387
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_page_up );
5✔
3388

3389
  mod_key.shift = 1;
1✔
3390
  mod_key.ctrl = 1;
1✔
3391
  mod_key.alt = 0;
1✔
3392
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3393
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_page_up );
5✔
3394

3395
  mod_key.ctrl = 0;
1✔
3396
  mod_key.alt = 1;
1✔
3397
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3398
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_page_up );
5✔
3399

3400
  mod_key.shift = 0;
1✔
3401
  mod_key.ctrl = 1;
1✔
3402
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3403
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_page_up );
5✔
3404

3405
  mod_key.shift = 1;
1✔
3406
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3407
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_page_up );
5✔
3408

3409
  // Page Down key
3410
  mod_key.shift = 0;
1✔
3411
  mod_key.ctrl = 0;
1✔
3412
  mod_key.alt = 0;
1✔
3413
  keycode = finalcut::FKey::Page_down;
1✔
3414
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3415
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Page_down );
5✔
3416

3417
  mod_key.shift = 1;
1✔
3418
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3419
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_page_down );
5✔
3420

3421
  mod_key.shift = 0;
1✔
3422
  mod_key.ctrl = 1;
1✔
3423
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3424
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_page_down );
5✔
3425

3426
  mod_key.ctrl = 0;
1✔
3427
  mod_key.alt = 1;
1✔
3428
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3429
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Meta_page_down );
5✔
3430

3431
  mod_key.shift = 1;
1✔
3432
  mod_key.ctrl = 1;
1✔
3433
  mod_key.alt = 0;
1✔
3434
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3435
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_page_down );
5✔
3436

3437
  mod_key.ctrl = 0;
1✔
3438
  mod_key.alt = 1;
1✔
3439
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3440
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Meta_page_down );
5✔
3441

3442
  mod_key.shift = 0;
1✔
3443
  mod_key.ctrl = 1;
1✔
3444
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3445
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Ctrl_Meta_page_down );
5✔
3446

3447
  mod_key.shift = 1;
1✔
3448
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3449
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Shift_Ctrl_Meta_page_down );
5✔
3450

3451
  // Space key
3452
  mod_key.shift = 0;
1✔
3453
  mod_key.ctrl = 0;
1✔
3454
  mod_key.alt = 0;
1✔
3455
  keycode = finalcut::FKey::Space;
1✔
3456
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3457
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3458

3459
  mod_key.shift = 1;
1✔
3460
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3461
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3462

3463
  mod_key.shift = 0;
1✔
3464
  mod_key.ctrl = 1;
1✔
3465
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3466
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3467

3468
  mod_key.ctrl = 0;
1✔
3469
  mod_key.alt = 1;
1✔
3470
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3471
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3472

3473
  mod_key.shift = 1;
1✔
3474
  mod_key.ctrl = 1;
1✔
3475
  mod_key.alt = 0;
1✔
3476
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3477
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3478

3479
  mod_key.ctrl = 0;
1✔
3480
  mod_key.alt = 1;
1✔
3481
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3482
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3483

3484
  mod_key.shift = 0;
1✔
3485
  mod_key.ctrl = 1;
1✔
3486
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3487
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3488

3489
  mod_key.shift = 1;
1✔
3490
  mod_keycode = linux.modifierKeyCorrection(keycode);
1✔
3491
  CPPUNIT_ASSERT ( mod_keycode == finalcut::FKey::Space );
5✔
3492
}
1✔
3493

3494
// Put the test suite in the registry
3495
CPPUNIT_TEST_SUITE_REGISTRATION (FTermLinuxTest);
3496

3497
// The general unit test main part
3498
#include <main-test.inc>
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc