From 751568e9f35555f9c9c0114f82f8fa9bfd989a61 Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Mon, 11 Apr 2022 22:51:51 +0200 Subject: [PATCH] Faster fallback in sixel code --- src/logo/sixel/im6.c | 8 +++--- src/logo/sixel/im7.c | 8 +++--- src/logo/sixel/sixel.c | 56 ++++++++++++++++++++++-------------------- src/logo/sixel/sixel.h | 28 +++++++++++++-------- 4 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/logo/sixel/im6.c b/src/logo/sixel/im6.c index b85720969..50affa2ed 100644 --- a/src/logo/sixel/im6.c +++ b/src/logo/sixel/im6.c @@ -18,12 +18,12 @@ static bool logoWriteIM6(void* image, const void* imageInfo, void* exceptionInfo return ffWriteImage(imageInfo, image) == MagickTrue; } -bool ffLogoPrintSixelIM6(FFinstance* instance) +FFLogoSixelResult ffLogoPrintSixelIM6(FFinstance* instance) { - FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-6.Q16HDRI.so", 8, "libMagickCore-6.Q16.so", 8) + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, FF_LOGO_SIXEL_RESULT_INIT_ERROR, "libMagickCore-6.Q16HDRI.so", 8, "libMagickCore-6.Q16.so", 8) - FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); - FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR); return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM6, logoWriteIM6); } diff --git a/src/logo/sixel/im7.c b/src/logo/sixel/im7.c index ae8ec61cc..15a0ed921 100644 --- a/src/logo/sixel/im7.c +++ b/src/logo/sixel/im7.c @@ -17,12 +17,12 @@ static bool logoWriteIM7(void* image, const void* imageInfo, void* exceptionInfo return ffWriteImage(imageInfo, image, exceptionInfo) == MagickTrue; } -bool ffLogoPrintSixelIM7(FFinstance* instance) +FFLogoSixelResult ffLogoPrintSixelIM7(FFinstance* instance) { - FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-7.Q16HDRI.so", 11, "libMagickCore-7.Q16.so", 11) + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, FF_LOGO_SIXEL_RESULT_INIT_ERROR, "libMagickCore-7.Q16HDRI.so", 11, "libMagickCore-7.Q16.so", 11) - FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); - FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR); return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM7, logoWriteIM7); } diff --git a/src/logo/sixel/sixel.c b/src/logo/sixel/sixel.c index 70876e630..59b4eb76a 100644 --- a/src/logo/sixel/sixel.c +++ b/src/logo/sixel/sixel.c @@ -9,25 +9,25 @@ #include #endif -bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc) +FFLogoSixelResult ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc) { struct winsize winsize; if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != 0) - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; - FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireExceptionInfo, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyExceptionInfo, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireImageInfo, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImageInfo, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, CopyMagickString, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, ReadImage, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImage, false) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireExceptionInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyExceptionInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireImageInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImageInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, CopyMagickString, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, ReadImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR) + FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR) ExceptionInfo* exceptionInfo = ffAcquireExceptionInfo(); if(exceptionInfo == NULL) { dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } ImageInfo* imageInfoIn = ffAcquireImageInfo(); @@ -35,7 +35,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz { ffDestroyExceptionInfo(exceptionInfo); dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } //+1, because we need to copy the null byte too @@ -47,7 +47,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz { ffDestroyExceptionInfo(exceptionInfo); dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } double characterPixelWidth = winsize.ws_xpixel / (double) winsize.ws_col; @@ -62,7 +62,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz ffDestroyImage(originalImage); ffDestroyExceptionInfo(exceptionInfo); dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } Image* resizedImage = (Image*) resizeFunc(originalImage, (size_t) imagePixelWidth, (size_t) imagePixelHeight, exceptionInfo); @@ -71,7 +71,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz { ffDestroyExceptionInfo(exceptionInfo); dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } ImageInfo* imageInfoOut = ffAcquireImageInfo(); @@ -80,7 +80,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz ffDestroyImage(resizedImage); ffDestroyExceptionInfo(exceptionInfo); dlclose(imageMagick); - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; } ffPrintCharTimes(' ', instance->config.logoPaddingLeft); @@ -96,7 +96,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz dlclose(imageMagick); if(writeResult == MagickFalse) - return false; + return FF_LOGO_SIXEL_RESULT_RUN_ERROR; instance->state.logoHeight = (uint32_t) (imagePixelHeight / characterPixelHeight); instance->state.logoWidth = instance->config.logoWidth + instance->config.logoPaddingLeft + instance->config.logoPaddingRight; @@ -104,25 +104,27 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz fputs("\033[9999999D", stdout); printf("\033[%uA", instance->state.logoHeight); - return true; + return FF_LOGO_SIXEL_RESULT_SUCCESS; } #endif bool ffLogoPrintSixelIfExists(FFinstance* instance) { - #ifdef FF_HAVE_IMAGEMAGICK7 - if(ffLogoPrintSixelIM7(instance)) - return true; - #endif - - #ifdef FF_HAVE_IMAGEMAGICK6 - if(ffLogoPrintSixelIM6(instance)) - return true; - #endif - #if !defined(FF_HAVE_IMAGEMAGICK7) && !defined(FF_HAVE_IMAGEMAGICK6) FF_UNUSED(instance); #endif + #ifdef FF_HAVE_IMAGEMAGICK7 + FFLogoSixelResult result = ffLogoPrintSixelIM7(instance); + if(result == FF_LOGO_SIXEL_RESULT_SUCCESS) + return true; + else if(result == FF_LOGO_SIXEL_RESULT_RUN_ERROR) + return false; + #endif + + #ifdef FF_HAVE_IMAGEMAGICK6 + return ffLogoPrintSixelIM6(instance) == FF_LOGO_SIXEL_RESULT_SUCCESS + #endif + return false; } diff --git a/src/logo/sixel/sixel.h b/src/logo/sixel/sixel.h index 15029efd9..e2c238a85 100644 --- a/src/logo/sixel/sixel.h +++ b/src/logo/sixel/sixel.h @@ -5,15 +5,6 @@ #include "fastfetch.h" -#ifdef FF_HAVE_IMAGEMAGICK7 -bool ffLogoPrintSixelIM7(FFinstance* instance); -#endif - -#ifdef FF_HAVE_IMAGEMAGICK6 -#include -bool ffLogoPrintSixelIM6(FFinstance* instance); -#endif - #if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6) #include @@ -22,11 +13,28 @@ bool ffLogoPrintSixelIM6(FFinstance* instance); #define MAGICKCORE_HDRI_ENABLE 1 #define MAGICKCORE_QUANTUM_DEPTH 16 +typedef enum FFLogoSixelResult +{ + FF_LOGO_SIXEL_RESULT_SUCCESS, //Logo printed + FF_LOGO_SIXEL_RESULT_INIT_ERROR, //Failed to load library, try again with next IM version + FF_LOGO_SIXEL_RESULT_RUN_ERROR //Failed to load / convert image, cancle whole sixel code +} FFLogoSixelResult; + typedef void*(*FFLogoIMResizeFunc)(const void* image, size_t width, size_t height, void* exceptionInfo); typedef bool(*FFLogoIMWriteFunc)(void* image, const void* imageInfo, void* exceptionInfo); -bool ffLogoPrintSixelImpl(FFinstance* instance, void* library, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc); +FFLogoSixelResult ffLogoPrintSixelImpl(FFinstance* instance, void* library, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc); #endif +#ifdef FF_HAVE_IMAGEMAGICK7 +FFLogoSixelResult ffLogoPrintSixelIM7(FFinstance* instance); +#endif + +#ifdef FF_HAVE_IMAGEMAGICK6 +#include +FFLogoSixelResult ffLogoPrintSixelIM6(FFinstance* instance); +#endif + + #endif