📺🗿 Terminal graphics for the 21st century.

Overview


Master Build Status1.8 Build Status Latest Release

AboutGalleryPackagesDevelopment

Chafa is a command-line utility that converts all kinds of images, including animated GIFs, into sixel or ANSI/Unicode character output that can be displayed in a terminal.

It is highly configurable, with support for alpha transparency and multiple color modes and color spaces, combining selectable ranges of Unicode characters to produce the desired output.

The core functionality is provided by a C library with a public, well-documented API.

Both library and frontend tools are covered by the Lesser GPL license, version 3 or later (LGPLv3+).

The official web pages and C API documentation can be found online. Check out the gallery for screenshots.

Installing

Chafa is most likely packaged for your distribution, so if you're not going to hack on it, you're better off using official packages. If you want to build the latest and greatest yourself, read on.

You will need GCC, make, Autoconf, Automake, Libtool and the GLib development package installed to compile Chafa from its git repository. If you want to build the command-line tool chafa and not just the library, you will additionally need the ImageMagick development packages.

If you want to build documentation, you will also need gtk-doc.

Start by cloning the repository:

$ git clone https://github.com/hpjansson/chafa.git

Then cd to the toplevel directory and issue the following shell commands:

$ ./autogen.sh
$ make
$ sudo make install

That should do it!

