ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
cells.c
Go to the documentation of this file.
3
4int glyph_shape_correlation_scalar(const int16_t samples[16], const int16_t mask[16]) {
5 int dot = 0;
6 for (int i = 0; i < 16; ++i)
7 dot += samples[i] * mask[i];
8 return dot;
9}
10void simd_pack_scalar(const uint8_t *rgb, uint32_t *out, size_t count) {
11 for (size_t i = 0; i < count; ++i)
12 out[i] = ((uint32_t)rgb[3 * i] << 16) | ((uint32_t)rgb[3 * i + 1] << 8) | rgb[3 * i + 2];
13}
14void simd_lookup_scalar(const uint8_t *luma, const uint32_t table[64], uint32_t *out, size_t count) {
15 for (size_t i = 0; i < count; ++i)
16 out[i] = table[luma[i] >> 2];
17}
18void simd_quantize_scalar(const uint32_t *rgb, uint32_t *out, size_t count, unsigned colors) {
19 for (size_t i = 0; i < count; ++i) {
20 uint8_t r = (uint8_t)(rgb[i] >> 16), g = (uint8_t)(rgb[i] >> 8), b = (uint8_t)rgb[i];
21 out[i] = colors == 16 ? rgb_to_16color(r, g, b) : rgb_to_256color(r, g, b);
22 }
23}
24size_t simd_run_scalar(const uint32_t *glyph, const uint32_t *fg, const uint32_t *bg, size_t count) {
25 size_t i = 1;
26 for (; i < count && glyph[i] == glyph[0] && fg[i] == fg[0] && bg[i] == bg[0]; ++i) {
27 }
28 return count ? i : 0;
29}
30void simd_halfblock_scalar(const uint32_t *top, const uint32_t *bottom, uint32_t *glyph, uint32_t *fg, uint32_t *bg,
31 size_t count, unsigned mode, const uint32_t keys[5]) {
32 for (size_t i = 0; i < count; ++i) {
33 uint32_t t = top[i], b = bottom[i];
34 unsigned yt = (76 * (t >> 16) + 150 * ((t >> 8) & 255) + 29 * (t & 255)) >> 8;
35 unsigned yb = (76 * (b >> 16) + 150 * ((b >> 8) & 255) + 29 * (b & 255)) >> 8;
36 bool transparent = mode == 0 ? yt < 16 && yb < 16 : t == 0 && b == 0;
37 glyph[i] = transparent ? (uint32_t)' ' : mode == 0 ? keys[yt >> 6] : keys[4];
38 if (mode == 0 || transparent)
39 fg[i] = bg[i] = UINT32_MAX;
40 }
41}
42#define CELLS(isa, mono, dot) \
43 {simd_luminance_##isa, \
44 simd_pack_##isa, \
45 simd_lookup_##isa, \
46 simd_quantize_##isa, \
47 simd_halfblock_##isa, \
48 simd_run_##isa, \
49 mono, \
50 dot}
51#if SIMD_SUPPORT_SSE2
52#define GLYPH_CORRELATION_X86 glyph_shape_correlation_sse2
54#else
55#define GLYPH_CORRELATION_X86 glyph_shape_correlation_scalar
56#endif
57#if SIMD_SUPPORT_SSSE3
59#endif
60#if SIMD_SUPPORT_AVX2
62#endif
63#if SIMD_SUPPORT_NEON
65#endif
66#if SIMD_SUPPORT_SVE
68#endif
72 (void)features;
73#if SIMD_SUPPORT_SSE2
74 if (features == CPU_FEATURE_SSE2)
75 return &simd_cells_sse2;
76#endif
77#if SIMD_SUPPORT_SSSE3
78 if (features == CPU_FEATURE_SSSE3)
79 return &simd_cells_ssse3;
80#endif
81#if SIMD_SUPPORT_AVX2
82 if (features == CPU_FEATURE_AVX2)
83 return &simd_cells_avx2;
84#endif
85#if SIMD_SUPPORT_NEON
86 if (features == CPU_FEATURE_NEON)
87 return &simd_cells_neon;
88#endif
89#if SIMD_SUPPORT_SVE
90 if (features == CPU_FEATURE_SVE)
91 return &simd_cells_sve;
92#endif
93 return &simd_cells_scalar;
94}
ANSI escape sequence utilities and fast color code generation.
int glyph_shape_correlation_avx2(const int16_t samples[16], const int16_t mask[16])
#define GLYPH_CORRELATION_X86
Definition cells.c:55
void simd_halfblock_scalar(const uint32_t *top, const uint32_t *bottom, uint32_t *glyph, uint32_t *fg, uint32_t *bg, size_t count, unsigned mode, const uint32_t keys[5])
Definition cells.c:30
void simd_lookup_scalar(const uint8_t *luma, const uint32_t table[64], uint32_t *out, size_t count)
Definition cells.c:14
const simd_cells_t simd_cells_scalar
Definition cells.c:69
void simd_quantize_scalar(const uint32_t *rgb, uint32_t *out, size_t count, unsigned colors)
Definition cells.c:18
int glyph_shape_correlation_scalar(const int16_t samples[16], const int16_t mask[16])
Definition cells.c:4
void simd_pack_scalar(const uint8_t *rgb, uint32_t *out, size_t count)
Definition cells.c:10
const simd_cells_t * simd_cells_backend(void)
Definition cells.c:70
size_t simd_run_scalar(const uint32_t *glyph, const uint32_t *fg, const uint32_t *bg, size_t count)
Definition cells.c:24
#define CELLS(isa, mono, dot)
Definition cells.c:42
void simd_emit_mono_neon(outbuf_t *out, const uint32_t *glyph, size_t count)
const simd_cells_t simd_cells_sve
const simd_cells_t simd_cells_sse2
const simd_cells_t simd_cells_avx2
const simd_cells_t simd_cells_ssse3
const simd_cells_t simd_cells_neon
const simd_backend_t * simd_backend(void)
Definition dispatch.c:36
unsigned char colors[(512 *256 *2) *3]
Definition fft.c:22
uint8_t rgb_to_16color(uint8_t r, uint8_t g, uint8_t b)
Definition ansi.c:354
uint8_t rgb_to_256color(uint8_t r, uint8_t g, uint8_t b)
Definition ansi.c:251
unsigned int uint32_t
Definition common.h:62
unsigned char uint8_t
Definition common.h:60
int glyph_shape_correlation_neon(const int16_t samples[16], const int16_t mask[16])
static bool size_t gotel_query_t * out
Definition queries.h:8
uint32_t required_features
Definition dispatch.h:14
The useful part of simd cells is in luminance: together they describe what is pending,...
Definition cells.h:10
int glyph_shape_correlation_sve(const int16_t samples[16], const int16_t mask[16])