Faster fallback in sixel code

This commit is contained in:
Linus Dierheimer
2022-04-11 22:51:51 +02:00
parent 430fe9fe9a
commit 751568e9f3
4 changed files with 55 additions and 45 deletions
+4 -4
View File
@@ -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);
}
+4 -4
View File
@@ -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);
}
+29 -27
View File
@@ -9,25 +9,25 @@
#include <magick/MagickCore.h>
#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;
}
+18 -10
View File
@@ -5,15 +5,6 @@
#include "fastfetch.h"
#ifdef FF_HAVE_IMAGEMAGICK7
bool ffLogoPrintSixelIM7(FFinstance* instance);
#endif
#ifdef FF_HAVE_IMAGEMAGICK6
#include <math.h>
bool ffLogoPrintSixelIM6(FFinstance* instance);
#endif
#if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6)
#include <sys/ioctl.h>
@@ -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 <math.h>
FFLogoSixelResult ffLogoPrintSixelIM6(FFinstance* instance);
#endif
#endif