diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index d94533b1a..e593fc898 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 - name: install required packages - run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libxfconf-0-dev rpm librpm-dev libzstd-dev + run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-6.q16-dev libxfconf-0-dev rpm librpm-dev libzstd-dev - name: Initialize CodeQL uses: github/codeql-action/init@v1 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 70ff2df97..3448a2ec9 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v2 - name: install required packages - run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libxfconf-0-dev rpm librpm-dev libzstd-dev + run: sudo apt-get update && sudo apt-get install -y libpci-dev libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-6.q16-dev libxfconf-0-dev rpm librpm-dev libzstd-dev - name: Initialize CodeQL uses: github/codeql-action/init@v1 diff --git a/CMakeLists.txt b/CMakeLists.txt index d46848480..85bce946d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,8 @@ OPTION(ENABLE_DCONF "Enable dconf" ON) OPTION(ENABLE_DBUS "Enable dbus-1" ON) OPTION(ENABLE_XFCONF "Enable libxfconf-0" ON) OPTION(ENABLE_RPM "Enable rpm" ON) -OPTION(ENABLE_IMAGEMAGICK "Enable imagemagick" ON) +OPTION(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON) +OPTION(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) @@ -112,7 +113,9 @@ add_library(libfastfetch STATIC src/common/networking.c src/logo/logo.c src/logo/builtin.c - src/logo/image.c + src/logo/sixel/sixel.c + src/logo/sixel/im7.c + src/logo/sixel/im6.c src/detection/os.c src/detection/plasma.c src/detection/gtk.c @@ -163,121 +166,138 @@ add_library(libfastfetch STATIC ) if(ENABLE_LIBPCI) - pkg_check_modules (LIBPCI libpci) + pkg_check_modules(LIBPCI libpci) if(LIBPCI_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_LIBPCI=1) - else(LIBPCI_FOUND) + else() message(WARNING "Package libpci not found. Building without support.") - endif(LIBPCI_FOUND) -endif(ENABLE_LIBPCI) + endif() +endif() if(ENABLE_VULKAN) - pkg_check_modules (VULKAN vulkan) + pkg_check_modules(VULKAN vulkan) if(VULKAN_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_VULKAN=1) - else(VULKAN_FOUND) + else() message(WARNING "Package vulkan not found. Building without support.") - endif(VULKAN_FOUND) -endif(ENABLE_VULKAN) + endif() +endif() if(ENABLE_WAYLAND) pkg_check_modules (WAYLAND wayland-client) if(WAYLAND_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_WAYLAND=1) - else(WAYLAND_FOUND) + else() message(WARNING "Package wayland-client not found. Building without support.") - endif(WAYLAND_FOUND) -endif(ENABLE_WAYLAND) + endif() +endif() if(ENABLE_XCB_RANDR) - pkg_check_modules (XCB_RANDR xcb-randr) + pkg_check_modules(XCB_RANDR xcb-randr) if(XCB_RANDR_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_XCB_RANDR=1) - else(XCB_RANDR_FOUND) + else() message(WARNING "Package xcb-randr not found. Building without support.") - endif(XCB_RANDR_FOUND) -endif(ENABLE_XCB_RANDR) + endif() +endif() if(ENABLE_XCB) pkg_check_modules (XCB xcb) if(XCB_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_XCB=1) - else(XCB_FOUND) + else() message(WARNING "Package xcb not found. Building without support.") - endif(XCB_FOUND) -endif(ENABLE_XCB) + endif() +endif() if(ENABLE_XRANDR) - pkg_check_modules (XRANDR xrandr) + pkg_check_modules(XRANDR xrandr) if(XRANDR_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_XRANDR=1) - else(XRANDR_FOUND) + else() message(WARNING "Package xrandr not found. Building without support.") - endif(XRANDR_FOUND) -endif(ENABLE_XRANDR) + endif() +endif() if(ENABLE_X11) - pkg_check_modules (X11 x11) + pkg_check_modules(X11 x11) if(X11_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_X11=1) - else(X11_FOUND) + else() message(WARNING "Package x11 not found. Building without support.") - endif(X11_FOUND) -endif(ENABLE_X11) + endif() +endif() if(ENABLE_GIO) - pkg_check_modules (GIO gio-2.0) + pkg_check_modules(GIO gio-2.0) if(GIO_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_GIO=1) - else(GIO_FOUND) + else() message(WARNING "Package gio-2.0 not found. Building without support.") - endif(GIO_FOUND) -endif(ENABLE_GIO) + endif() +endif() if(ENABLE_DCONF) - pkg_check_modules (DCONF dconf) + pkg_check_modules(DCONF dconf) if(DCONF_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_DCONF=1) - else(DCONF_FOUND) + else() message(WARNING "Package dconf not found. Building without support.") - endif(DCONF_FOUND) -endif(ENABLE_DCONF) + endif() +endif() if(ENABLE_DBUS) - pkg_check_modules (DBUS dbus-1) + pkg_check_modules(DBUS dbus-1) if(DBUS_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_DBUS=1) - else(DBUS_FOUND) + else() message(WARNING "Package dbus-1 not found. Building without support.") - endif(DBUS_FOUND) -endif(ENABLE_DBUS) + endif() +endif() if(ENABLE_XFCONF) - pkg_check_modules (XFCONF libxfconf-0) + pkg_check_modules(XFCONF libxfconf-0) if(XFCONF_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_XFCONF=1) - else(XFCONF_FOUND) + else() message(WARNING "Package libxfconf-0 not found. Building without support.") - endif(XFCONF_FOUND) -endif(ENABLE_XFCONF) + endif() +endif() if(ENABLE_RPM) - pkg_check_modules (RPM rpm) + pkg_check_modules(RPM rpm) if(RPM_FOUND) target_compile_definitions(libfastfetch PRIVATE FF_HAVE_RPM=1) - else(RPM_FOUND) + else() message(WARNING "Package librpm not found. Building without support.") - endif(RPM_FOUND) -endif(ENABLE_RPM) + endif() +endif() -if(ENABLE_IMAGEMAGICK) - pkg_check_modules (IMAGEMAGICK MagickCore-7.Q16HDRI) - if(IMAGEMAGICK_FOUND) - target_compile_definitions(libfastfetch PRIVATE FF_HAVE_IMAGEMAGICK=1) - else(IMAGEMAGICK_FOUND) - message(WARNING "Package MagickCore-7.Q16HDRI not found. Building without support.") - endif(IMAGEMAGICK_FOUND) -endif(ENABLE_IMAGEMAGICK) +if(ENABLE_IMAGEMAGICK7) + pkg_check_modules(IMAGEMAGICK7 MagickCore-7.Q16HDRI) + if(NOT IMAGEMAGICK7_FOUND) + pkg_check_modules(IMAGEMAGICK7 MagickCore-7.Q16) + endif() + + if(IMAGEMAGICK7_FOUND) + target_compile_definitions(libfastfetch PRIVATE FF_HAVE_IMAGEMAGICK7=1) + else() + message(WARNING "Package MagickCore-7.Q16HDRI or MagickCore-7.Q16 not found. Building without support.") + endif() +endif() + +if(ENABLE_IMAGEMAGICK6) + pkg_check_modules(IMAGEMAGICK6 MagickCore-6.Q16HDRI) + if(NOT IMAGEMAGICK6_FOUND) + pkg_check_modules(IMAGEMAGICK6 MagickCore-6.Q16) + endif() + + if(IMAGEMAGICK6_FOUND) + target_compile_definitions(libfastfetch PRIVATE FF_HAVE_IMAGEMAGICK6=1) + else() + message(WARNING "Package MagickCore-6.Q16HDRI or MagickCore-6.Q16 not found. Building without support.") + endif() +endif() target_include_directories(libfastfetch PUBLIC ${PROJECT_BINARY_DIR} @@ -295,23 +315,8 @@ target_include_directories(libfastfetch PRIVATE ${DBUS_INCLUDE_DIRS} PRIVATE ${XFCONF_INCLUDE_DIRS} PRIVATE ${RPM_INCLUDE_DIRS} - PRIVATE ${IMAGEMAGICK_INCLUDE_DIRS} -) - -target_compile_options(libfastfetch - PRIVATE ${LIBPCI_CFLAGS_OTHER} - PRIVATE ${VULKAN_CFLAGS_OTHER} - PRIVATE ${WAYLAND_CFLAGS_OTHER} - PRIVATE ${XCB_RANDR_CFLAGS_OTHER} - PRIVATE ${XCB_CFLAGS_OTHER} - PRIVATE ${XRANDR_CFLAGS_OTHER} - PRIVATE ${X11_CFLAGS_OTHER} - PRIVATE ${GIO_CFLAGS_OTHER} - PRIVATE ${DCONF_CFLAGS_OTHER} - PRIVATE ${DBUS_CFLAGS_OTHER} - PRIVATE ${XFCONF_CFLAGS_OTHER} - PRIVATE ${RPM_CFLAGS_OTHER} - PRIVATE ${IMAGEMAGICK_CFLAGS_OTHER} + PRIVATE ${IMAGEMAGICK7_INCLUDE_DIRS} + PRIVATE ${IMAGEMAGICK6_INCLUDE_DIRS} ) target_link_libraries(libfastfetch diff --git a/src/common/init.c b/src/common/init.c index 9652969c6..60e4d9887 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -308,8 +308,11 @@ void ffListFeatures() #ifdef FF_HAVE_DBUS "dbus\n" #endif - #ifdef FF_HAVE_IMAGEMAGICK - "imagemagick\n" + #ifdef FF_HAVE_IMAGEMAGICK7 + "imagemagick7\n" + #endif + #ifdef FF_HAVE_IMAGEMAGICK6 + "imagemagick6\n" #endif #ifdef FF_HAVE_XFCONF "xfconf\n" diff --git a/src/logo/logo.c b/src/logo/logo.c index e2b652834..22f504219 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -189,7 +189,10 @@ void ffPrintLogo(FFinstance* instance) else if(instance->config.logoType == FF_LOGO_TYPE_RAW) logoPrintFile(instance, false); else if(instance->config.logoType == FF_LOGO_TYPE_SIXEL) - ffLogoPrintSixel(instance); + { + if(!ffLogoPrintSixelIfExists(instance)) + ffLogoPrintUnknown(instance); + } else logoPrintDetected(instance); } diff --git a/src/logo/logo.h b/src/logo/logo.h index bd165340f..3ff2c39bd 100644 --- a/src/logo/logo.h +++ b/src/logo/logo.h @@ -16,8 +16,7 @@ void ffLogoPrintBuiltin(FFinstance* instance); bool ffLogoPrintBuiltinIfExists(FFinstance* instance); void ffLogoPrintBuiltinDetected(FFinstance* instance); -//image.c +//sixel/sixel.c bool ffLogoPrintSixelIfExists(FFinstance* instance); -void ffLogoPrintSixel(FFinstance* instance); #endif diff --git a/src/logo/sixel/im6.c b/src/logo/sixel/im6.c new file mode 100644 index 000000000..4a35be4cd --- /dev/null +++ b/src/logo/sixel/im6.c @@ -0,0 +1,31 @@ +#include "sixel.h" + +#ifdef FF_HAVE_IMAGEMAGICK6 + +#include + +static FF_LIBRARY_SYMBOL(ResizeImage); +static FF_LIBRARY_SYMBOL(WriteImage) + +static void* logoResizeIM6(const void* image, size_t width, size_t height, void* exceptionInfo) +{ + return ffResizeImage(image, width, height, UndefinedFilter, 1.0, exceptionInfo); +} + +static bool logoWriteIM6(void* image, const void* imageInfo, void* exceptionInfo) +{ + FF_UNUSED(exceptionInfo); + return ffWriteImage(imageInfo, image) == MagickTrue; +} + +bool ffLogoPrintSixelIM6(FFinstance* instance) +{ + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, "libMagickCore-6.Q16HDRI.so", "libMagickCore-6.Q16HDRI.so.6", "libMagickCore-6.Q16.so", "libMagickCore-6.Q16.so.6") + + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); + + return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM6, logoWriteIM6); +} + +#endif diff --git a/src/logo/sixel/im7.c b/src/logo/sixel/im7.c new file mode 100644 index 000000000..e730675a8 --- /dev/null +++ b/src/logo/sixel/im7.c @@ -0,0 +1,30 @@ +#include "sixel.h" + +#ifdef FF_HAVE_IMAGEMAGICK7 + +#include + +static FF_LIBRARY_SYMBOL(ResizeImage); +static FF_LIBRARY_SYMBOL(WriteImage) + +static void* logoResizeIM7(const void* image, size_t width, size_t height, void* exceptionInfo) +{ + return ffResizeImage(image, width, height, UndefinedFilter, exceptionInfo); +} + +static bool logoWriteIM7(void* image, const void* imageInfo, void* exceptionInfo) +{ + return ffWriteImage(imageInfo, image, exceptionInfo) == MagickTrue; +} + +bool ffLogoPrintSixelIM7(FFinstance* instance) +{ + FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, "libMagickCore-7.Q16HDRI.so", "libMagickCore-7.Q16HDRI.so.10", "libMagickCore-7.Q16.so", "libMagickCore-7.Q16.so.10") + + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffResizeImage, ResizeImage, false); + FF_LIBRARY_LOAD_SYMBOL_ADRESS(imageMagick, ffWriteImage, WriteImage, false); + + return ffLogoPrintSixelImpl(instance, imageMagick, logoResizeIM7, logoWriteIM7); +} + +#endif diff --git a/src/logo/image.c b/src/logo/sixel/sixel.c similarity index 77% rename from src/logo/image.c rename to src/logo/sixel/sixel.c index 25281e891..70876e630 100644 --- a/src/logo/image.c +++ b/src/logo/sixel/sixel.c @@ -1,26 +1,26 @@ -#include "logo.h" +#include "sixel.h" -#ifdef FF_HAVE_IMAGEMAGICK +#if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6) -#include -#include -#include +//We use only the defines from here, that are exactly the same in both versions +#ifdef FF_HAVE_IMAGEMAGICK7 + #include +#else + #include +#endif -static bool printSixel(FFinstance* instance) +bool ffLogoPrintSixelImpl(FFinstance* instance, void* imageMagick, FFLogoIMResizeFunc resizeFunc, FFLogoIMWriteFunc writeFunc) { struct winsize winsize; if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize) != 0) return false; - FF_LIBRARY_LOAD(imageMagick, instance->config.libImageMagick, false, "libMagickCore-7.Q16HDRI.so", "libMagickCore-7.Q16HDRI.so.10") 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, ResizeImage, false) - FF_LIBRARY_LOAD_SYMBOL(imageMagick, WriteImage, false) FF_LIBRARY_LOAD_SYMBOL(imageMagick, DestroyImage, false) ExceptionInfo* exceptionInfo = ffAcquireExceptionInfo(); @@ -65,7 +65,7 @@ static bool printSixel(FFinstance* instance) return false; } - Image* resizedImage = ffResizeImage(originalImage, (size_t) imagePixelWidth, (size_t) imagePixelHeight, UndefinedFilter, exceptionInfo); + Image* resizedImage = (Image*) resizeFunc(originalImage, (size_t) imagePixelWidth, (size_t) imagePixelHeight, exceptionInfo); ffDestroyImage(originalImage); if(resizedImage == NULL) { @@ -88,7 +88,7 @@ static bool printSixel(FFinstance* instance) imageInfoOut->file = stdout; ffCopyMagickString(imageInfoOut->magick, "SIXEL", 6); - MagickBooleanType writeResult = ffWriteImage(imageInfoOut, resizedImage, exceptionInfo); + MagickBooleanType writeResult = writeFunc(resizedImage, imageInfoOut, exceptionInfo) ? MagickTrue : MagickFalse; ffDestroyImageInfo(imageInfoOut); ffDestroyImage(resizedImage); @@ -106,22 +106,23 @@ static bool printSixel(FFinstance* instance) return true; } - #endif bool ffLogoPrintSixelIfExists(FFinstance* instance) { - #ifdef FF_HAVE_IMAGEMAGICK - return printSixel(instance); - #else + #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 return false; } - -void ffLogoPrintSixel(FFinstance* instance) -{ - if(!ffLogoPrintSixelIfExists(instance)) - ffLogoPrintBuiltinDetected(instance); -} diff --git a/src/logo/sixel/sixel.h b/src/logo/sixel/sixel.h new file mode 100644 index 000000000..5d50c76fe --- /dev/null +++ b/src/logo/sixel/sixel.h @@ -0,0 +1,31 @@ +#pragma once + +#ifndef FF_INCLUDED_LOGO_SIXEL_sixel +#define FF_INCLUDED_LOGO_SIXEL_sixel + +#include "fastfetch.h" + +#if defined(FF_HAVE_IMAGEMAGICK7) || defined(FF_HAVE_IMAGEMAGICK6) + +#include +#include + +#define MAGICKCORE_HDRI_ENABLE 1 +#define MAGICKCORE_QUANTUM_DEPTH 16 + +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); + +#endif + +#ifdef FF_HAVE_IMAGEMAGICK7 +bool ffLogoPrintSixelIM7(FFinstance* instance); +#endif + +#ifdef FF_HAVE_IMAGEMAGICK6 +bool ffLogoPrintSixelIM6(FFinstance* instance); +#endif + +#endif