FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
canvas.hpp
Go to the documentation of this file.
1// Copyright 2021 Arthur Sonzogni. Todos los derechos reservados.
2// El uso de este código fuente se rige por la licencia MIT que se puede encontrar en
3// el archivo LICENSE.
4#ifndef FTXUI_DOM_CANVAS_HPP
5#define FTXUI_DOM_CANVAS_HPP
6
7#include <cstddef> // for size_t
8#include <functional> // for function
9#include <string> // for string
10#include <unordered_map> // for unordered_map
11
12#include "ftxui/screen/color.hpp" // for Color
13#include "ftxui/screen/image.hpp" // for Pixel, Image
14
15#ifdef DrawText
16// Solución alternativa para WinUsr.h (a través de Windows.h) que define macros que rompen cosas.
17// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtext
18#undef DrawText
19#endif
20
21namespace ftxui {
22
23/// @brief Canvas es un búfer dibujable asociado con operaciones de dibujo.
24///
25/// Canvas es un área dibujable que se puede utilizar para crear gráficos complejos.
26/// Soporta dibujar puntos, líneas, círculos, elipses, texto e imágenes usando
27/// caracteres braille, de bloque o normales.
28///
29/// Nota: Un terminal contiene celdas. Una celda es una unidad de:
30/// - Caracteres braille de 2x4 (1x1 píxel)
31/// - Caracteres de bloque de 2x2 (2x2 píxeles)
32/// - Caracteres normales de 2x4 (2x4 píxeles)
33///
34/// Debe multiplicar la coordenada x por 2 y la coordenada y por 4 para
35/// obtener la posición correcta en el terminal.
36///
37/// @ingroup dom
38struct Canvas {
39 public:
40 Canvas() = default;
41 Canvas(int width, int height);
42
43 // Getters:
44 int width() const { return width_; }
45 int height() const { return height_; }
46 Pixel GetPixel(int x, int y) const;
47
48 using Stylizer = std::function<void(Pixel&)>;
49
50 // Dibuja usando caracteres braille --------------------------------------------
51 void DrawPointOn(int x, int y);
52 void DrawPointOff(int x, int y);
53 void DrawPointToggle(int x, int y);
54 void DrawPoint(int x, int y, bool value);
55 void DrawPoint(int x, int y, bool value, const Stylizer& s);
56 void DrawPoint(int x, int y, bool value, const Color& color);
57 void DrawPointLine(int x1, int y1, int x2, int y2);
58 void DrawPointLine(int x1, int y1, int x2, int y2, const Stylizer& s);
59 void DrawPointLine(int x1, int y1, int x2, int y2, const Color& color);
60 void DrawPointCircle(int x, int y, int radius);
61 void DrawPointCircle(int x, int y, int radius, const Stylizer& s);
62 void DrawPointCircle(int x, int y, int radius, const Color& color);
63 void DrawPointCircleFilled(int x, int y, int radius);
64 void DrawPointCircleFilled(int x, int y, int radius, const Stylizer& s);
65 void DrawPointCircleFilled(int x, int y, int radius, const Color& color);
66 void DrawPointEllipse(int x, int y, int r1, int r2);
67 void DrawPointEllipse(int x, int y, int r1, int r2, const Color& color);
68 void DrawPointEllipse(int x, int y, int r1, int r2, const Stylizer& s);
69 void DrawPointEllipseFilled(int x, int y, int r1, int r2);
70 void DrawPointEllipseFilled(int x, int y, int r1, int r2, const Color& color);
71 void DrawPointEllipseFilled(int x, int y, int r1, int r2, const Stylizer& s);
72
73 // Dibuja usando caracteres de caja -------------------------------------------------
74 // Los bloques son de tamaño 1x2. La coordenada y se considera un múltiplo de 2.
75 void DrawBlockOn(int x, int y);
76 void DrawBlockOff(int x, int y);
77 void DrawBlockToggle(int x, int y);
78 void DrawBlock(int x, int y, bool value);
79 void DrawBlock(int x, int y, bool value, const Stylizer& s);
80 void DrawBlock(int x, int y, bool value, const Color& color);
81 void DrawBlockLine(int x1, int y1, int x2, int y2);
82 void DrawBlockLine(int x1, int y1, int x2, int y2, const Stylizer& s);
83 void DrawBlockLine(int x1, int y1, int x2, int y2, const Color& color);
84 void DrawBlockCircle(int x1, int y1, int radius);
85 void DrawBlockCircle(int x1, int y1, int radius, const Stylizer& s);
86 void DrawBlockCircle(int x1, int y1, int radius, const Color& color);
87 void DrawBlockCircleFilled(int x1, int y1, int radius);
88 void DrawBlockCircleFilled(int x1, int y1, int radius, const Stylizer& s);
89 void DrawBlockCircleFilled(int x1, int y1, int radius, const Color& color);
90 void DrawBlockEllipse(int x1, int y1, int r1, int r2);
91 void DrawBlockEllipse(int x1, int y1, int r1, int r2, const Stylizer& s);
92 void DrawBlockEllipse(int x1, int y1, int r1, int r2, const Color& color);
93 void DrawBlockEllipseFilled(int x1, int y1, int r1, int r2);
94 void DrawBlockEllipseFilled(int x1,
95 int y1,
96 int r1,
97 int r2,
98 const Stylizer& s);
100 int y1,
101 int r1,
102 int r2,
103 const Color& color);
104
105 // Dibuja usando caracteres normales ----------------------------------------------
106 // Dibuja usando un carácter de tamaño 2x4 en la posición (x,y)
107 // La coordenada x se considera un múltiplo de 2.
108 // La coordenada y se considera un múltiplo de 4.
109 void DrawText(int x, int y, const std::string& value);
110 void DrawText(int x, int y, const std::string& value, const Color& color);
111 void DrawText(int x, int y, const std::string& value, const Stylizer& style);
112
113 // Dibuja usando directamente píxeles o imágenes --------------------------------------
114 // La coordenada x se considera un múltiplo de 2.
115 // La coordenada y se considera un múltiplo de 4.
116 void DrawPixel(int x, int y, const Pixel&);
117 void DrawImage(int x, int y, const Image&);
118
119 // Decorador:
120 // La coordenada x se considera un múltiplo de 2.
121 // La coordenada y se considera un múltiplo de 4.
122 void Style(int x, int y, const Stylizer& style);
123
124 private:
125 bool IsIn(int x, int y) const {
126 return x >= 0 && x < width_ && y >= 0 && y < height_;
127 }
128
129 enum CellType {
130 kCell, // Units of size 2x4
131 kBlock, // Units of size 2x2
132 kBraille, // Units of size 1x1
133 };
134
135 struct Cell {
136 CellType type = kCell;
137 Pixel content;
138 };
139
140 struct XY {
141 int x;
142 int y;
143 bool operator==(const XY& other) const {
144 return x == other.x && y == other.y;
145 }
146 };
147
148 struct XYHash {
149 size_t operator()(const XY& xy) const {
150 constexpr size_t shift = 1024;
151 return size_t(xy.x) * shift + size_t(xy.y);
152 }
153 };
154
155 int width_ = 0;
156 int height_ = 0;
157 std::unordered_map<XY, Cell, XYHash> storage_;
158};
159
160} // namespace ftxui
161
162#endif // FTXUI_DOM_CANVAS_HPP
ButtonOption Style()
void DrawImage(int x, int y, const Image &)
Dibuja una imagen predefinida, con la esquina superior izquierda en la coordenada dada Puedes proporc...
void DrawBlockLine(int x1, int y1, int x2, int y2)
Dibuja una línea de caracteres de bloque.
void DrawPointEllipseFilled(int x, int y, int r1, int r2)
Dibuja una elipse rellena de puntos braille.
void DrawPointLine(int x1, int y1, int x2, int y2)
Dibuja una línea de puntos braille.
void DrawText(int x, int y, const std::string &value)
Dibuja un trozo de texto.
Canvas()=default
std::function< void(Pixel &)> Stylizer
Definition canvas.hpp:48
void DrawBlockOn(int x, int y)
Dibuja un bloque.
void DrawPointCircleFilled(int x, int y, int radius)
Dibuja un círculo relleno de puntos braille.
void DrawPointOn(int x, int y)
Dibuja un punto braille.
void DrawBlockEllipseFilled(int x1, int y1, int r1, int r2, const Color &color)
void DrawPointOff(int x, int y)
Borra un punto braille.
Pixel GetPixel(int x, int y) const
Obtiene el contenido de una celda.
void DrawBlockEllipseFilled(int x1, int y1, int r1, int r2)
void DrawPointEllipse(int x, int y, int r1, int r2)
Dibuja una elipse de puntos braille.
void DrawPoint(int x, int y, bool value)
Dibuja un punto braille.
void DrawBlockEllipse(int x1, int y1, int r1, int r2)
Dibuja una elipse de caracteres de bloque.
void DrawBlockToggle(int x, int y)
Alterna un bloque. Si está relleno, se borrará. Si está vacío, se rellenará.
void DrawBlockCircle(int x1, int y1, int radius)
Dibuja un círculo de caracteres de bloque.
void DrawBlockCircleFilled(int x1, int y1, int radius)
Dibuja un círculo relleno de caracteres de bloque.
void DrawPointCircle(int x, int y, int radius)
Dibuja un círculo de puntos braille.
int height() const
Definition canvas.hpp:45
void DrawBlockOff(int x, int y)
Borra un bloque.
int width() const
Definition canvas.hpp:44
void DrawBlock(int x, int y, bool value)
Dibuja un bloque.
void DrawPointToggle(int x, int y)
Alterna un punto braille. Uno relleno será borrado, y el otro será dibujado.
void DrawPixel(int x, int y, const Pixel &)
Dibuja directamente un píxel predefinido en la coordenada dada.
Canvas es un búfer dibujable asociado con operaciones de dibujo.
Definition canvas.hpp:38
Color es una clase que representa un color en la interfaz de usuario de la terminal.
Definition color.hpp:21
Una cuadrícula rectangular de píxeles.
Definition image.hpp:17
Un carácter Unicode y su estilo asociado.
Definition pixel.hpp:15
El espacio de nombres ftxui:: de FTXUI.
Definition animation.hpp:10