Skip to content

Commit 751568e

Browse files
Faster fallback in sixel code
1 parent 430fe9f commit 751568e

File tree

4 files changed

+52
-42
lines changed

4 files changed

+52
-42
lines changed

src/logo/sixel/im6.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ static bool logoWriteIM6(void* image, const void* imageInfo, void* exceptionInfo
1818
return ffWriteImage(imageInfo, image) == MagickTrue;
1919
}
2020

21-
bool ffLogoPrintSixelIM6(FFinstance* instance)
21+
FFLogoSixelResult ffLogoPrintSixelIM6(FFinstance* instance)
2222
{
23-
FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-6.Q16HDRI.so", 8, "libMagickCore-6.Q16.so", 8)
23+
FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, FF_LOGO_SIXEL_RESULT_INIT_ERROR, "libMagickCore-6.Q16HDRI.so", 8, "libMagickCore-6.Q16.so", 8)
2424

25-
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false);
26-
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false);
25+
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR);
26+
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR);
2727

2828
return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM6, logoWriteIM6);
2929
}

src/logo/sixel/im7.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ static bool logoWriteIM7(void* image, const void* imageInfo, void* exceptionInfo
1717
return ffWriteImage(imageInfo, image, exceptionInfo) == MagickTrue;
1818
}
1919

20-
bool ffLogoPrintSixelIM7(FFinstance* instance)
20+
FFLogoSixelResult ffLogoPrintSixelIM7(FFinstance* instance)
2121
{
22-
FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-7.Q16HDRI.so", 11, "libMagickCore-7.Q16.so", 11)
22+
FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, FF_LOGO_SIXEL_RESULT_INIT_ERROR, "libMagickCore-7.Q16HDRI.so", 11, "libMagickCore-7.Q16.so", 11)
2323

24-
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false);
25-
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false);
24+
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR);
25+
FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR);
2626

2727
return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM7, logoWriteIM7);
2828
}

src/logo/sixel/sixel.c

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,33 @@
99
#include <magick/MagickCore.h>
1010
#endif
1111

12-
bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc)
12+
FFLogoSixelResult ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc)
1313
{
1414
struct winsize winsize;
1515
if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != 0)
16-
return false;
16+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
1717

18-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireExceptionInfo, false)
19-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyExceptionInfo, false)
20-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireImageInfo, false)
21-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImageInfo, false)
22-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, CopyMagickString, false)
23-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, ReadImage, false)
24-
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImage, false)
18+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireExceptionInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
19+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyExceptionInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
20+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, AcquireImageInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
21+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImageInfo, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
22+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, CopyMagickString, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
23+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, ReadImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
24+
FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImage, FF_LOGO_SIXEL_RESULT_INIT_ERROR)
2525

2626
ExceptionInfo* exceptionInfo = ffAcquireExceptionInfo();
2727
if(exceptionInfo == NULL)
2828
{
2929
dlclose(imageMagick);
30-
return false;
30+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
3131
}
3232

3333
ImageInfo* imageInfoIn = ffAcquireImageInfo();
3434
if(imageInfoIn == NULL)
3535
{
3636
ffDestroyExceptionInfo(exceptionInfo);
3737
dlclose(imageMagick);
38-
return false;
38+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
3939
}
4040

4141
//+1, because we need to copy the null byte too
@@ -47,7 +47,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz
4747
{
4848
ffDestroyExceptionInfo(exceptionInfo);
4949
dlclose(imageMagick);
50-
return false;
50+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
5151
}
5252

5353
double characterPixelWidth = winsize.ws_xpixel / (double) winsize.ws_col;
@@ -62,7 +62,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz
6262
ffDestroyImage(originalImage);
6363
ffDestroyExceptionInfo(exceptionInfo);
6464
dlclose(imageMagick);
65-
return false;
65+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
6666
}
6767

6868
Image* resizedImage = (Image*) resizeFunc(originalImage, (size_t) imagePixelWidth, (size_t) imagePixelHeight, exceptionInfo);
@@ -71,7 +71,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz
7171
{
7272
ffDestroyExceptionInfo(exceptionInfo);
7373
dlclose(imageMagick);
74-
return false;
74+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
7575
}
7676

7777
ImageInfo* imageInfoOut = ffAcquireImageInfo();
@@ -80,7 +80,7 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz
8080
ffDestroyImage(resizedImage);
8181
ffDestroyExceptionInfo(exceptionInfo);
8282
dlclose(imageMagick);
83-
return false;
83+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
8484
}
8585

