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. All rights reserved.
2// このソースコードの使用は、LICENSEファイルにあるMITライセンスに準拠します。
3#ifndef FTXUI_DOM_CANVAS_HPP
4#define FTXUI_DOM_CANVAS_HPP
5
6#include <cstddef> // for size_t
7#include <functional> // for function
8#include <string> // for string
9#include <unordered_map> // for unordered_map
10
11#include "ftxui/screen/color.hpp" // for Color
12#include "ftxui/screen/image.hpp" // for Pixel, Image
13
14#ifdef DrawText
15// WinUsr.h (via Windows.h)が、問題を発生させるマクロを定義していることへの回避策。
16// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtext
17#undef DrawText
18#endif
19
20namespace ftxui {
21
22/// @brief Canvasは、描画操作に関連付けられた描画可能なバッファです。
23///
24/// Canvasは、複雑なグラフィックを作成するために使用できる描画領域です。
25/// 点、線、円、楕円、テキスト、および画像を点字、ブロック、または通常の文字を使用して描画する
26/// ことができます。
27///
28/// 注: ターミナルにはセルが含まれています。セルは以下の単位です。
29/// - 2x4点字文字 (1x1ピクセル)
30/// - 2x2ブロック文字 (2x2ピクセル)
31/// - 2x4通常文字 (2x4ピクセル)
32///
33/// ターミナルで正しい位置を取得するには、x座標を2倍し、y座標を4倍する必要があります。
34///
35/// @ingroup dom
36struct Canvas {
37 public:
38 Canvas() = default;
39 Canvas(int width, int height);
40
41 // Getters:
42 int width() const { return width_; }
43 int height() const { return height_; }
44 Pixel GetPixel(int x, int y) const;
45
46 using Stylizer = std::function<void(Pixel&)>;
47
48 // 点字文字を使用した描画 --------------------------------------------
49 void DrawPointOn(int x, int y);
50 void DrawPointOff(int x, int y);
51 void DrawPointToggle(int x, int y);
52 void DrawPoint(int x, int y, bool value);
53 void DrawPoint(int x, int y, bool value, const Stylizer& s);
54 void DrawPoint(int x, int y, bool value, const Color& color);
55 void DrawPointLine(int x1, int y1, int x2, int y2);
56 void DrawPointLine(int x1, int y1, int x2, int y2, const Stylizer& s);
57 void DrawPointLine(int x1, int y1, int x2, int y2, const Color& color);
58 void DrawPointCircle(int x, int y, int radius);
59 void DrawPointCircle(int x, int y, int radius, const Stylizer& s);
60 void DrawPointCircle(int x, int y, int radius, const Color& color);
61 void DrawPointCircleFilled(int x, int y, int radius);
62 void DrawPointCircleFilled(int x, int y, int radius, const Stylizer& s);
63 void DrawPointCircleFilled(int x, int y, int radius, const Color& color);
64 void DrawPointEllipse(int x, int y, int r1, int r2);
65 void DrawPointEllipse(int x, int y, int r1, int r2, const Color& color);
66 void DrawPointEllipse(int x, int y, int r1, int r2, const Stylizer& s);
67 void DrawPointEllipseFilled(int x, int y, int r1, int r2);
68 void DrawPointEllipseFilled(int x, int y, int r1, int r2, const Color& color);
69 void DrawPointEllipseFilled(int x, int y, int r1, int r2, const Stylizer& s);
70
71 // ボックス文字を使用した描画 -------------------------------------------------
72 // ブロックは1x2のサイズです。yは2の倍数と見なされます。 void DrawBlockOn(int x, int y);
73 void DrawBlockOff(int x, int y);
74 void DrawBlockToggle(int x, int y);
75 void DrawBlock(int x, int y, bool value);
76 void DrawBlock(int x, int y, bool value, const Stylizer& s);
77 void DrawBlock(int x, int y, bool value, const Color& color);
78 void DrawBlockLine(int x1, int y1, int x2, int y2);
79 void DrawBlockLine(int x1, int y1, int x2, int y2, const Stylizer& s);
80 void DrawBlockLine(int x1, int y1, int x2, int y2, const Color& color);
81 void DrawBlockCircle(int x1, int y1, int radius);
82 void DrawBlockCircle(int x1, int y1, int radius, const Stylizer& s);
83 void DrawBlockCircle(int x1, int y1, int radius, const Color& color);
84 void DrawBlockCircleFilled(int x1, int y1, int radius);
85 void DrawBlockCircleFilled(int x1, int y1, int radius, const Stylizer& s);
86 void DrawBlockCircleFilled(int x1, int y1, int radius, const Color& color);
87 void DrawBlockEllipse(int x1, int y1, int r1, int r2);
88 void DrawBlockEllipse(int x1, int y1, int r1, int r2, const Stylizer& s);
89 void DrawBlockEllipse(int x1, int y1, int r1, int r2, const Color& color);
90 void DrawBlockEllipseFilled(int x1, int y1, int r1, int r2);
91 void DrawBlockEllipseFilled(int x1,
92 int y1,
93 int r1,
94 int r2,
95 const Stylizer& s);
96 void DrawBlockEllipseFilled(int x1,
97 int y1,
98 int r1,
99 int r2,
100 const Color& color);
101
102 // 通常文字を使用した描画 ----------------------------------------------
103 // (x,y)の位置に2x4サイズの文字を使用して描画します。
104 // xは2の倍数と見なされます。
105 // yは4の倍数と見なされます。 void DrawText(int x, int y, const std::string& value);
106 void DrawText(int x, int y, const std::string& value, const Color& color);
107 void DrawText(int x, int y, const std::string& value, const Stylizer& style);
108
109 // ピクセルまたは画像を直接使用した描画 --------------------------------------
110 // xは2の倍数と見なされます。
111 // yは4の倍数と見なされます。 void DrawPixel(int x, int y, const Pixel&);
112 void DrawImage(int x, int y, const Image&);
113
114 // デコレータ:
115 // xは2の倍数と見なされます。
116 // yは4の倍数と見なされます。 void Style(int x, int y, const Stylizer& style);
117
118 private:
119 bool IsIn(int x, int y) const {
120 return x >= 0 && x < width_ && y >= 0 && y < height_;
121 }
122
123 enum CellType {
124 kCell, // Units of size 2x4
125 kBlock, // Units of size 2x2
126 kBraille, // Units of size 1x1
127 };
128
129 struct Cell {
130 CellType type = kCell;
131 Pixel content;
132 };
133
134 struct XY {
135 int x;
136 int y;
137 bool operator==(const XY& other) const {
138 return x == other.x && y == other.y;
139 }
140 };
141
142 struct XYHash {
143 size_t operator()(const XY& xy) const {
144 constexpr size_t shift = 1024;
145 return size_t(xy.x) * shift + size_t(xy.y);
146 }
147 };
148
149 int width_ = 0;
150 int height_ = 0;
151 std::unordered_map<XY, Cell, XYHash> storage_;
152};
153
154} // namespace ftxui
155
156#endif // FTXUI_DOM_CANVAS_HPP
void DrawImage(int x, int y, const Image &)
定義済み画像を、指定された座標を左上隅として描画します 負の座標を指定して画像を自由に配置できます。 表示される部分のみが描画されます。
void DrawBlockLine(int x1, int y1, int x2, int y2)
ブロック文字で線を描画します。
void DrawPointEllipseFilled(int x, int y, int r1, int r2)
点字ドットで塗りつぶされた楕円を描画します。
void DrawPointLine(int x1, int y1, int x2, int y2)
点字ドットで線を描画します。
void DrawText(int x, int y, const std::string &value, const Color &color)
テキストを描画します。
Canvas()=default
std::function< void(Pixel &)> Stylizer
Definition canvas.hpp:46
void DrawPointCircleFilled(int x, int y, int radius)
点字ドットで塗りつぶされた円を描画します。
void DrawPointOn(int x, int y)
点字ドットを描画します。
void DrawPointOff(int x, int y)
点字ドットを消去します。
Pixel GetPixel(int x, int y) const
セルの内容を取得します。
void DrawBlockEllipseFilled(int x1, int y1, int r1, int r2)
ブロック文字で塗りつぶされた楕円を描画します。
void DrawPointEllipse(int x, int y, int r1, int r2)
点字ドットで楕円を描画します。
void DrawPoint(int x, int y, bool value)
点字ドットを描画します。
void DrawBlockEllipse(int x1, int y1, int r1, int r2)
ブロック文字で楕円を描画します。
void DrawBlockToggle(int x, int y)
ブロックを切り替えます。塗りつぶされている場合は消去され、空の場合は塗りつぶされます。
void DrawBlockCircle(int x1, int y1, int radius)
ブロック文字で円を描画します。
void DrawBlockCircleFilled(int x1, int y1, int radius)
ブロック文字で塗りつぶされた円を描画します。
void DrawPointCircle(int x, int y, int radius)
点字ドットで円を描画します。
int height() const
Definition canvas.hpp:43
void DrawBlockOff(int x, int y)
ブロックを消去します。
int width() const
Definition canvas.hpp:42
void DrawBlock(int x, int y, bool value)
ブロックを描画します。
void DrawPointToggle(int x, int y)
点字ドットを切り替えます。塗りつぶされたものは消去され、それ以外は描画されます。
Canvasは、描画操作に関連付けられた描画可能なバッファです。
Definition canvas.hpp:36
Colorは、ターミナルユーザーインターフェースにおける色を表すクラスです。
Definition color.hpp:25
ピクセルの長方形グリッド。
Definition image.hpp:17
Unicode文字とそれに関連付けられたスタイル。
Definition pixel.hpp:14
FTXUI ftxui:: 名前空間
Definition animation.hpp:9