ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
terminal_renderer.cpp
Go to the documentation of this file.
1#include <emscripten/bind.h>
2extern "C" {
3#include "../common/font.h"
5}
6
7#include <cstddef>
8#include <cstdint>
9#include <string>
10
12
14public:
15 TerminalRendererBinding(int cols, int rows, double font_size, bool matrix, int selection) {
17 config.cols = cols;
18 config.rows = rows;
19 config.font_size_pt = font_size;
20 config.theme = static_cast<term_renderer_theme_t>(0);
21 config.font_data = get_font_default_ptr(selection);
22 config.font_data_size = get_font_default_size(selection);
23 if (matrix)
24 SAFE_STRNCPY(config.font_spec, "Matrix", sizeof(config.font_spec));
25 result_ = term_renderer_create(&config, &renderer_);
26 }
28 if (renderer_)
29 term_renderer_destroy(renderer_);
30 }
33
34 bool valid() const {
35 return renderer_ && !result_;
36 }
37 int error() const {
38 return result_;
39 }
40 int cols() {
41 return term_renderer_get_cols(renderer_);
42 }
43 int rows() {
44 return term_renderer_get_rows(renderer_);
45 }
46 int width() {
47 return term_renderer_width_px(renderer_);
48 }
49 int height() {
50 return term_renderer_height_px(renderer_);
51 }
52 int setZalgo(int level) {
53 return term_renderer_set_zalgo(renderer_, level);
54 }
55 int feed(const std::string &text) {
56 return term_renderer_feed(renderer_, text.data(), text.size());
57 }
58 bool copyPixels(RasterPixels output) {
59 if (!renderer_) {
60 SET_ERRNO(ERROR_INVALID_STATE, "Terminal renderer is not initialized");
61 return false;
62 }
63 const int w = width(), h = height(), pitch = term_renderer_pitch(renderer_);
64 const uint8_t *pixels = term_renderer_pixels(renderer_);
65 if (!pixels || w <= 0 || h <= 0 || pitch <= 0 || static_cast<uint64_t>(pitch) < static_cast<uint64_t>(w) * 4) {
66 SET_ERRNO(ERROR_INVALID_STATE, "Terminal renderer has invalid pixel storage");
67 return false;
68 }
69 if (static_cast<uint64_t>(w) * h * 4 != output["length"].as<size_t>()) {
70 SET_ERRNO(ERROR_INVALID_PARAM, "Terminal pixel output size does not match %dx%d", w, h);
71 return false;
72 }
73 const size_t row_bytes = static_cast<size_t>(w) * 4;
74 if (static_cast<size_t>(pitch) == row_bytes) {
75 output.call<void>("set", emscripten::val(emscripten::typed_memory_view(row_bytes * h, pixels)));
76 } else {
77 for (int row = 0; row < h; ++row) {
78 output.call<void>(
79 "set", emscripten::val(emscripten::typed_memory_view(row_bytes, pixels + static_cast<size_t>(row) * pitch)),
80 row * row_bytes);
81 }
82 }
83 return true;
84 }
85
86private:
87 terminal_renderer_s *renderer_ = nullptr;
88 int result_;
89};
90
91EMSCRIPTEN_BINDINGS(ascii_chat_terminal_renderer) {
92 emscripten::register_type<RasterPixels>("RasterPixels", "Uint8ClampedArray");
93 emscripten::class_<TerminalRendererBinding>("TerminalRendererBinding")
94 .constructor<int, int, double, bool, int>()
95 .function("valid", &TerminalRendererBinding::valid)
96 .function("error", &TerminalRendererBinding::error)
97 .function("cols", &TerminalRendererBinding::cols)
98 .function("rows", &TerminalRendererBinding::rows)
99 .function("width", &TerminalRendererBinding::width)
100 .function("height", &TerminalRendererBinding::height)
101 .function("setZalgo", &TerminalRendererBinding::setZalgo)
102 .function("feed", &TerminalRendererBinding::feed)
103 .function("copyPixels", &TerminalRendererBinding::copyPixels);
104}
#define SET_ERRNO(code,...)
bool copyPixels(RasterPixels output)
TerminalRendererBinding(const TerminalRendererBinding &)=delete
TerminalRendererBinding & operator=(const TerminalRendererBinding &)=delete
TerminalRendererBinding(int cols, int rows, double font_size, bool matrix, int selection)
int feed(const std::string &text)
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:423
unsigned long long uint64_t
Definition common.h:63
unsigned char uint8_t
Definition common.h:60
@ ERROR_INVALID_STATE
@ ERROR_INVALID_PARAM
int term_renderer_get_rows(terminal_renderer_t *r)
int term_renderer_get_cols(terminal_renderer_t *r)
int term_renderer_width_px(terminal_renderer_t *r)
const uint8_t * term_renderer_pixels(terminal_renderer_t *r)
asciichat_error_t term_renderer_create(const term_renderer_config_t *cfg, terminal_renderer_t **out)
void term_renderer_destroy(terminal_renderer_t *r)
asciichat_error_t term_renderer_set_zalgo(terminal_renderer_t *r, int level)
asciichat_error_t term_renderer_feed(terminal_renderer_t *r, const char *ansi_frame, size_t len)
int term_renderer_pitch(terminal_renderer_t *r)
int term_renderer_height_px(terminal_renderer_t *r)
Terminal-to-pixel renderer and render-file output (audio + video).
term_renderer_theme_t
Terminal rendering theme.
Definition renderer.h:27
unsigned int get_font_default_size(int selection)
const unsigned char * get_font_default_ptr(int selection)
const uint8_t * font_data
Definition renderer.h:40
term_renderer_theme_t theme
Definition renderer.h:37
char font_spec[PLATFORM_MAX_PATH_LENGTH]
Definition renderer.h:38
EMSCRIPTEN_BINDINGS(ascii_chat_terminal_renderer)
EMSCRIPTEN_DECLARE_VAL_TYPE(RasterPixels)