From c45ef0892662b842a96d74960b0f338f4a03a18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 22 Dec 2022 11:36:13 +0800 Subject: [PATCH] Image: expose more chafa settings --- src/common/init.c | 3 +++ src/common/library.h | 3 +++ src/data/help.txt | 5 +++- src/fastfetch.c | 10 ++++---- src/fastfetch.h | 3 +++ src/logo/image/image.c | 52 ++++++++++++++++++++++++++++-------------- 6 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/common/init.c b/src/common/init.c index 5acd02581..beb34aaee 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -140,6 +140,9 @@ static void defaultConfig(FFinstance* instance) instance->config.logo.chafaFgOnly = false; ffStrbufInitS(&instance->config.logo.chafaSymbols, "block+border+space-wide-inverted"); // Chafa default + instance->config.logo.chafaCanvasMode = UINT32_MAX; + instance->config.logo.chafaColorSpace = UINT32_MAX; + instance->config.logo.chafaDitherMode = UINT32_MAX; ffStrbufInit(&instance->config.colorKeys); ffStrbufInit(&instance->config.colorTitle); diff --git a/src/common/library.h b/src/common/library.h index fbbbdac44..c23aa7b53 100644 --- a/src/common/library.h +++ b/src/common/library.h @@ -43,6 +43,9 @@ #define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \ __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue); +#define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \ + __typeof__(&symbolName) ff ## symbolName = dlsym(library, #symbolName); + #define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \ __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, "dlsym " #symbolName " failed"); diff --git a/src/data/help.txt b/src/data/help.txt index f247833fd..a9afb0b9f 100644 --- a/src/data/help.txt +++ b/src/data/help.txt @@ -38,8 +38,11 @@ Logo options: --sixel : Short for --logo-type sixel --logo --kitty : Short for --logo-type kitty --logo --chafa : Short for --logo-type chafa --logo - --chafa-symbols : Specify character symbols to employ in final output. See chafa document for detail --chafa-fg-only : Produce character-cell output using foreground colors only. See chafa document for detail + --chafa-symbols : Specify character symbols to employ in final output. See chafa document for detail + --chafa-canvas-mode : Determine how colors are used in the output. This value maps the int value of enum ChafaCanvasMode. See chafa document for detail + --chafa-color-space : Set color space used for quantization. 0 for RGB; 1 for DIN99d. See chafa document for detail + --chafa-dither-mode : Set output dither mode (No effect with 24-bit color). This value maps the int value of enum ChafaDitherMode. See chafa document for detail Display options: -s,--structure : Set the structure of the fetch. Must be a colon separated list of keys. Use "fastfetch --list-modules" to see the ones available. diff --git a/src/fastfetch.c b/src/fastfetch.c index 27dd55b2f..70077bc26 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1018,13 +1018,15 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con instance->config.logo.type = FF_LOGO_TYPE_IMAGE_CHAFA; } else if(strcasecmp(key, "--chafa-fg-only") == 0) - { instance->config.logo.chafaFgOnly = optionParseBoolean(value); - } else if(strcasecmp(key, "--chafa-symbols") == 0) - { optionParseString(key, value, &instance->config.logo.chafaSymbols); - } + else if(strcasecmp(key, "--chafa-canvas-mode") == 0) + instance->config.logo.chafaCanvasMode = optionParseUInt32(key, value); + else if(strcasecmp(key, "--chafa-color-space") == 0) + instance->config.logo.chafaColorSpace = optionParseUInt32(key, value); + else if(strcasecmp(key, "--chafa-dither-mode") == 0) + instance->config.logo.chafaDitherMode = optionParseUInt32(key, value); /////////////////// //Display options// diff --git a/src/fastfetch.h b/src/fastfetch.h index 632a23daa..40de9db0b 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -78,6 +78,9 @@ typedef struct FFconfig bool chafaFgOnly; FFstrbuf chafaSymbols; + uint32_t chafaCanvasMode; + uint32_t chafaColorSpace; + uint32_t chafaDitherMode; } logo; //If one of those is empty, ffLogoPrint will set them diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 13cdbcf1f..90e6920cb 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -240,9 +240,6 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_new, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_geometry, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_symbol_map, false) - FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_color_space, false) - FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_canvas_mode, false) - FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_set_fg_only_enabled, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_new, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_draw_all_pixels, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_print, false) @@ -250,12 +247,6 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_canvas_config_unref, false) FF_LIBRARY_LOAD_SYMBOL(chafa, chafa_symbol_map_unref, false) - #ifndef _WIN32 - // FIXME: These functions must be imported from `libglib` dlls. Leak them for now - FF_LIBRARY_LOAD_SYMBOL(chafa, g_string_free, false) - FF_LIBRARY_LOAD_SYMBOL(chafa, g_error_free, false) - #endif - imageData->ffCopyMagickString(imageData->imageInfo->magick, "RGBA", 5); size_t length; void* blob = imageData->ffImageToBlob(imageData->imageInfo, imageData->image, &length, imageData->exceptionInfo); @@ -273,10 +264,31 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData ChafaCanvasConfig* canvasConfig = ffchafa_canvas_config_new(); ffchafa_canvas_config_set_geometry(canvasConfig, (gint) requestData->logoCharacterWidth, (gint) requestData->logoCharacterHeight); ffchafa_canvas_config_set_symbol_map(canvasConfig, symbolMap); - ffchafa_canvas_config_set_color_space(canvasConfig, CHAFA_COLOR_SPACE_DIN99D); - ffchafa_canvas_config_set_canvas_mode(canvasConfig, CHAFA_CANVAS_MODE_TRUECOLOR); - // ffchafa_canvas_config_set_fg_only_enabled(canvasConfig, instance->config.logo.chafaFgOnly); - // TODO: expose more chafa configs to fastfetch flags + + if(instance->config.logo.chafaFgOnly) + { + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, chafa_canvas_config_set_fg_only_enabled); + if(ffchafa_canvas_config_set_fg_only_enabled) + ffchafa_canvas_config_set_fg_only_enabled(canvasConfig, true); + } + if(instance->config.logo.chafaCanvasMode < CHAFA_CANVAS_MODE_MAX) + { + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, chafa_canvas_config_set_canvas_mode); + if(ffchafa_canvas_config_set_canvas_mode) + ffchafa_canvas_config_set_canvas_mode(canvasConfig, (ChafaCanvasMode) instance->config.logo.chafaCanvasMode); + } + if(instance->config.logo.chafaColorSpace < CHAFA_COLOR_SPACE_MAX) + { + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, chafa_canvas_config_set_color_space) + if(ffchafa_canvas_config_set_color_space) + ffchafa_canvas_config_set_color_space(canvasConfig, (ChafaColorSpace) instance->config.logo.chafaColorSpace); + } + if(instance->config.logo.chafaDitherMode < CHAFA_DITHER_MODE_MAX) + { + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, chafa_canvas_config_set_dither_mode) + if(ffchafa_canvas_config_set_dither_mode) + ffchafa_canvas_config_set_dither_mode(canvasConfig, (ChafaDitherMode) instance->config.logo.chafaDitherMode); + } ChafaCanvas* canvas = ffchafa_canvas_new(canvasConfig); ffchafa_canvas_draw_all_pixels( @@ -297,10 +309,16 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData ffLogoPrintChars(instance, result.chars, false); writeCacheStrbuf(requestData, &result, FF_CACHE_FILE_CHAFA); - #ifndef _WIN32 - ffg_string_free(str, TRUE); - ffg_error_free(error); - #endif + // FIXME: These functions must be imported from `libglib` dlls on Windows + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, g_string_free); + if(ffg_string_free) + ffg_string_free(str, TRUE); + if(error) + { + FF_LIBRARY_LOAD_SYMBOL_LAZY(chafa, g_error_free) + if(ffg_error_free) + ffg_error_free(error); + } ffchafa_canvas_unref(canvas); ffchafa_canvas_config_unref(canvasConfig);