8686
ffPrintCharTimes(' ', instance->config.logoPaddingLeft);
@@ -96,32 +96,34 @@ bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResiz
9696
dlclose(imageMagick);
9797

9898
if(writeResult == MagickFalse)
99-
return false;
99+
return FF_LOGO_SIXEL_RESULT_RUN_ERROR;
100100

101101
instance->state.logoHeight = (uint32_t) (imagePixelHeight / characterPixelHeight);
102102
instance->state.logoWidth = instance->config.logoWidth + instance->config.logoPaddingLeft + instance->config.logoPaddingRight;
103103

104104
fputs("\033[9999999D", stdout);
105105
printf("\033[%uA", instance->state.logoHeight);
106106

107-
return true;
107+
return FF_LOGO_SIXEL_RESULT_SUCCESS;
108108
}
109109
#endif
110110

111111
bool ffLogoPrintSixelIfExists(FFinstance* instance)
112112
{
113-
#ifdef FF_HAVE_IMAGEMAGICK7
114-
if(ffLogoPrintSixelIM7(instance))
115-
return true;
113+
#if !defined(FF_HAVE_IMAGEMAGICK7) && !defined(FF_HAVE_IMAGEMAGICK6)
114+
FF_UNUSED(instance);
116115
#endif
117116

118-
#ifdef FF_HAVE_IMAGEMAGICK6
119-
if(ffLogoPrintSixelIM6(instance))
117+
#ifdef FF_HAVE_IMAGEMAGICK7
118+
FFLogoSixelResult result = ffLogoPrintSixelIM7(instance);
119+
if(result == FF_LOGO_SIXEL_RESULT_SUCCESS)
120120
return true;
121+
else if(result == FF_LOGO_SIXEL_RESULT_RUN_ERROR)
122+
return false;
121123
#endif
122124

123-
#if !defined(FF_HAVE_IMAGEMAGICK7) && !defined(FF_HAVE_IMAGEMAGICK6)
124-
FF_UNUSED(instance);
125+
#ifdef FF_HAVE_IMAGEMAGICK6
126+
return ffLogoPrintSixelIM6(instance) == FF_LOGO_SIXEL_RESULT_SUCCESS
125127
#endif
126128

127129
return false;

src/logo/sixel/sixel.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,6 @@
55

66
#include "fastfetch.h"
77

8-
#ifdef FF_HAVE_IMAGEMAGICK7
9-
bool ffLogoPrintSixelIM7(FFinstance* instance);
10-
#endif
11-
12-
#ifdef FF_HAVE_IMAGEMAGICK6
13-
#include <math.h>
14-
bool ffLogoPrintSixelIM6(FFinstance* instance);
15-
#endif
16-
178
#if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6)
189

1910
#include <sys/ioctl.h>
@@ -22,11 +13,28 @@ bool ffLogoPrintSixelIM6(FFinstance* instance);
2213
#define MAGICKCORE_HDRI_ENABLE 1
2314
#define MAGICKCORE_QUANTUM_DEPTH 16
2415

16+
typedef enum FFLogoSixelResult
17+
{
18+
FF_LOGO_SIXEL_RESULT_SUCCESS, //Logo printed
19+
FF_LOGO_SIXEL_RESULT_INIT_ERROR, //Failed to load library, try again with next IM version
20+
FF_LOGO_SIXEL_RESULT_RUN_ERROR //Failed to load / convert image, cancle whole sixel code
21+
} FFLogoSixelResult;
22+
2523
typedef void*(*FFLogoIMResizeFunc)(const void* image, size_t width, size_t height, void* exceptionInfo);
2624
typedef bool(*FFLogoIMWriteFunc)(void* image, const void* imageInfo, void* exceptionInfo);
2725

28-
bool ffLogoPrintSixelImpl(FFinstance* instance, void* library, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc);
26+
FFLogoSixelResult ffLogoPrintSixelImpl(FFinstance* instance, void* library, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc);
2927

3028
#endif
3129

30+
#ifdef FF_HAVE_IMAGEMAGICK7
31+
FFLogoSixelResult ffLogoPrintSixelIM7(FFinstance* instance);
32+
#endif
33+
34+
#ifdef FF_HAVE_IMAGEMAGICK6
35+
#include <math.h>
36+
FFLogoSixelResult ffLogoPrintSixelIM6(FFinstance* instance);
37+
#endif
38+
39+
3240
#endif

0 commit comments

Comments
 (0)