Initial commit

This commit is contained in:
2025-03-21 18:47:49 +01:00
commit a8e1193e12
46 changed files with 2787 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_BOX_HPP
#define FTXUI_SCREEN_BOX_HPP
namespace ftxui {
struct Box {
int x_min = 0;
int x_max = 0;
int y_min = 0;
int y_max = 0;
static auto Intersection(Box a, Box b) -> Box;
static auto Union(Box a, Box b) -> Box;
bool Contain(int x, int y) const;
bool operator==(const Box& other) const;
bool operator!=(const Box& other) const;
};
} // namespace ftxui
#endif // FTXUI_SCREEN_BOX_HPP

View File

@@ -0,0 +1,336 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_COLOR_HPP
#define FTXUI_SCREEN_COLOR_HPP
#include <cstdint> // for uint8_t
#include <string> // for string
#include <vector> // for vector
#ifdef RGB
// Workaround for wingdi.h (via Windows.h) defining macros that break things.
// https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-rgb
#undef RGB
#endif
namespace ftxui {
/// @brief A class representing terminal colors.
/// @ingroup screen
class Color {
public:
enum Palette1 : uint8_t;
enum Palette16 : uint8_t;
enum Palette256 : uint8_t;
Color(); // Transparent.
Color(Palette1 index); // Transparent.
Color(Palette16 index); // Implicit conversion from index to Color.
Color(Palette256 index); // Implicit conversion from index to Color.
Color(uint8_t red, uint8_t green, uint8_t blue);
static Color RGB(uint8_t red, uint8_t green, uint8_t blue);
static Color HSV(uint8_t hue, uint8_t saturation, uint8_t value);
static Color Interpolate(float t, const Color& a, const Color& b);
//---------------------------
// List of colors:
//---------------------------
// clang-format off
enum Palette1 : uint8_t{
Default, // Transparent
};
enum Palette16 : uint8_t {
Black = 0,
Red = 1,
Green = 2,
Yellow = 3,
Blue = 4,
Magenta = 5,
Cyan = 6,
GrayLight = 7,
GrayDark = 8,
RedLight = 9,
GreenLight = 10,
YellowLight = 11,
BlueLight = 12,
MagentaLight = 13,
CyanLight = 14,
White = 15,
};
enum Palette256 : uint8_t {
Aquamarine1 = 122,
Aquamarine1Bis = 86,
Aquamarine3 = 79,
Blue1 = 21,
Blue3 = 19,
Blue3Bis = 20,
BlueViolet = 57,
CadetBlue = 72,
CadetBlueBis = 73,
Chartreuse1 = 118,
Chartreuse2 = 112,
Chartreuse2Bis = 82,
Chartreuse3 = 70,
Chartreuse3Bis = 76,
Chartreuse4 = 64,
CornflowerBlue = 69,
Cornsilk1 = 230,
Cyan1 = 51,
Cyan2 = 50,
Cyan3 = 43,
DarkBlue = 18,
DarkCyan = 36,
DarkGoldenrod = 136,
DarkGreen = 22,
DarkKhaki = 143,
DarkMagenta = 90,
DarkMagentaBis = 91,
DarkOliveGreen1 = 191,
DarkOliveGreen1Bis = 192,
DarkOliveGreen2 = 155,
DarkOliveGreen3 = 107,
DarkOliveGreen3Bis = 113,
DarkOliveGreen3Ter = 149,
DarkOrange = 208,
DarkOrange3 = 130,
DarkOrange3Bis = 166,
DarkRed = 52,
DarkRedBis = 88,
DarkSeaGreen = 108,
DarkSeaGreen1 = 158,
DarkSeaGreen1Bis = 193,
DarkSeaGreen2 = 151,
DarkSeaGreen2Bis = 157,
DarkSeaGreen3 = 115,
DarkSeaGreen3Bis = 150,
DarkSeaGreen4 = 65,
DarkSeaGreen4Bis = 71,
DarkSlateGray1 = 123,
DarkSlateGray2 = 87,
DarkSlateGray3 = 116,
DarkTurquoise = 44,
DarkViolet = 128,
DarkVioletBis = 92,
DeepPink1 = 198,
DeepPink1Bis = 199,
DeepPink2 = 197,
DeepPink3 = 161,
DeepPink3Bis = 162,
DeepPink4 = 125,
DeepPink4Bis = 89,
DeepPink4Ter = 53,
DeepSkyBlue1 = 39,
DeepSkyBlue2 = 38,
DeepSkyBlue3 = 31,
DeepSkyBlue3Bis = 32,
DeepSkyBlue4 = 23,
DeepSkyBlue4Bis = 24,
DeepSkyBlue4Ter = 25,
DodgerBlue1 = 33,
DodgerBlue2 = 27,
DodgerBlue3 = 26,
Gold1 = 220,
Gold3 = 142,
Gold3Bis = 178,
Green1 = 46,
Green3 = 34,
Green3Bis = 40,
Green4 = 28,
GreenYellow = 154,
Grey0 = 16,
Grey100 = 231,
Grey11 = 234,
Grey15 = 235,
Grey19 = 236,
Grey23 = 237,
Grey27 = 238,
Grey3 = 232,
Grey30 = 239,
Grey35 = 240,
Grey37 = 59,
Grey39 = 241,
Grey42 = 242,
Grey46 = 243,
Grey50 = 244,
Grey53 = 102,
Grey54 = 245,
Grey58 = 246,
Grey62 = 247,
Grey63 = 139,
Grey66 = 248,
Grey69 = 145,
Grey7 = 233,
Grey70 = 249,
Grey74 = 250,
Grey78 = 251,
Grey82 = 252,
Grey84 = 188,
Grey85 = 253,
Grey89 = 254,
Grey93 = 255,
Honeydew2 = 194,
HotPink = 205,
HotPink2 = 169,
HotPink3 = 132,
HotPink3Bis = 168,
HotPinkBis = 206,
IndianRed = 131,
IndianRed1 = 203,
IndianRed1Bis = 204,
IndianRedBis = 167,
Khaki1 = 228,
Khaki3 = 185,
LightCoral = 210,
LightCyan1Bis = 195,
LightCyan3 = 152,
LightGoldenrod1 = 227,
LightGoldenrod2 = 186,
LightGoldenrod2Bis = 221,
LightGoldenrod2Ter = 222,
LightGoldenrod3 = 179,
LightGreen = 119,
LightGreenBis = 120,
LightPink1 = 217,
LightPink3 = 174,
LightPink4 = 95,
LightSalmon1 = 216,
LightSalmon3 = 137,
LightSalmon3Bis = 173,
LightSeaGreen = 37,
LightSkyBlue1 = 153,
LightSkyBlue3 = 109,
LightSkyBlue3Bis = 110,
LightSlateBlue = 105,
LightSlateGrey = 103,
LightSteelBlue = 147,
LightSteelBlue1 = 189,
LightSteelBlue3 = 146,
LightYellow3 = 187,
Magenta1 = 201,
Magenta2 = 165,
Magenta2Bis = 200,
Magenta3 = 127,
Magenta3Bis = 163,
Magenta3Ter = 164,
MediumOrchid = 134,
MediumOrchid1 = 171,
MediumOrchid1Bis = 207,
MediumOrchid3 = 133,
MediumPurple = 104,
MediumPurple1 = 141,
MediumPurple2 = 135,
MediumPurple2Bis = 140,
MediumPurple3 = 97,
MediumPurple3Bis = 98,
MediumPurple4 = 60,
MediumSpringGreen = 49,
MediumTurquoise = 80,
MediumVioletRed = 126,
MistyRose1 = 224,
MistyRose3 = 181,
NavajoWhite1 = 223,
NavajoWhite3 = 144,
NavyBlue = 17,
Orange1 = 214,
Orange3 = 172,
Orange4 = 58,
Orange4Bis = 94,
OrangeRed1 = 202,
Orchid = 170,
Orchid1 = 213,
Orchid2 = 212,
PaleGreen1 = 121,
PaleGreen1Bis = 156,
PaleGreen3 = 114,
PaleGreen3Bis = 77,
PaleTurquoise1 = 159,
PaleTurquoise4 = 66,
PaleVioletRed1 = 211,
Pink1 = 218,
Pink3 = 175,
Plum1 = 219,
Plum2 = 183,
Plum3 = 176,
Plum4 = 96,
Purple = 129,
Purple3 = 56,
Purple4 = 54,
Purple4Bis = 55,
PurpleBis = 93,
Red1 = 196,
Red3 = 124,
Red3Bis = 160,
RosyBrown = 138,
RoyalBlue1 = 63,
Salmon1 = 209,
SandyBrown = 215,
SeaGreen1 = 84,
SeaGreen1Bis = 85,
SeaGreen2 = 83,
SeaGreen3 = 78,
SkyBlue1 = 117,
SkyBlue2 = 111,
SkyBlue3 = 74,
SlateBlue1 = 99,
SlateBlue3 = 61,
SlateBlue3Bis = 62,
SpringGreen1 = 48,
SpringGreen2 = 42,
SpringGreen2Bis = 47,
SpringGreen3 = 35,
SpringGreen3Bis = 41,
SpringGreen4 = 29,
SteelBlue = 67,
SteelBlue1 = 75,
SteelBlue1Bis = 81,
SteelBlue3 = 68,
Tan = 180,
Thistle1 = 225,
Thistle3 = 182,
Turquoise2 = 45,
Turquoise4 = 30,
Violet = 177,
Wheat1 = 229,
Wheat4 = 101,
Yellow1 = 226,
Yellow2 = 190,
Yellow3 = 148,
Yellow3Bis = 184,
Yellow4 = 100,
Yellow4Bis = 106,
};
// clang-format on
// --- Operators ------
bool operator==(const Color& rhs) const;
bool operator!=(const Color& rhs) const;
std::string Print(bool is_background_color) const;
private:
enum class ColorType : uint8_t {
Palette1,
Palette16,
Palette256,
TrueColor,
};
ColorType type_ = ColorType::Palette1;
uint8_t red_ = 0;
uint8_t green_ = 0;
uint8_t blue_ = 0;
};
inline namespace literals {
/// @brief Creates a color from a combined hex RGB representation,
/// e.g. 0x808000_rgb
Color operator""_rgb(unsigned long long int combined);
} // namespace literals
} // namespace ftxui
#endif // FTXUI_SCREEN_COLOR_HPP