Issues
  • sixel support

    sixel support

    You mentioned sixel in TODO. However I didn't realize how sixel perform well in the terminal until I see this: https://github.com/hackerb9/lsix . It's a simple bash script, and it might provide some inspiration?

    feature 
    opened by cdluminate 41
  • Custom font powered by kmeans clustering

    Custom font powered by kmeans clustering

    This is still a work-in-progress, don't merge.

    The core part has been finished. The remaining work is parameter tuning.

    Closes: https://github.com/hpjansson/chafa/issues/20

    opened by cdluminate 22
  • [WIP/Don't merge] Higher Resolution character art with Custom font

    [WIP/Don't merge] Higher Resolution character art with Custom font

    The finest resolution of block symbols in Unicode is 2x2. I created a finer font with 3x3 resolution block symbols. The custom font use private area of Unicode, and starts from 0x10c0001.

    The resolution is 3x3, so the number of all possible blocks is the ninth power of 2, i.e. 512.

    We can create 4x4 resolution font which fits better with 8x8 mask in chafa-symbols.c, but 4x4 resolution results in 2^16 = 65536 symbols. Maybe the performance will decrease drastically with such resolution. So I created 3x3 blocks instead.

    The 3x3 resolution version is called BE512, i.e. "Block Extended 512".

    2018-09-15_13-50

    Remaining works

    • [ ] add definition in autoconf and C source to guard the usage of custom font
    • [ ] sort of segfault when enabled all content from BE512.c
    • [ ] add new tag: CHAFA_SYMBOL_TAG_BE512
    • [ ] Are custom blocks in 3x3 resolution really improving the visual experience?
    opened by cdluminate 19
  • Smolscale uses too much stack space

    Smolscale uses too much stack space

    System information:

    OS: Alpine Linux (edge) Terminal emulator: foot / alacritty chafa version: 1.8.0

    Description

    Most image files get rendered with no problem, while some crashes with SIGSEGV (I tried on both terminal emulators with both sixel and symbols format)

    Here is a sample strace I get:

    $ strace chafa Pictures/Wallpapers/00.jpg
    
    execve("/usr/bin/chafa", ["chafa", "Pictures/Wallpapers/00.jpg"], 0x7ffdd0ae31c8 /* 106 vars */) = 0
    arch_prctl(ARCH_SET_FS, 0x7fbef474cb48) = 0
    set_tid_address(0x7fbef474cf90)         = 7543
    brk(NULL)                               = 0x556512eab000
    brk(0x556512ead000)                     = 0x556512ead000
    mmap(0x556512eab000, 4096, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x556512eab000
    open("/etc/ld-musl-x86_64.path", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libMagickWand-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1156936, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1163264, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef459a000
    mmap(0x7fbef45ac000, 884736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x12000) = 0x7fbef45ac000
    mmap(0x7fbef4684000, 192512, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xea000) = 0x7fbef4684000
    mmap(0x7fbef46b3000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x118000) = 0x7fbef46b3000
    close(3)                                = 0
    open("/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=751808, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \332\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 757760, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef44e1000
    mmap(0x7fbef44ee000, 442368, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef44ee000
    mmap(0x7fbef455a000, 225280, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x79000) = 0x7fbef455a000
    mmap(0x7fbef4592000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb0000) = 0x7fbef4592000
    close(3)                                = 0
    open("/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libchafa.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=256512, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\324\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 262144, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef44a1000
    mmap(0x7fbef44ae000, 94208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef44ae000
    mmap(0x7fbef44c5000, 86016, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x24000) = 0x7fbef44c5000
    mmap(0x7fbef44da000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38000) = 0x7fbef44da000
    close(3)                                = 0
    open("/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libglib-2.0.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1085128, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1093632, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4396000
    mmap(0x7fbef43b2000, 417792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1c000) = 0x7fbef43b2000
    mmap(0x7fbef4418000, 544768, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x82000) = 0x7fbef4418000
    mmap(0x7fbef449e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x107000) = 0x7fbef449e000
    mmap(0x7fbef44a0000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef44a0000
    close(3)                                = 0
    open("/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libMagickCore-7.Q16HDRI.so.10", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=2181144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 2310144, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4162000
    mmap(0x7fbef418a000, 1314816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x28000) = 0x7fbef418a000
    mmap(0x7fbef42cb000, 376832, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x169000) = 0x7fbef42cb000
    mmap(0x7fbef4328000, 450560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1c5000) = 0x7fbef4328000
    mmap(0x7fbef4378000, 122880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef4378000
    close(3)                                = 0
    open("/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libX11.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1185936, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\330\1\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1191936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef403f000
    mmap(0x7fbef405a000, 454656, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1b000) = 0x7fbef405a000
    mmap(0x7fbef40c9000, 598016, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8a000) = 0x7fbef40c9000
    mmap(0x7fbef415b000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x11b000) = 0x7fbef415b000
    close(3)                                = 0
    open("/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbz2.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=58024, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\270\"\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 61440, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4030000
    mmap(0x7fbef4032000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef4032000
    mmap(0x7fbef403b000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef403b000
    mmap(0x7fbef403d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xc000) = 0x7fbef403d000
    close(3)                                = 0
    open("/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libpng16.so.16", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=190256, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 i\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 196608, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef4000000
    mmap(0x7fbef4006000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef4006000
    mmap(0x7fbef4023000, 45056, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x23000) = 0x7fbef4023000
    mmap(0x7fbef402e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2d000) = 0x7fbef402e000
    close(3)                                = 0
    open("/lib/libz.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=100144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0003\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 106496, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3fe6000
    mmap(0x7fbef3fe9000, 57344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3fe9000
    mmap(0x7fbef3ff7000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x11000) = 0x7fbef3ff7000
    mmap(0x7fbef3ffe000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x17000) = 0x7fbef3ffe000
    close(3)                                = 0
    open("/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbrotlidec.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=42672, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\20\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 49152, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3fda000
    mmap(0x7fbef3fdb000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3fdb000
    mmap(0x7fbef3fe1000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x7fbef3fe1000
    mmap(0x7fbef3fe4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3fe4000
    close(3)                                = 0
    open("/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libpcre.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=370464, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360!\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 376832, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f7e000
    mmap(0x7fbef3f80000, 245760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3f80000
    mmap(0x7fbef3fbc000, 110592, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x3e000) = 0x7fbef3fbc000
    mmap(0x7fbef3fd8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x59000) = 0x7fbef3fd8000
    close(3)                                = 0
    open("/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libintl.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=42744, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320$\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 53248, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f71000
    mmap(0x7fbef3f73000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3f73000
    mmap(0x7fbef3f79000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3f79000
    mmap(0x7fbef3f7b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3f7b000
    mmap(0x7fbef3f7d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f7d000
    close(3)                                = 0
    open("/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/liblcms2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=340656, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 352256, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3f1b000
    mmap(0x7fbef3f26000, 192512, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3f26000
    mmap(0x7fbef3f55000, 81920, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x3a000) = 0x7fbef3f55000
    mmap(0x7fbef3f6a000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x4e000) = 0x7fbef3f6a000
    mmap(0x7fbef3f6f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f6f000
    close(3)                                = 0
    open("/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libxml2.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=1213568, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\374\2\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 1220608, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3df1000
    mmap(0x7fbef3e20000, 708608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2f000) = 0x7fbef3e20000
    mmap(0x7fbef3ecd000, 274432, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xdc000) = 0x7fbef3ecd000
    mmap(0x7fbef3f10000, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x11e000) = 0x7fbef3f10000
    mmap(0x7fbef3f1a000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3f1a000
    close(3)                                = 0
    open("/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libfontconfig.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=239520, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300w\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 245760, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3db5000
    mmap(0x7fbef3dbc000, 110592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x7fbef3dbc000
    mmap(0x7fbef3dd7000, 94208, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x22000) = 0x7fbef3dd7000
    mmap(0x7fbef3dee000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38000) = 0x7fbef3dee000
    close(3)                                = 0
    open("/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXext.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=72544, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\310C\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 77824, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3da2000
    mmap(0x7fbef3da6000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3da6000
    mmap(0x7fbef3daf000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef3daf000
    mmap(0x7fbef3db3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x7fbef3db3000
    close(3)                                = 0
    open("/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libltdl.so.7", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=38664, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220$\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 45056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d97000
    mmap(0x7fbef3d99000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3d99000
    mmap(0x7fbef3d9d000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d9d000
    mmap(0x7fbef3da0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3da0000
    close(3)                                = 0
    open("/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libxcb.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=153312, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\267\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 159744, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d70000
    mmap(0x7fbef3d7b000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3d7b000
    mmap(0x7fbef3d8c000, 36864, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x1c000) = 0x7fbef3d8c000
    mmap(0x7fbef3d95000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x24000) = 0x7fbef3d95000
    close(3)                                = 0
    open("/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbrotlicommon.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=136952, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\20\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 143360, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d4d000
    mmap(0x7fbef3d4e000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3d4e000
    mmap(0x7fbef3d4f000, 126976, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3d4f000
    mmap(0x7fbef3d6e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x7fbef3d6e000
    close(3)                                = 0
    open("/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/liblzma.so.5", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=136848, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3504\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 143360, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d2a000
    mmap(0x7fbef3d2d000, 77824, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3d2d000
    mmap(0x7fbef3d40000, 45056, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x16000) = 0x7fbef3d40000
    mmap(0x7fbef3d4b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x7fbef3d4b000
    close(3)                                = 0
    open("/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libexpat.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=145144, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pA\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 151552, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3d05000
    mmap(0x7fbef3d09000, 90112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3d09000
    mmap(0x7fbef3d1f000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x1a000) = 0x7fbef3d1f000
    mmap(0x7fbef3d27000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x21000) = 0x7fbef3d27000
    close(3)                                = 0
    open("/lib/libuuid.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=30544, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 36864, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cfc000
    mmap(0x7fbef3cfe000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cfe000
    mmap(0x7fbef3d02000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d02000
    mmap(0x7fbef3d03000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x6000) = 0x7fbef3d03000
    close(3)                                = 0
    open("/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXau.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=13896, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\350\21\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 20480, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cf7000
    mmap(0x7fbef3cf8000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x7fbef3cf8000
    mmap(0x7fbef3cf9000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cf9000
    mmap(0x7fbef3cfa000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cfa000
    close(3)                                = 0
    brk(0x556512eae000)                     = 0x556512eae000
    open("/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libXdmcp.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=26336, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\270!\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 32768, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cef000
    mmap(0x7fbef3cf1000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cf1000
    mmap(0x7fbef3cf3000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3cf3000
    mmap(0x7fbef3cf5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x5000) = 0x7fbef3cf5000
    close(3)                                = 0
    open("/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libbsd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=72536, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340H\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 81920, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3cdb000
    mmap(0x7fbef3cdf000, 36864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3cdf000
    mmap(0x7fbef3ce8000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x7fbef3ce8000
    mmap(0x7fbef3cec000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10000) = 0x7fbef3cec000
    mmap(0x7fbef3cee000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cee000
    close(3)                                = 0
    open("/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libmd.so.0", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=43040, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 $\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 49152, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3ccf000
    mmap(0x7fbef3cd1000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x2000) = 0x7fbef3cd1000
    mmap(0x7fbef3cd7000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x8000) = 0x7fbef3cd7000
    mmap(0x7fbef3cd9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3cd9000
    close(3)                                = 0
    mprotect(0x7fbef46b3000, 8192, PROT_READ) = 0
    mprotect(0x7fbef4592000, 28672, PROT_READ) = 0
    mprotect(0x7fbef44da000, 24576, PROT_READ) = 0
    mprotect(0x7fbef449e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef4749000, 4096, PROT_READ) = 0
    mprotect(0x7fbef4328000, 86016, PROT_READ) = 0
    mprotect(0x7fbef415b000, 12288, PROT_READ) = 0
    mprotect(0x7fbef403d000, 4096, PROT_READ) = 0
    mprotect(0x7fbef402e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3ffe000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3fe4000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3fd8000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3f7b000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3f6a000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3f10000, 36864, PROT_READ) = 0
    mprotect(0x7fbef3dee000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3db3000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3da0000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d95000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d6e000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d4b000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3d27000, 8192, PROT_READ) = 0
    mprotect(0x7fbef3d03000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cfa000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cf5000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cec000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3cd9000, 4096, PROT_READ) = 0
    mprotect(0x556511a11000, 16384, PROT_READ) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=614108351}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ccd000
    mmap(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cc8000
    rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
    rt_sigaction(SIGINT, {sa_handler=0x556511a06d05, sa_mask=[], sa_flags=SA_RESTORER|SA_RESETHAND|0xffffffff00000000, sa_restorer=0x7fbef46fcc8a}, NULL, 8) = 0
    mmap(NULL, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbd000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbc000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3cbb000
    mmap(NULL, 86016, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca6000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca5000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca4000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca3000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca2000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ca0000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9e000
    futex(0x7fbef44a00e8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    ioctl(1, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9c000
    brk(0x556512eaf000)                     = 0x556512eaf000
    futex(0x7fbef44a00e8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c9a000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    munmap(0x7fbef3c98000, 8192)            = 0
    ioctl(1, TIOCGWINSZ, {ws_row=42, ws_col=210, ws_xpixel=1890, ws_ypixel=1008}) = 0
    ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
    ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon -echo ...}) = 0
    open("/usr/share/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 3773
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    mmap(NULL, 3773, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c97000
    munmap(0x7fbef3c97000, 3773)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/policy.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    munmap(0x7fbef3c96000, 8192)            = 0
    munmap(0x7fbef3c98000, 8192)            = 0
    open("/usr/share/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 1642
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c98000
    mmap(NULL, 1642, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c97000
    munmap(0x7fbef3c97000, 1642)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/log.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=926796892}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994417
    munmap(0x7fbef3c96000, 8192)            = 0
    munmap(0x7fbef3c98000, 8192)            = 0
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=927218663}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994417
    getcwd("/home/follie", 4096)            = 13
    getpid()                                = 7543
    readlink("/proc/7543/exe", "/usr/bin/chafa", 4096) = 14
    stat("/usr/bin/chafa", {st_mode=S_IFREG|0755, st_size=88232, ...}) = 0
    access("/usr/bin/chafa", F_OK)          = 0
    sysinfo({uptime=3691, loads=[62976, 50496, 48544], totalram=15701123072, freeram=8627056640, sharedram=80433152, bufferram=1581056, totalswap=31402745856, freeswap=31402745856, procs=964, totalhigh=0, freehigh=0, mem_unit=1}) = 0
    prlimit64(0, RLIMIT_NOFILE, NULL, {rlim_cur=1024, rlim_max=4*1024}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=625634361}) = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=5702532}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_SET)                   = 0
    read(3, "\377\330\377\341\0\30", 6)     = 6
    close(3)                                = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=6183952}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_SET)                   = 0
    read(3, "\377\330\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21"..., 100) = 100
    close(3)                                = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c96000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c92000
    open("/usr/share/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/usr/lib/ImageMagick-7.1.0//config-Q16HDRI/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/etc/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = 3
    lseek(3, 0, SEEK_END)                   = 1383
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c90000
    mmap(NULL, 1383, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c8f000
    munmap(0x7fbef3c8f000, 1383)            = 0
    close(3)                                = 0
    open("/usr/share/doc/ImageMagick-7/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    open("/home/follie/.config/ImageMagick/colors.xml", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8e000
    munmap(0x7fbef3c8e000, 8192)            = 0
    munmap(0x7fbef3c90000, 8192)            = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c90000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8e000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c8d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c89000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c88000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c87000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c86000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c85000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c84000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c83000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c82000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c81000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c80000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7f000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7e000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7d000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7c000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7b000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c7a000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c79000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c78000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c77000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c76000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c75000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c74000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c73000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c72000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c71000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c69000
    stat("jpg", 0x7ffcf71e3bd0)             = -1 ENOENT (No such file or directory)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c67000
    brk(0x556512eb0000)                     = 0x556512eb0000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c66000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c64000
    readlink("/usr", 0x7ffcf71debef, 4042)  = -1 EINVAL (Invalid argument)
    readlink("/usr/lib", 0x7ffcf71debef, 4046) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0", 0x7ffcf71debef, 4064) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI", 0x7ffcf71debef, 4081) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders", 0x7ffcf71debef, 4088) = -1 EINVAL (Invalid argument)
    readlink("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", 0x7ffcf71debef, 4096) = -1 EINVAL (Invalid argument)
    stat("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", {st_mode=S_IFREG|0755, st_size=1070, ...}) = 0
    access("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", F_OK) = 0
    open("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.la", O_RDONLY|O_LARGEFILE) = 3
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c63000
    read(3, "# jpeg.la - a libtool library fi"..., 1024) = 1024
    read(3, "lib/ImageMagick-7.1.0/modules-Q1"..., 1024) = 46
    read(3, "", 1024)                       = 0
    close(3)                                = 0
    munmap(0x7fbef3c63000, 4096)            = 0
    open("/usr/lib/ImageMagick-7.1.0/modules-Q16HDRI/coders/jpeg.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=51016, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 57344, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3c56000
    mmap(0x7fbef3c59000, 24576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x7fbef3c59000
    mmap(0x7fbef3c5f000, 12288, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7fbef3c5f000
    mmap(0x7fbef3c62000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb000) = 0x7fbef3c62000
    close(3)                                = 0
    open("/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/local/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/libjpeg.so.8", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    fstat(3, {st_mode=S_IFREG|0755, st_size=546640, ...}) = 0
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 E\0\0\0\0\0\0"..., 960) = 960
    mmap(NULL, 552960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3bcf000
    mmap(0x7fbef3bd3000, 258048, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x4000) = 0x7fbef3bd3000
    mmap(0x7fbef3c12000, 270336, PROT_READ, MAP_PRIVATE|MAP_FIXED, 3, 0x43000) = 0x7fbef3c12000
    mmap(0x7fbef3c54000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x84000) = 0x7fbef3c54000
    close(3)                                = 0
    mprotect(0x7fbef3c62000, 4096, PROT_READ) = 0
    mprotect(0x7fbef3c54000, 4096, PROT_READ) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=639779233}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bcd000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=942991478}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=640734670}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=640839503}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    mmap(NULL, 3493745, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3867000
    close(3)                                = 0
    munmap(0x7fbef3867000, 3493745)         = 0
    madvise(0x7fbef3bc2000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bc1000, 32768)           = 0
    munmap(0x7fbef3bc0000, 4096)            = 0
    munmap(0x7fbef3bbc000, 16384)           = 0
    munmap(0x7fbef3bc9000, 16384)           = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=945256780}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=642980367}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=643096793}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    fstat(3, {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    lseek(3, 0, SEEK_CUR)                   = 0
    fstat(3, {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    close(3)                                = 0
    madvise(0x7fbef3bc2000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bc1000, 32768)           = 0
    munmap(0x7fbef3bc0000, 4096)            = 0
    munmap(0x7fbef3bbc000, 16384)           = 0
    munmap(0x7fbef3bc9000, 16384)           = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc9000
    clock_gettime(CLOCK_MONOTONIC_RAW, {tv_sec=3687, tv_nsec=947618253}) = 0
    times({tms_utime=0, tms_stime=1 /* 0.01 s */, tms_cutime=0, tms_cstime=0}) = 1431994419
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc1000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bc0000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=645378389}) = 0
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=645484688}) = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbc000
    stat("Pictures/Wallpapers/00.jpg", {st_mode=S_IFREG|0644, st_size=3493745, ...}) = 0
    open("Pictures/Wallpapers/00.jpg", O_RDONLY|O_LARGEFILE) = 3
    readv(3, [{iov_base="\377\330", iov_len=2}, {iov_base="\377\341\0\30Exif\0\0II*\0\10\0\0\0\0\0\0\0\0\0\0\0\377\354\0\21Du"..., iov_len=1024}], 2) = 1026
    lseek(3, -1026, SEEK_CUR)               = 0
    mmap(NULL, 3493745, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbef3867000
    close(3)                                = 0
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3863000
    mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef385d000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3859000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=646939844}) = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3858000
    mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3851000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3850000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef384c000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef384a000
    madvise(0x7fbef3852000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3851000, 28672)           = 0
    munmap(0x7fbef3858000, 4096)            = 0
    munmap(0x7fbef384c000, 16384)           = 0
    munmap(0x7fbef384a000, 8192)            = 0
    munmap(0x7fbef3850000, 4096)            = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3858000
    clock_gettime(CLOCK_REALTIME, {tv_sec=1645090473, tv_nsec=649286183}) = 0
    mmap(NULL, 99532868, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed96b000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed963000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed95b000
    mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed953000
    mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeed950000
    munmap(0x7fbeed953000, 32768)           = 0
    munmap(0x7fbeed95b000, 32768)           = 0
    munmap(0x7fbeed963000, 32768)           = 0
    munmap(0x7fbef3863000, 16384)           = 0
    munmap(0x7fbef385d000, 24576)           = 0
    munmap(0x7fbeed950000, 12288)           = 0
    munmap(0x7fbef3867000, 3493745)         = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bbb000
    mmap(NULL, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3bb4000
    munmap(0x7fbef3bbb000, 4096)            = 0
    madvise(0x7fbef3bb7000, 4096, MADV_FREE) = 0
    madvise(0x7fbef3bb5000, 4096, MADV_FREE) = 0
    madvise(0x7fbef3bb9000, 4096, MADV_FREE) = 0
    munmap(0x7fbef3bb4000, 28672)           = 0
    munmap(0x7fbef3c69000, 16384)           = 0
    munmap(0x7fbef3c6d000, 16384)           = 0
    clock_gettime(CLOCK_MONOTONIC, {tv_sec=3690, tv_nsec=369650870}) = 0
    mmap(NULL, 33177620, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeeb9c6000
    mmap(NULL, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ba4000
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6f000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3c6b000
    mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef3ba0000
    mmap(NULL, 1718084, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39fc000
    mmap(NULL, 6872276, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbeeb338000
    mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39f6000
    sched_getaffinity(0, 128, [0, 1, 2, 3, 4, 5, 6, 7]) = 32
    sched_getaffinity(0, 128, [0, 1, 2, 3, 4, 5, 6, 7]) = 32
    gettid()                                = 7543
    sched_getattr(7543, {size=56, sched_policy=SCHED_OTHER, sched_flags=0, sched_nice=0, sched_priority=0, sched_runtime=0, sched_deadline=0, sched_period=0, sched_util_min=0, sched_util_max=0}, 56, 0) = 0
    sched_setattr(7543, {size=56, sched_policy=SCHED_OTHER, sched_flags=0, sched_nice=0, sched_priority=0, sched_runtime=0, sched_deadline=0, sched_period=0, sched_util_min=0, sched_util_max=0}, 0) = 0
    rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
    membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0) = 0
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39d3000
    mprotect(0x7fbef39d5000, 135168, PROT_READ|PROT_WRITE) = 0
    rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
    clone(child_stack=0x7fbef39f5af8, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[7544], tls=0x7fbef39f5b38, child_tidptr=0x7fbef474cf90) = 7544
    rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
    futex(0x7fbef3ba0950, FUTEX_WAKE_PRIVATE, 1) = 1
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef39b0000
    mprotect(0x7fbef39b2000, 135168, PROT_READ|PROT_WRITE) = 0
    rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1 RT_2], [], 8) = 0
    clone(child_stack=0x7fbef39d2af8, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|0x400000, parent_tid=[7545], tls=0x7fbef39d2b38, child_tidptr=0x7fbef474cf90) = 7545
    rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
    futex(0x7fbef3ba0950, FUTEX_WAKE_PRIVATE, 1) = 1
    mmap(NULL, 143360, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbef398d000
    +++ killed by SIGSEGV (core dumped) +++
    fish: Job 1, 'strace chafa Pictures/Wallpaper…' terminated by signal SIGSEGV (Address boundary error)
    
    opened by FollieHiyuki 17
  • Now Konsole supports graphics

    Now Konsole supports graphics

    Good news: Konsole (git) supports sixel, iTerm2 and kitty protocols! :tada: Works for me :tm: :

    diff --git a/chafa/chafa-term-db.c b/chafa/chafa-term-db.c
    index b5cacee..472215e 100644
    --- a/chafa/chafa-term-db.c
    +++ b/chafa/chafa-term-db.c
    @@ -321,6 +321,11 @@ detect_capabilities (ChafaTermInfo *ti, gchar **envp)
             gfx_seqs = sixel_seqs;
         }
    
    +    if (strcasecmp (term_program, "konsole"))
    +    {
    +        gfx_seqs = sixel_seqs;
    +    }
    +
         /* Apple Terminal sets TERM=xterm-256color, and does not support truecolor */
         if (!g_ascii_strcasecmp (term_program, "Apple_Terminal"))
             color_seq_list = color_256_list;
    
    opened by data-man 13
  • Last line in terminal while playing animation is not used / empty / only cursor

    Last line in terminal while playing animation is not used / empty / only cursor

    Hello And I start with the highest five for this amazing stuff. Respect.

    What is the proper way to use the last line of the terminal while playing back animation? Basically I want to display chafa stuff fullscreen - from top to bottom. https://photos.app.goo.gl/w6Z55vwFN2DrWbd68 The brownish gap is the last line in the image.

    I used tput smcup to check if it makes any difference. It does not in my case. The whole thing runs in a fullscreen alacritty like a greased lightning but I'm not able to properly solve this. Well, I'm saying "not able" because one can always resize the terminal / the window itself - adding one more line / some more height pixels - and the last line gets offscreen. But I have a hunch that there is a less hacky solution.

    Many thanks! Andras

    opened by crmabs 12
  • apt installation guide for Debian testing/unstable user

    apt installation guide for Debian testing/unstable user

    https://tracker.debian.org/pkg/chafa

    Chafa has been available for Debian testing/unstable user for a while. Maybe we can add a hint to readme? like this:

    +# install with apt
    +
    + Debian testing/unstable users can install chafa directly with apt.
    +
    +sudo apt install chafa
    
     # build from git
     blah blah blah
    

    If it looks reasonable, I can fill the wording and submit a PR.

    opened by cdluminate 10
  • Ubuntu PPA?

    Ubuntu PPA?

    Hi @cdluminate , hope you're well.

    When I make new releases, people will usually ask for an Ubuntu PPA, so I'm considering setting one up. Is it okay if I base it off your existing packages? This would just be a stopgap for when Ubuntu is shipping older versions, obviously.

    opened by hpjansson 9
  • Legacy computer symbol support

    Legacy computer symbol support

    PETSCII, teletext, etc. When/if this makes it into Unicode, we should support it: https://www.unicode.org/L2/L2017/17435r-terminals-prop.pdf

    Mentioned by @kilobyte in https://github.com/hpjansson/chafa/pull/17#issuecomment-421791991.

    feature symbols 
    opened by hpjansson 9
  • [i386] port chafa to i386 architecture

    [i386] port chafa to i386 architecture

    chafa-popcnt.c uses intrinsic _mm_popcnt_u64 which is not supported by i386. And the result is that chafa failed to build on i386 architecture: https://buildd.debian.org/status/package.php?p=chafa

    I have successfully ported chafa to i386, with the following patch.

    diff --git a/chafa/chafa-popcnt.c b/chafa/chafa-popcnt.c
    index 22b3eb4..0d95e39 100644
    --- a/chafa/chafa-popcnt.c
    +++ b/chafa/chafa-popcnt.c
    @@ -26,7 +26,12 @@
     gint
     chafa_pop_count_u64_builtin (guint64 v)
     {
    +#if !defined(CHAFA_REG_BIT32)
         return (gint) _mm_popcnt_u64 (v);
    +#else
    +    __int32_t* w = (__int32_t*)&v;
    +    return (gint) _mm_popcnt_u32(w[0]) + _mm_popcnt_u32(w[1]);
    +#endif
     }
     
     void
    @@ -34,13 +39,20 @@ chafa_pop_count_vu64_builtin (const guint64 *vv, gint *vc, gint n)
     {
         while (n--)
         {
    +#if !defined(CHAFA_REG_BIT32)
             *(vc++) = _mm_popcnt_u64 (*(vv++));
    +#else
    +	__int32_t* w = (__int32_t*)vv;
    +        *(vc++) = _mm_popcnt_u32(w[0]) + _mm_popcnt_u32(w[1]);
    +	vv++;
    +#endif
         }
     }
     
     void
     chafa_hamming_distance_vu64_builtin (guint64 a, const guint64 *vb, gint *vc, gint n)
     {
    +#if !defined(CHAFA_REG_BIT32)
         while (n >= 4)
         {
             n -= 4;
    @@ -50,6 +62,15 @@ chafa_hamming_distance_vu64_builtin (guint64 a, const guint64 *vb, gint *vc, gin
             *(vc++) = _mm_popcnt_u64 (a ^ *(vb++));
         }
     
    -    while (n--)
    +    while (n--) {
             *(vc++) = _mm_popcnt_u64 (a ^ *(vb++));
    +    }
    +#else
    +    __int32_t* aa = (__int32_t*)&a;
    +    __int32_t* wb = (__int32_t*)vb;
    +    while (n--) {
    +        *(vc++) = _mm_popcnt_u32(aa[0]^wb[0]) + _mm_popcnt_u32(aa[1]^wb[1]);
    +	wb += 2;
    +    }
    +#endif
     }
    

    reference _mm_popcnt_u64 _mm_popcnt_u32

    https://github.com/zhengxwen/HIBAG/commit/d50322268e211ae8e9152ddc0d2faacc808d8591

    opened by cdluminate 9
  • Invisible SVG

    Invisible SVG

    SVG seems to not be rendered by chafa. I don’t know if they are rendered as black on black or if not rendered at all.

    I’v tried multiple backend and playing with --fg /--bg : I still have a black empty space on my terminal.

    mail

    opened by ploum 8
  • windows port

    windows port

    Hi, Before I'm getting lost in the maze I'd like to ask this: Is it possible to compile it for windows? I can imagine that the question sounds rather stupid , sorry about that. I'm just hoping it's not. I tried compiling in different environments (cygwin, mingw, etc) but so far I wasn't able to squeeze out an exe. It all went well, hunted down packages then re-run your scripts like a good boy,... close-yet-so-far So - Could you pls point me to the right direction? Is it possible at all or flat out nonsense? Thanks: Andras

    ps: Alright, now I noticed that the INSTALL contains info about compiling to different platforms. So the question above is answered. Instead I got a cheeky one: I'm looking for one proper way to do it, possibly with/close to the simplicity of the linux compile. My head is spinning from the so many options and possibilities regarding cross compiling.

    opened by crmabs 7
  • Building for windows

    Building for windows

    What is the state of the project on windows? I tried building something based on example.c but i'm getting a SIGSEGV when calling chafa_symbol_map_new. In gdb all it tells me is:

    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffeca733416 in ntdll!RtlWaitOnAddress () from C:\WINDOWS\SYSTEM32\ntdll.dll
    
    opened by oakes 3
  • Python bindings

    Python bindings

    This library looks great. I was wondering if there is a python package available that wraps this? Would be great to have picture previews directly in the python terminal!

    help wanted 
    opened by hhoeflin 2
  • reserved identifier violation

    reserved identifier violation

    I would like to point out that an identifier like “__CHAFA_TERM_INFO_H__does eventually not fit to the expected naming convention of the C language standard. Would you like to adjust your selection for unique names?

    opened by elfring 1
  • [fontgen] upgrade to python3 and make it easier to use

    [fontgen] upgrade to python3 and make it easier to use

    Debian has upgraded it's fontforge python version to 3.X . So in the next update we will be able to get rid of python2.

    As discussed previously, this tool should be reworked to make it easier to use. Apart from the code cleanups and refactoring. I'm going to build a pipeline using the following dataset so users can build custom font with a single command. https://www.kaggle.com/c/tiny-imagenet/data

    Please assign this issue to me. (I'm recently preparing for examinations and other things, still need some time to actually implement it)

    opened by cdluminate 1
Releases(1.10.3)
  • 1.10.3(May 4, 2022)

  • 1.10.2(Apr 24, 2022)

    This release adds security/responsible disclosure guidelines and fixes a few issues with input validation in the chafa command-line tool.

    • Added disclosure guidelines in SECURITY.md (suggested by @JamieSlome).

    • Bug fixes:

      • huntr.dev: Null pointer dereference in libnsgif with crafted GIF file (reported by @JieyongMa).
      • [unfiled] File magic would not effectively rule out internal loaders.
      • [unfiled] Very big images could cause absurd allocation requests triggering an abort in the loader.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.10.2.tar.xz(500.45 KB)
    chafa-1.10.2.tar.xz.asc(488 bytes)
  • 1.10.1(Apr 3, 2022)

  • 1.10.0(Mar 20, 2022)

    This is a feature release focused on compatibility, presentation and ergonomics.

    • New option: --animate <bool>. On by default. Can be turned off to replace animations with a still frame. Suggested by @ploum in #79.

    • New option: --center <bool> or -C <bool>. Off by default. Can be turned on to center images. Suggested by @ploum in #83.

    • New options: --margin-bottom <n> and --margin-right <n>. These permit using all available space (with --margin-bottom 0) or some smaller amount. Suggested by @crmabs in #61.

    • New option: --polite <bool>. On by default. Can be turned off to correct issues caused by previous terminal state (e.g. no sixel scrolling) and improve presentation (e.g. by temporarily hiding the cursor). This can leave the terminal in an altered state, which is somewhat rude.

    • New option: --threads <n>. Allows manually specifying the number of threads to use. Defaults to one per detected logical CPU core.

    • When invoked with redirected input and no arguments, act like a filter as if invoked with -. Here's an example that downloads an image, converts it to Unicode text and mails it to [email protected]:

      $ curl https://hpjansson.org/chafa/img/lc.jpg \
        | chafa -f symbols -c none -s 77 --invert --dither bayer \
        | mailx [email protected]
      
    • If input or output is being redirected, default to playing animations only once instead of looping forever. This can be overridden with -d inf.

    • Replaced obsolete Autoconf macros (@mikelolasagasti).

    • Improved image loaders:

      • GIF: Load GIF87a images as well as GIF89a.
      • PNG: Add an internal copy of LodePNG, bypassing ImageMagick. This improves performance and helps with eventually phasing out the latter.
      • XWD: Support images generated by convert.
    • Improved terminal support:

      • Contour: Enable sixel support (@data-man).
      • foot: Open-ended TERM string matching (@dnkl).
      • Konsole: Enable sixel support (@data-man).
      • WezTerm: Enable sixel support.
    • Bug fixes:

      • #76 Smolscale uses too much stack space (found by @FollieHiyuki).
      • #81 Chafa --version is returned to stderr, not stdout (found by @ploum).
      • [unfiled] Potential memory overrun when using Floyd-Steinberg dithering in symbols mode.
      • [unfiled] iTerm2 compatibility issue with WezTerm and possibly others.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.10.0.tar.xz(499.42 KB)
    chafa-1.10.0.tar.xz.asc(488 bytes)
  • 1.8.0(Aug 31, 2021)

    This is a major feature release.

    • Added basic support for the Kitty and iTerm2 graphics protocols. These are enabled automatically when corresponding terminal support is detected, or manually with -f kitty or -f iterm.

    • Implemented an 8-color mode, selectable with -c 8 (@hodefoting).

    • Implemented a foreground-only switch, --fg-only. This produces character art using foreground colors only, and will avoid modifying or resetting the background color. Looks best with non-contiguous symbols (e.g. ascii).

    • Added builtins for Japanese kana fullwidth symbols. These can now be used without loading any external fonts (try -c none --symbols wide).

    • Added builtins for legacy computer symbols (mainly wedges and sextant blocks). These were widely used in PETSCII and Teletext, and can be enabled using --symbols or --fill with their respective tags: legacy, wedge and sextant (@hodefoting).

    • Since there is a growing number of builtin symbols that may not be available everywhere, the default selection has been restricted to the widely supported block and border sets.

    • If possible, we now select a visually blank character from the specified symbol/fill sets instead of hardcoding ASCII space for featureless cells. One practical upshot of this is that the constant-width braille range can be used to produce consistent images even in contexts with variable-width fonts. U+2800 (BRAILLE PATTERN BLANK) will then be used in blank cells.

    • Improved terminal size detection when used with pipelines and redirection. This should now produce an image properly sized for your terminal: curl https://i.imgur.com/WFDEFVg.jpeg | chafa - | tee out

    • ChafaCanvas gained API functions for programmatically getting and setting character cell contents. These are used in a new example in tests/ncurses.c demonstrating ncurses integration.

    • Made --disable-rpath the default in order to simplify packaging.

    • Added a HACKING file featuring a much needed release checklist.

    • Improved terminal support:

      • Ctx will now use optimizing REP sequences at high -O levels.
      • foot now defaults to sixels (@dnkl).
      • iTerm2 now defaults to the iTerm2 protocol.
      • Kitty now defaults to the Kitty protocol.
      • st now defaults to truecolor symbols (@rojnwa).
    • Bug fixes:

      • #44 Missing error handling on stdout writes (reported by @elfring).
      • [unfiled] Solid symbols erroneously replaced by fill in FGBG mode.
      • [unfiled] Integer formatter was not using fast path for 8-bit values.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.8.0.tar.xz(425.50 KB)
    chafa-1.8.0.tar.xz.asc(488 bytes)
  • 1.6.1(Jun 3, 2021)

    This is a bugfix release.

    • Add NOCONFIGURE variable to autogen.sh to skip configure (Biswapriyo Nath).

    • Bug fixes:

      • #50 SIGBUS while loading huge GIFs (reported by Grzegorz Koperwas).
      • #52 Produces small glitches in output with some images (reported by Sami Farin).
      • #54 Haiku port fails on 32bit (Luc Schrijvers).
      • [unfiled] Exclude RTL code points that could break the output.
      • [unfiled] Apple Terminal lacks truecolor support, so make it default to 256 colors (reported by Behdad Esfahbod).
      • [unfiled] Fix typo affecting middle dot symbol.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.6.1.tar.xz(408.90 KB)
    chafa-1.6.1.tar.xz.asc(488 bytes)
  • 1.6.0(Jan 15, 2021)

    This release adds major features and important fixes to both libchafa and the chafa command-line tool.

    • Added support for fullwidth symbols that take up two character cells. These are common in East Asian scripts. Single-cell and double-cell symbols can be mixed, and -f symbols mode will use both if possible.

    • New symbol tags: alpha, digit, alnum, narrow, wide, ambiguous, ugly, bad. "Ambiguous" symbols have uncertain widths and may render poorly in some terminals. "Ugly" denotes symbols that are unsuitable for Chafa's cell-based graphics (multicolor emoji, ideographic descriptors, etc). "Bad" is a superset of these two categories. Bad symbols are always excluded unless explicitly enabled with e.g. CHAFA_SYMBOL_TAG_BAD (--symbols +bad in the frontend).

    • The font loader (--glyph-file option) now does a better job with proportional fonts.

    • Added options for controlling lossless optimization of output. Currently, attribute reuse and character repetition (REP sequence) are implemented.

    • Added -O option to the frontend. This controls the optimization level.

    • Added a simple abstraction layer for terminal control sequences (ChafaTermInfo and ChafaTermDb). This allows for improved terminal support.

    • FbTerm is now supported with TERM=fbterm in the environment.

    • Bug fixes:

      • #43 Fix signal handler (reported by @elfring).
      • [unfiled] Crash when invalid font paths were passed on command line.
      • [unfiled] Small typo in fontgen's README (@timgates42).
      • [unfiled] Bad contrast adjustment in images with transparency.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.6.0.tar.xz(408.09 KB)
    chafa-1.6.0.tar.xz.asc(488 bytes)
  • 1.4.1(Apr 10, 2020)

    This is a bugfix release.

    • Added configure option --disable-rpath. This allows packagers to prevent the hard-coded library search path from being embedded in the chafa command-line tool (Mo Zhou, #39).

    • Added defaults for the yaft terminal.

    • Bug fixes: #40 - Fails to build on hurd-i386 + other i386 (reported by Mo Zhou). [unfiled] - Rare failed assert with mostly transparent sixel image (reported by Reddit user spryfigure). [unfiled] - Minor typo in function docstring.

    Source code(tar.gz)
    Source code(zip)
    chafa-1.4.1.tar.xz(380.30 KB)
    chafa-1.4.1.tar.xz.asc(488 bytes)
  • 1.4.0(Apr 1, 2020)

    This release adds major features to both libchafa and the chafa command-line tool.

    • Added sixel graphics support. Chafa will automatically produce sixels if the connected terminal supports it. It can also be forced using the new -f or --format flag. This is a new implementation written from the ground up to maximize throughput.

    • Added the --glyph-file option, which loads glyph-symbol mappings from any file format supported by FreeType (TTF, PCF, etc). This allows for custom font support and improved symbol selection.

    • Added the --speed option specifying animation speed. It accepts a unitless multiplier, a specific number of frames per second, or max for maximum throughput.

    • There are now two ways to assign colors to symbol cells. Formerly, this was done based on the average color of the covered area. The new default is to use the median color, which produces sharper edges, but is slightly more prone to high-frequency noise. The new option --color-extractor selects the method to employ.

    • When displaying multiple files, the default delay between files has been changed from three seconds to zero. Animations will still play through once. This can be overridden on the chafa command line with -d or --duration.

    • Minor tweaks to built-in symbols.

    • Performance improvements:

      • Halved pixel storage requirements from 64 bits to 32 bits, resulting in significant memory savings.
      • Now builds with -ffast-math, yielding a big speedup for DIN99d.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.4.0.tar.xz(379.81 KB)
    chafa-1.4.0.tar.xz.asc(488 bytes)
  • 1.2.2(Mar 2, 2020)

  • 1.2.1(Aug 15, 2019)

  • 1.2.0(Aug 4, 2019)

    This is a feature and performance release.

    • Added --dither, --dither-grain and --dither-intensity options. These allow for sub-cell dithering in quantized modes (none, 2, 16, 240 and 256). Especially beneficial when used with -p off.

    • Added API for ordered and diffusion-based dithering in quantization.

    • Added API support for multiple 8bpc pixel modes: RGB, BGR, RGBA, BGRA, ARGB, ABGR with either premultiplied or unassociated alpha channels.

    • Smooth scaling is now done internally, meaning libchafa consumers no longer need to prescale images.

    • Implemented a machine learning tool that can generate custom fonts for efficient image reproduction from a provided dataset. This is left uninstalled since it's still experimental (@cdluminate).

    • Throughput improvements:

      • GIF animations now start playing instantly.
      • GIF CPU overhead reduced by 75%, peak memory use down 95%-99% (!).
      • XWD common case CPU overhead down 60-70%, peak memory down 70%.
      • Additional halving of CPU overhead in 240- and 256-color modes.
      • Streamlined pixel pipeline for better parallelization.
    • Installation instructions:

      • New: Guix (Guy Fleury Iteriteka).
      • New: openSUSE (@jubalh).
    • Bug fixes:

      • [unfiled] Certain SVGs had transparency replaced with a white background (nemo).
      • [unfiled] -lm dependency belongs in libchafa, not frontend.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.2.0.tar.xz(346.91 KB)
    chafa-1.2.0.tar.xz.asc(488 bytes)
  • 1.0.1(Dec 18, 2018)

  • 1.0.0(Dec 16, 2018)

    This release adds features, greatly improves performance and fixes several bugs. Programs written for the command line and libchafa interfaces in this release will be supported by future versions in the 1.y.z series without the need for modification or recompilation.

    • Added ability to specify "fill" symbols to use as halftone for better color approximation. This can be used to augment the regular symbol selection or to replace it (with --symbols none) for a different, purely intensity-based effect.

    • Improved preprocessing in 2-color and 16-color modes. This is optional (default: on) and consists of a contrast boost and, for the 16-color mode, an additional saturation boost. The new implementation lives in libchafa and does not rely on ImageMagick. It is multithreaded, and due to its specialized nature, much faster.

    • Added --watch option to continuously monitor a file.

    • Added more symbols:

      • Most of the ASCII range.
      • Braille range (#2, thanks to @kilobyte).
      • Miscellaneous math and scanline symbols.
      • More geometric symbols (black circle, triangles) (@cdluminate).
    • Throughput improvements:

      • Fast symbol candidate set reduction by median cut.
      • Parallel processing with threads.
      • Prescaling using bilinear interpolation instead of lanczos.
    • Installation instructions:

      • New: Arch (#12, @felixonmars).
      • New: Debian testing/unstable (#9, @cdluminate).
      • New: Fedora (#14, @rarguello).
      • Mention missing dependency for Debian (#13, @medusacle).
    • Bug fixes:

      • #1 - -c none produces pointless \e[0m after every line (found by @kilobyte).
      • #3 - Compile error (found by @lalyos).
      • #4 - AM_PROG_LIBTOOL is obsolete, replace it with LT_INIT (@eclipseo).
      • #5 - Port chafa to i386 architecture (@cdluminate).
      • #7 - Chafa should not return an error when being asked for --version (@cdluminate).
      • #10 - Fix detection of MagickWand methods (@felixonmars).
      • #11 - ImageMagick 7 support (found by @felixonmars).
      • #21 - chafa.c:547: pointless assignment (found by @dcb314).
    Source code(tar.gz)
    Source code(zip)
    chafa-1.0.0.tar.xz(303.94 KB)
    chafa-1.0.0.tar.xz.asc(488 bytes)
Owner
Hans Petter Jansson
I code.
Hans Petter Jansson
Spitfire is a basic terminal language that can exicute code via the terminal.

Spitfire is a basic terminal language that can exicute code via the terminal. It is easy to learn and runs fast, considering that its just a 300 line c++ file.

jhomas tefferson 0 Nov 18, 2021
A C, C++ and Rust library to draw graphics with pixels in the terminal

A library to draw graphics with pixels in the terminal Who needs a GUI when you have a terminal ? Building To generate libpluto.a, run: $ make To ins

null 67 Apr 9, 2022
Small header only C++ library for writing multiplatform terminal applications

Terminal Terminal is small header only library for writing terminal applications. It works on Linux, macOS and Windows (in the native cmd.exe console)

Jupyter Xeus 192 May 5, 2022
:computer: C++ Functional Terminal User Interface. :heart:

FTXUI Functional Terminal (X) User interface A simple C++ library for terminal based user interface. Demo: Feature Functional style. Inspired by [1] a

Arthur Sonzogni 3k May 12, 2022
A little UNIX-inspired terminal application for the Numworks Calculator (not using escher).

L.E. Terminal (let for short) is a little UNIX-inspired terminal for the Numworks Calculator.

Cacahuète Sans Sel 18 Apr 27, 2022
Draw sequence diagram in text from terminal.

sequence-diagram-cli Draw seqence diagram from terminal.

null 42 Feb 28, 2022
Terminal calculator made for programmers working with multiple number representations, sizes, and overall close to the bits

Programmer calculator The programmer calculator is a simple terminal tool designed to give maximum efficiency and flexibility to the programmer workin

romes 164 May 8, 2022
X terminal emulator rendering through OpenGL ES Compute Shaders

Zutty is a terminal emulator for the X Window System, functionally similar to several other X terminal emulators such as xterm, rxvt and countless others

Tom Szilagyi 207 May 12, 2022
The new Windows Terminal and the original Windows console host, all in the same place!

The new Windows Terminal and the original Windows console host, all in the same place!

Microsoft 83.1k May 16, 2022
n³ The unorthodox terminal file manager

n³ The unorthodox terminal file manager

Mischievous Meerkat 14.1k May 17, 2022
Graphs the activity of a chia harvester in a linux terminal.

Chia Harvest Graph Monitor for Chia Harvesting Introduction The chiaharvestgraph tool will graph Chia Harvesting activity in a linux terminal. Use a 2

Bram Stolk 219 May 2, 2022
a simple to use linux terminal

a simple to use linux terminal

notaweeb 7 Feb 17, 2022
Collection of human friendly terminal interface for git.

A collection of human friendly terminal user interface for git.

Arthur Sonzogni 60 May 5, 2022
Simple benchmark for terminal output

TermBench This is a simple timing utility you can use to see how slow your terminal program is at parsing escape-sequence-coded color output. It can b

Casey Muratori 169 May 9, 2022
tinytetris - 80x23 terminal tetris

tinytetris - 80x23 terminal tetris

Conor Taylor 1.6k May 9, 2022
Contour - A modern C++ Terminal Emulator

contour is a modern terminal emulator, for everyday use. It is aiming for power users with a modern feature mindset.

Contour Terminal Emulator 805 May 10, 2022
Simple Unix Terminal Football Manager-like game.

Superleage 2020/2021 It is a "work in progress" simple game based on some mechanics of Football Manager. The game is in a very early stage of Developm

sewe2000 2 Oct 14, 2021
timg - Terminal Image and Video Viewer

timg - Terminal Image and Video Viewer

Henner Zeller 1.2k May 15, 2022
Tiny Mobile Terminal Device Kit.

Tiny Mobile Terminal Device Kit.

稚晖 1.2k May 4, 2022