diff --git a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp index e11e7b2091..496612d084 100644 --- a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp +++ b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp @@ -1,287 +1,325 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2019-09-21 * Description : ImageMagick DImg plugin. * * Copyright (C) 2019 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "dimgimagemagickplugin.h" // Image Magick includes #include #if MagickLibVersion < 0x700 # include #endif using namespace Magick; using namespace MagickCore; // Qt includes #include #include // KDE includes #include // Local includes #include "digikam_debug.h" #include "digikam_globals.h" #include "dimgimagemagickloader.h" #include "drawdecoder.h" namespace DigikamImageMagickDImgPlugin { DImgImageMagickPlugin::DImgImageMagickPlugin(QObject* const parent) : DPluginDImg(parent) { MagickCoreGenesis((char*)NULL ,MagickFalse); } DImgImageMagickPlugin::~DImgImageMagickPlugin() { MagickCoreTerminus(); } QString DImgImageMagickPlugin::name() const { return i18n("ImageMagick loader"); } QString DImgImageMagickPlugin::iid() const { return QLatin1String(DPLUGIN_IID); } QIcon DImgImageMagickPlugin::icon() const { return QIcon::fromTheme(QLatin1String("image-x-generic")); } QString DImgImageMagickPlugin::description() const { return i18n("An image loader based on ImageMagick coders"); } QString DImgImageMagickPlugin::details() const { return i18n("

This plugin permit to load and save image using ImageMagick coders.

" "

ImageMagick is a free and open-source software suite for converting raster image and vector image files. " "It can read and write over 200 image file formats.

" "

See ImageMagick documentation for details.