View File

@@ -0,0 +1,29 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_COLOR_INFO_HPP
#define FTXUI_SCREEN_COLOR_INFO_HPP
#include <cstdint>
#include <ftxui/screen/color.hpp>
namespace ftxui {
struct ColorInfo {
const char* name;
uint8_t index_256;
uint8_t index_16;
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t hue;
uint8_t saturation;
uint8_t value;
};
ColorInfo GetColorInfo(Color::Palette256 index);
ColorInfo GetColorInfo(Color::Palette16 index);
} // namespace ftxui
#endif // FTXUI_SCREEN_COLOR_INFO_HPP

View File

@@ -0,0 +1,14 @@
// Copyright 2021 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_DEPRECATED_HPP
#define FTXUI_SCREEN_DEPRECATED_HPP
#include <string>
namespace ftxui {
int wchar_width(wchar_t);
int wstring_width(const std::wstring&);
} // namespace ftxui
#endif // FTXUI_SCREEN_DEPRECATED_HPP

View File

@@ -0,0 +1,130 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_SCREEN_HPP
#define FTXUI_SCREEN_SCREEN_HPP
#include <cstdint> // for uint8_t
#include <memory>
#include <string> // for string, basic_string, allocator
#include <vector> // for vector
#include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/color.hpp" // for Color, Color::Default
#include "ftxui/screen/terminal.hpp" // for Dimensions
namespace ftxui {
/// @brief A unicode character and its associated style.
/// @ingroup screen
struct Pixel {
Pixel()
: blink(false),
bold(false),
dim(false),
inverted(false),
underlined(false),
underlined_double(false),
strikethrough(false),
automerge(false) {}
// A bit field representing the style:
bool blink : 1;
bool bold : 1;
bool dim : 1;
bool inverted : 1;
bool underlined : 1;
bool underlined_double : 1;
bool strikethrough : 1;
bool automerge : 1;
// The hyperlink associated with the pixel.
// 0 is the default value, meaning no hyperlink.
uint8_t hyperlink = 0;
// The graphemes stored into the pixel. To support combining characters,
// like: a⃦, this can potentially contain multiple codepoints.
std::string character = " ";
// Colors:
Color background_color = Color::Default;
Color foreground_color = Color::Default;
};
/// @brief Define how the Screen's dimensions should look like.
/// @ingroup screen
namespace Dimension {
Dimensions Fixed(int);
Dimensions Full();
} // namespace Dimension
/// @brief A rectangular grid of Pixel.
/// @ingroup screen
class Screen {
public:
// Constructors:
Screen(int dimx, int dimy);
static Screen Create(Dimensions dimension);
static Screen Create(Dimensions width, Dimensions height);
// Access a character in the grid at a given position.
std::string& at(int x, int y);
const std::string& at(int x, int y) const;
// Access a cell (Pixel) in the grid at a given position.
Pixel& PixelAt(int x, int y);
const Pixel& PixelAt(int x, int y) const;
std::string ToString() const;
// Print the Screen on to the terminal.
void Print() const;
// Get screen dimensions.
int dimx() const { return dimx_; }
int dimy() const { return dimy_; }
// Move the terminal cursor n-lines up with n = dimy().
std::string ResetPosition(bool clear = false) const;
// Fill the screen with space.
void Clear();
void ApplyShader();
struct Cursor {
int x = 0;
int y = 0;
enum Shape {
Hidden = 0,
BlockBlinking = 1,
Block = 2,
UnderlineBlinking = 3,
Underline = 4,
BarBlinking = 5,
Bar = 6,
};
Shape shape;
};
Cursor cursor() const { return cursor_; }
void SetCursor(Cursor cursor) { cursor_ = cursor; }
// Store an hyperlink in the screen. Return the id of the hyperlink. The id is
// used to identify the hyperlink when the user click on it.
uint8_t RegisterHyperlink(const std::string& link);
const std::string& Hyperlink(uint8_t id) const;
Box stencil;
protected:
int dimx_;
int dimy_;
std::vector<std::vector<Pixel>> pixels_;
Cursor cursor_;
std::vector<std::string> hyperlinks_ = {""};
};
} // namespace ftxui
#endif // FTXUI_SCREEN_SCREEN_HPP

