📺🗿 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!

Comments
  • 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
  • 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 14
  • 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
  • Issues building chafa on CentOS 7

    Issues building chafa on CentOS 7

    The first issue, for some reason chafa does not see libwebp installed on my system. I have the following packages installed:

    /root/chafa# yum list installed|grep libwebp
    libwebp.x86_64                   0.3.0-10.el7_9               @updates
    libwebp-devel.x86_64             0.3.0-10.el7_9               @updates
    libwebp7.x86_64                  1.0.3-1.el7.remi             @remi-safe
    

    Seems ok to me, however this is CentOS, maybe libwebp version is too obsolete and not supported?

    The second issue, building the chafa, I get the following error:

    libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26 -Wall -Wextra -Wmissing-prototypes -Wwrite-strings -Wunused-macros -Wundef -Wpointer-arith -Werror=format-security -Wstack-usage=131072 -Wlogical-op -ffast-math -I.. -g -O2 -MT libnsgif_la-lzw.lo -MD -MP -MF .deps/libnsgif_la-lzw.Tpo -c lzw.c  -fPIC -DPIC -o .libs/libnsgif_la-lzw.o
    lzw.c: In function 'lzw_decode_init':
    lzw.c:290:2: error: 'for' loop initial declarations are only allowed in C99 mode
      for (uint32_t i = 0; i < ctx->clear_code; ++i) {
      ^
    lzw.c:290:2: note: use option -std=c99 or -std=gnu99 to compile your code
    

    Changing CFLAGS = -g -O2 line in the chafa/libnsgif/Makefile to CFLAGS = -g -O2 -std=c99 fixes it and allows chafa to build successfuly.

    GCC version in the build toolchain is gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

    I also get a couple of warnings about m4 macros after running autogen.sh (I don't know is it related or not):

    Running libtoolize...
    libtoolize: putting auxiliary files in `.'.
    libtoolize: copying file `./ltmain.sh'
    libtoolize: You should add the contents of the following files to `aclocal.m4':
    libtoolize:   `/usr/share/aclocal/libtool.m4'
    libtoolize:   `/usr/share/aclocal/ltoptions.m4'
    libtoolize:   `/usr/share/aclocal/ltversion.m4'
    libtoolize:   `/usr/share/aclocal/ltsugar.m4'
    libtoolize:   `/usr/share/aclocal/lt~obsolete.m4'
    libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
    libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
    libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
    Missing optional tool: gtk-doc
    
    Without this, no developer documentation will be generated.
    
    Running aclocal...
    aclocal: warning: couldn't open directory 'm4': No such file or directory
    Running automake...
    ...
    

    However, the only really important question to me from all of this "is there any way to build chafa with the WebP support?"

    opened by ivanshatsky 10
  • Chafa crashes trying to allocate too much memory

    Chafa crashes trying to allocate too much memory

    When using any format other than symbols, chafa tries to allocate way too much memory. This happens with all images I tried so far, both PNG and JPEG. The issue was introduced somewhere between commits b4e513c (good) and 30b21fa (bad).

    $ chafa -f kitty ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:346124): GLib-ERROR **: 23:10:25.717: ../../../glib/gmem.c:108: failed to allocate 18446744066840471296 bytes
    fish: “chafa -f kitty ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    
    $ chafa -f sixel ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:346076): GLib-ERROR **: 23:10:07.137: ../../../glib/gmem.c:108: failed to allocate 18446744072010973248 bytes
    fish: “chafa -f sixel ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    
    $ chafa -f iterm ~/Pictures/prince_of_persia_title_screen_scaled.png
    (chafa:345798): GLib-ERROR **: 23:05:34.798: ../../../glib/gmem.c:108: failed to allocate 18446744066916285920 bytes
    fish: “chafa -f iterm ~/Pictures/princ…” terminated by signal SIGTRAP (Trace or breakpoint trap)
    

    Here is the backtrace from gdb:

    #0  0x00007ffff7e9f295 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #1  0x00007ffff7ea0319 in g_log_default_handler () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #2  0x00007ffff7ea055c in g_logv () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #3  0x00007ffff7ea0743 in g_log () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #4  0x00007ffff7e9eec2 in g_malloc () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
    #5  0x00007ffff7c2cfcf in chafa_kitty_canvas_new (width=65008, height=39312) at chafa-kitty-canvas.c:53
    #6  0x00007ffff7c1e37c in chafa_canvas_draw_all_pixels (canvas=0x5555555ff950, src_pixel_type=CHAFA_PIXEL_RGBA8_UNASSOCIATED, 
        src_pixels=0x7ffff3a66010 "\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377"..., src_width=1280, src_height=800, src_rowstride=5120) at chafa-canvas.c:1426
    #7  0x000055555555eca1 in build_string (pixel_type=CHAFA_PIXEL_RGBA8_UNASSOCIATED, 
        pixels=0x7ffff3a66010 "\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377\340\300p\377"..., 
        src_width=1280, src_height=800, src_rowstride=5120, dest_width=136, dest_height=24) at chafa.c:1196
    #8  0x000055555555f5f0 in run_magickwand (filename=0x5555555bd610 "/home/srl/Pictures/prince_of_persia_title_screen_scaled.png", 
        is_first_file=1, is_first_frame=1, quiet=0) at chafa.c:1508
    #9  0x000055555556013d in run (filename=0x5555555bd610 "/home/srl/Pictures/prince_of_persia_title_screen_scaled.png", is_first_file=1, 
        is_first_frame=1, quiet=0) at chafa.c:1765
    #10 0x00005555555602cd in run_all (filenames=0x5555555bf600 = {...}) at chafa.c:1826
    #11 0x0000555555560456 in main (argc=2, argv=0x7fffffffe178) at chafa.c:1867
    

    The file used in the above examples. prince_of_persia_title_screen_scaled.png

    opened by sotpapathe 10
  • 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
  • Do not upscale picture

    Do not upscale picture

    By default, displaying a picture with Chafa takes the whole terminal.

    It would be nice to not upscale smaller pictures so the user can get a sense of the size of the picture (for example if it is an icon).

    The "does not upscale" option could work together with the size option to set the size as "maximal size". If I set the size to 100 but I’m viewing an icon which is 10x10, the icon stays at 10x10.

    opened by ploum 9
  • make fail

    make fail

    Wanted to try chafa out went to build it and it failed seems like its just doc stuff though is there a way to bypass?

    I/O error : Attempt to load network entity http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl warning: failed to load external entity "http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" cannot parse http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl I/O error : Attempt to load network entity http://docbook.sourceforge.net/release/xsl/current/html/onechunk.xsl warning: failed to load external entity "http://docbook.sourceforge.net/release/xsl/current/html/onechunk.xsl" cannot parse http://docbook.sourceforge.net/release/xsl/current/html/onechunk.xsl make[2]: *** [Makefile:629: chafa.html] Error 4 make[2]: *** Waiting for unfinished jobs.... make[2]: *** [Makefile:626: chafa.1] Error 4 make[2]: Leaving directory '/home/da5id/chafa/docs' make[1]: *** [Makefile:496: all-recursive] Error 1 make[1]: Leaving directory '/home/da5id/chafa' make: *** [Makefile:405: all] Error 2

    opened by umop3plsdn 3
  • feature request: provide a way of excluding specific characters

    feature request: provide a way of excluding specific characters

    I'm using chafa to produce ascii art from various logos for use on embedded devices. Sometimes this ends up interfering with automated tests that screen scrape and detect #, $ and > as prompt indicators.

    I know I can exclude symbol classes with --symbols -dot but is it possible to exclude only specific characters (e.g. --symbols -$ -# ->, bash quoting issues aside).

    opened by cpackham 1
  • Image is kinda blurry compared to `img2sixel`

    Image is kinda blurry compared to `img2sixel`

    Images displayed by chafa are slightly blurrier than ones displayed by img2sixel (libsixel) Also, the ones displayed by chafa are a few pixels shorter (in height) compared to the ones by img2sixel I think (not sure if that's actually the case or maybe it's just my eyes). Maybe that's why it's blurrier? See the image below: image And the original image: termtest

    Using Konsole 22.12.0

    opened by ErrorNoInternet 1
  • when trying to open .mp4 files on wsl2 and osx terminal i get error ```2805 ◯  chafa output.mp4 chafa: Failed to open 'output.mp4': Unknown file format```

    when trying to open .mp4 files on wsl2 and osx terminal i get error ```2805 ◯ chafa output.mp4 chafa: Failed to open 'output.mp4': Unknown file format```

    when trying to open up .mp4 on mac terminal and windows wsl terminal I get unknown file format... on the remote ubuntu linux server it runs fine with the basic install...

    chafa: Failed to open 'output.mp4': Unknown file format```
    opened by gschian0 6
  • --size makes Chafa ignore explicitely declared --scale

    --size makes Chafa ignore explicitely declared --scale

    What I'm trying to do is to view an image that's tall and thin, I want to render it with no height limits but also to not upscale to fit the terminal's width (but still downscale if necessary, keeping the aspect ratio).

    According to the man pages, I have the impression that setting --size "$COLUMNS" --scale 1 I should achieve just that, but it just ingores --scale and upscales the image to the full width of the terminal.

    Chafa is version 1.12.4

    opened by SuperDuperDeou 1
Releases(1.12.4)
  • 1.12.4(Nov 13, 2022)

    This release improves support for Microsoft Windows and fixes several bugs.

    • MS Windows: Added support for Unicode command-line arguments.

    • MS Windows: Enabled support for building a DLL.

    • Improved quality of accelerated symbol picking (the default with -w 6 and lower), especially along sharp edges.

    • The XWD loader now supports unaligned image data, which can occur when the header is of an uneven length. Such images will no longer be rejected.

    • Bug fixes: #100 Reading image data from stdin fails on Windows (reported by @TransparentLC). #104 Artifacts with transparent animations on Kitty (reported by @acxz). #108 Bad interaction with lolcat (reported by @eMPee584). #112 Bad documentation for -c default (reported by @jwilk). #113 Autogen/build fails on CentOS 7 (partial solution) (reported by @ivanshatsky). huntr.dev: Uncontrolled memory allocation in lodepng (reported by @JieyongMa). [unfiled] -lm should not be in pkg-config Libs: list (@kloczek). [unfiled] The --watch switch was broken with the introduction of --animate.

    Source code(tar.gz)
    Source code(zip)
    chafa-1.12.4.tar.xz(912.37 KB)
    chafa-1.12.4.tar.xz.asc(488 bytes)
  • 1.12.3(Jun 30, 2022)

    A bug crept into the previous release that prevented successful package builds in some environments. This has been fixed.

    • Increased GLib minimum version to 2.26.
    • Enabled a few compiler warnings not included in -Wall -Wextra in order to catch more potential issues early. Also started using -Werror selectively.
    • Silenced deprecation warnings for older GLib APIs that we would like to keep using a bit longer.
    • Bug fixes: #96 Regression: Fails to build on Linux/Debian (reported by @cdluminate).
    Source code(tar.gz)
    Source code(zip)
    chafa-1.12.3.tar.xz(643.68 KB)
    chafa-1.12.3.tar.xz.asc(488 bytes)
  • 1.12.2(Jun 28, 2022)

  • 1.12.1(Jun 19, 2022)

    This release fixes one important input validation bug and several instances of undefined behavior revealed by fuzzing.

    • Increased GLib minimum version to 2.20.

    • Added 12 new test inputs, including bad inputs to handle gracefully.

    • Added a few symbols to API documentation that were accidentally left out.

    • Bug fixes:

      • huntr.dev CVE-2022-2061: Out-of-bounds read in libnsgif's lzw_decode() (@sudhackar of CrowdStrike).
      • [unfiled] Undefined behavior in libnsgif due to uninitialized frame fields.
      • [unfiled] Signed integer overflow in chafa_pack_color().
      • [unfiled] Integer overflow in normalization pass on some images.
      • [unfiled] Potential unaligned access with corrupt XWD images.
      • [unfiled] Integer overflow in quantization on some images.
      • [unfiled] Calculating offset from NULL pointer in LodePNG.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.12.1.tar.xz(638.30 KB)
    chafa-1.12.1.tar.xz.asc(488 bytes)
  • 1.12.0(Jun 6, 2022)

    This is a feature release with new image loaders aimed at phasing out ImageMagick. It also has new convenience functions, character art improvements, tests and bug fixes.

    Special thanks go to the very fine security researchers at huntr.dev for their help in hardening Chafa over the last few releases.

    • The ImageMagick dependency is now optional and deprecated. Packagers are encouraged to drop the ImageMagick dependency (--without-imagemagick) and add direct dependencies on relevant image codecs. ImageMagick support will be removed in a future release.

    • Added image loaders for the following formats: JPEG, SVG, TIFF, WebP. Like the existing GIF, PNG and XWD loaders, these are much faster and generally safer than their ImageMagick counterparts. If ImageMagick is enabled, it will be used as a fallback. Supported image loaders will be listed in the --version output.

    • Implemented a 16/8 mode producing 8 colors and an additional 8 bright foreground-only colors for a total of 16 foreground and 8 background colors. When using ANSI escape sequences in symbol mode, the sequence for bold text is used to enable bright colors. This scheme corresponds to that of the IBM PC's VGA hardware text modes and was popular with terminal emulators in the late 1980s to early 2000s.

      With a few tweaks, output from this mode can be turned into ANSI art scene .ANS files compatible with utilities like the wonderful Ansilove, e.g:

      $ chafa -f symbols -c 16/8 -s 80 --symbols space+solid+half --fill stipple \
          in.jpg | tr -d '\n' | iconv -c -f utf8 -t cp437 > out.ans
      $ ansilove out.ans -o out.png
      
    • New builtin Latin symbols (available with --symbols latin). This class comprises most of the symbols from the Latin-1 Supplement, Latin Extended-A and -B, IPA Extensions and Spacing Modifier Letters plus a few Latin-like symbols from other ranges, using Terminus as the reference font. The ASCII class is also a subset of this class.

    • Reworked ASCII symbols to be more representative of modern terminal fonts. As with the other Latin ranges, the reference font is now Terminus.

    • New option: --scale <n>. This takes a real number specifying the on-screen scaling factor relative to the input's pixel size, respecting the terminal size. The special argument max will fit the output to the terminal. The defaults are 1.0 for iTerm, Kitty and sixels, and 4.0 for symbols. Suggested by @ploum in #84.

    • Deprecated option: --zoom. Use --scale max instead.

    • Added a battery of simple tests that can be run with make check.

    • Made configure friendlier. It's now more lenient with dependencies, and the summary is more detailed and colorized if possible.

    • Bug fixes:

      • #62 Too big alloc on bogus terminal dimensions (reported by @sotpapathe and @cdluminate).
      • huntr.dev: Null pointer dereference caused by calling post_func on unused batch entries (reported by @han0nly).
      • [unfiled] Small memory leaks when using iTerm and Kitty formats.
      • [unfiled] Wide symbol coverages leaked in symbol map destructor.
      • [unfiled] No error code if files failed to load.
    Source code(tar.gz)
    Source code(zip)
    chafa-1.12.0.tar.xz(623.59 KB)
    chafa-1.12.0.tar.xz.asc(488 bytes)
  • 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 69 Nov 7, 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 274 Jan 2, 2023
: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 4k Jan 3, 2023
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 20 Aug 31, 2022
Draw sequence diagram in text from terminal.

sequence-diagram-cli Draw seqence diagram from terminal.

null 44 Dec 20, 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 183 Dec 24, 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 259 Dec 24, 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 86.8k Dec 29, 2022
n³ The unorthodox terminal file manager

n³ The unorthodox terminal file manager

Mischievous Meerkat 15.5k Jan 1, 2023
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 215 Dec 11, 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 76 Dec 30, 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 174 Dec 4, 2022
tinytetris - 80x23 terminal tetris

tinytetris - 80x23 terminal tetris

Conor Taylor 2k Jan 3, 2023
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 1.1k Dec 28, 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.3k Dec 31, 2022
Tiny Mobile Terminal Device Kit.

Tiny Mobile Terminal Device Kit.

稚晖 1.4k Dec 27, 2022