" ); } QList DImgImageMagickPlugin::authors() const { return QList() << DPluginAuthor(QString::fromUtf8("Maik Qualmann"), QString::fromUtf8("metzpinguin at gmail dot com"), QString::fromUtf8("(C) 2019")) << DPluginAuthor(QString::fromUtf8("Gilles Caulier"), QString::fromUtf8("caulier dot gilles at gmail dot com"), QString::fromUtf8("(C) 2006-2019")) ; } void DImgImageMagickPlugin::setup(QObject* const /*parent*/) { // Nothing to do } +QMap DImgImageMagickPlugin::extraAboutData() const +{ + QString mimes = typeMimes(); + + QMap map; + ExceptionInfo ex; + size_t n = 0; + const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex); + + if (!inflst) + { + qWarning() << "ImageMagick coders list is null!"; + return QMap(); + } + + for (uint i = 0 ; i < n ; ++i) + { + const MagickInfo* inf = inflst[i]; + + if (inf) + { + QString mod = +#if (MagickLibVersion >= 0x69A && defined(magick_module)) + QString::fromLatin1(inf->magick_module).toUpper(); +#else + QString::fromLatin1(inf->module).toUpper(); +#endif + + if (mimes.contains(mod)) + { + map.insert(mod, QLatin1String(inf->description)); + } + } + } + + return map; +} + QString DImgImageMagickPlugin::loaderName() const { return QLatin1String("IMAGEMAGICK"); } QString DImgImageMagickPlugin::typeMimes() const { QStringList formats; ExceptionInfo ex; size_t n = 0; const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex); if (!inflst) { qWarning() << "ImageMagick coders list is null!"; return QString(); } for (uint i = 0 ; i < n ; ++i) { const MagickInfo* inf = inflst[i]; if (inf && inf->decoder) { #if (MagickLibVersion >= 0x69A && defined(magick_module)) formats.append(QString::fromLatin1(inf->magick_module).toUpper()); #else formats.append(QString::fromLatin1(inf->module).toUpper()); #endif } } qDebug() << "ImageMagick support this formats:" << formats; formats.removeAll(QLatin1String("JPEG")); // JPEG file format formats.removeAll(QLatin1String("JPG")); // JPEG file format formats.removeAll(QLatin1String("JPE")); // JPEG file format formats.removeAll(QLatin1String("PNG")); formats.removeAll(QLatin1String("TIFF")); formats.removeAll(QLatin1String("TIF")); formats.removeAll(QLatin1String("PGF")); formats.removeAll(QLatin1String("JP2")); // JPEG2000 file format formats.removeAll(QLatin1String("JPX")); // JPEG2000 file format formats.removeAll(QLatin1String("JPC")); // JPEG2000 code stream formats.removeAll(QLatin1String("J2K")); // JPEG2000 code stream formats.removeAll(QLatin1String("PGX")); // JPEG2000 WM format formats.removeAll(QLatin1String("HEIC")); QString rawFilesExt = QString::fromLatin1(DRawDecoder::rawFiles()).remove(QLatin1String("*.")).toUpper(); foreach (const QString& str, rawFilesExt.split(QLatin1Char(' '))) { formats.removeAll(str); // All Raw image formats } QString ret; foreach (const QString& str, formats) { if (!ret.contains(str)) { ret += QString::fromUtf8("%1 ").arg(str.toUpper()); } } return ret; } bool DImgImageMagickPlugin::canRead(const QString& filePath) const { QString mimeType(QMimeDatabase().mimeTypeForFile(filePath).name()); // Ignore non image format. if ( mimeType.startsWith(QLatin1String("video/")) || mimeType.startsWith(QLatin1String("audio/")) ) { return false; } QString format = QFileInfo(filePath).suffix().toUpper(); QString blackList = QString::fromLatin1(DRawDecoder::rawFiles()).remove(QLatin1String("*.")).toUpper(); // Ignore RAW files blackList.append(QLatin1String(" JPEG JPG JPE PNG TIF TIFF PGF JP2 JPX JPC J2K PGX HEIC ")); // Ignore native loaders if (blackList.toUpper().contains(format)) { return false; } QStringList formats; ExceptionInfo ex; size_t n = 0; const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex); if (!inflst) { qWarning() << "ImageMagick coders list is null!"; return false; } for (uint i = 0 ; i < n ; ++i) { const MagickInfo* inf = inflst[i]; if (inf && inf->decoder) { #if (MagickLibVersion >= 0x69A && defined(magick_module)) formats.append(QString::fromLatin1(inf->magick_module).toUpper()); #else formats.append(QString::fromLatin1(inf->module).toUpper()); #endif } } if (!formats.contains(format)) { return false; } return true; } bool DImgImageMagickPlugin::canWrite(const QString& format) const { QString blackList = QString::fromLatin1(DRawDecoder::rawFiles()).remove(QLatin1String("*.")).toUpper(); // Ignore RAW files blackList.append(QLatin1String(" JPEG JPG JPE PNG TIF TIFF PGF JP2 JPX JPC J2K PGX HEIC ")); // Ignore native loaders if (blackList.toUpper().contains(format)) { return false; } // NOTE: Native loaders support are previously black-listed. // For ex, if tiff is supported in write mode by ImageMagick it will never be handled. QStringList formats; ExceptionInfo ex; size_t n = 0; const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex); if (!inflst) { qWarning() << "ImageMagick coders list is null!"; return false; } for (uint i = 0 ; i < n ; ++i) { const MagickInfo* inf = inflst[i]; if (inf && inf->encoder) { #if (MagickLibVersion >= 0x69A && defined(magick_module)) formats.append(QString::fromLatin1(inf->magick_module).toUpper()); #else formats.append(QString::fromLatin1(inf->module).toUpper()); #endif } } if (!formats.contains(format)) { return false; } return true; } DImgLoader* DImgImageMagickPlugin::loader(DImg* const image, const DRawDecoding&) const { return new DImgImageMagickLoader(image); } } // namespace DigikamImageMagickDImgPlugin diff --git a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.h b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.h index 02616ec236..21df26de93 100644 --- a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.h +++ b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.h @@ -1,72 +1,73 @@ /* ============================================================ * * This file is a part of digiKam project * https://www.digikam.org * * Date : 2019-09-21 * Description : ImageMagick DImg plugin. * * Copyright (C) 2019 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #ifndef DIGIKAM_DIMG_IMAGE_MAGICK_PLUGIN_H #define DIGIKAM_DIMG_IMAGE_MAGICK_PLUGIN_H // Qt includes #include #include // Local includes #include "dplugindimg.h" #include "dimg.h" #define DPLUGIN_IID "org.kde.digikam.plugin.dimg.ImageMagick" using namespace Digikam; namespace DigikamImageMagickDImgPlugin { class DImgImageMagickPlugin : public DPluginDImg { Q_OBJECT Q_PLUGIN_METADATA(IID DPLUGIN_IID) Q_INTERFACES(Digikam::DPluginDImg) public: explicit DImgImageMagickPlugin(QObject* const parent = nullptr); ~DImgImageMagickPlugin(); QString name() const override; QString iid() const override; QIcon icon() const override; QString details() const override; QString description() const override; QList authors() const override; - void setup(QObject* const) override; + void setup(QObject* const) override; + QMap extraAboutData() const override; QString loaderName() const; QString typeMimes() const; bool canRead(const QString& filePath) const; bool canWrite(const QString& format) const; DImgLoader* loader(DImg* const image, const DRawDecoding& rawSettings = DRawDecoding()) const; }; } // namespace DigikamImageMagickDImgPlugin #endif // DIGIKAM_DIMG_IMAGE_MAGICK_PLUGIN_H