View File

@@ -0,0 +1,35 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_STRING_HPP
#define FTXUI_SCREEN_STRING_HPP
#include <stddef.h> // for size_t
#include <cstdint> // for uint8_t
#include <string> // for string, wstring, to_string
#include <vector> // for vector
namespace ftxui {
std::string to_string(const std::wstring& s);
std::wstring to_wstring(const std::string& s);
template <typename T>
std::wstring to_wstring(T s) {
return to_wstring(std::to_string(s));
}
int string_width(const std::string&);
// Split the string into a its glyphs. An empty one is inserted ater fullwidth
// ones.
std::vector<std::string> Utf8ToGlyphs(const std::string& input);
// Map every cells drawn by |input| to their corresponding Glyphs. Half-size
// Glyphs takes one cell, full-size Glyphs take two cells.
std::vector<int> CellToGlyphIndex(const std::string& input);
} // namespace ftxui
#include "ftxui/screen/deprecated.hpp"
#endif /* end of include guard: FTXUI_SCREEN_STRING_HPP */

View File

@@ -0,0 +1,30 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_SCREEN_TERMINAL_HPP
#define FTXUI_SCREEN_TERMINAL_HPP
namespace ftxui {
struct Dimensions {
int dimx;
int dimy;
};
namespace Terminal {
Dimensions Size();
void SetFallbackSize(const Dimensions& fallbackSize);
enum Color {
Palette1,
Palette16,
Palette256,
TrueColor,
};
Color ColorSupport();
void SetColorSupport(Color color);
} // namespace Terminal
} // namespace ftxui
#endif // FTXUI_SCREEN_TERMINAL_HPP