diff --git a/AUTHORS b/AUTHORS index 8435e77b6..18e686e17 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,6 +6,11 @@ Contributors: * Ishan Arora * Grigis Gaƫtan +Code from other projects: +* files src/ico.cpp src/ico.h + copyright: Malte Starostik + license: LGPL + Images Authors: * files: src/Icons/*.png copyright: Gnome Icon Theme diff --git a/Changelog b/Changelog index 5e339fb1f..ce5819eac 100644 --- a/Changelog +++ b/Changelog @@ -9,6 +9,7 @@ - FEATURE: Allow to force rechecking torrents - FEATURE: Added support for 2 new extensions (uTorrent metadata and smart ban plugin) - FEATURE: Allow to change the save path of torrents after addition + - FEATURE: Got rid of libmagick++ dependency * Unknown - Christophe Dumez - v1.2.1 - BUGFIX: Fixed possible crash when deleting a torrent permanently diff --git a/configure b/configure index a69ba6fd7..4ed800680 100755 --- a/configure +++ b/configure @@ -26,9 +26,6 @@ Dependency options: --with-libboost-inc=[path] Path to libboost include files --with-libcurl-inc=[path] Path to libcurl include files --with-libcurl-lib=[path] Path to libcurl library files - --disable-libmagick Disable use of libmagick - --with-libmagick-inc=[path] Path to libmagick++ include files - --with-libmagick-lib=[path] Path to libmagick++ library files --disable-libzzip Disable use of libzzip --with-libzzip-inc=[path] Path to libzzip++ include files --with-libzzip-lib=[path] Path to libzzip++ library files @@ -178,21 +175,6 @@ while [ $# -gt 0 ]; do shift ;; - --disable-libmagick) - QC_DISABLE_libmagick="Y" - shift - ;; - - --with-libmagick-inc=*) - QC_WITH_LIBMAGICK_INC=$optarg - shift - ;; - - --with-libmagick-lib=*) - QC_WITH_LIBMAGICK_LIB=$optarg - shift - ;; - --disable-libzzip) QC_DISABLE_libzzip="Y" shift @@ -235,9 +217,6 @@ echo QC_WITH_LIBTORRENT_STATIC_LIB=$QC_WITH_LIBTORRENT_STATIC_LIB echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB -echo QC_DISABLE_libmagick=$QC_DISABLE_libmagick -echo QC_WITH_LIBMAGICK_INC=$QC_WITH_LIBMAGICK_INC -echo QC_WITH_LIBMAGICK_LIB=$QC_WITH_LIBMAGICK_LIB echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB @@ -553,86 +532,6 @@ public: return true; } }; -#line 1 "libmagick.qcm" -/* ------BEGIN QCMOD----- -name: libmagick -arg: with-libmagick-inc=[path], Path to libmagick++ include files -arg: with-libmagick-lib=[path], Path to libmagick++ library files ------END QCMOD----- -*/ -#include -class qc_libmagick : public ConfObj -{ -public: - qc_libmagick(Conf *c) : ConfObj(c) {} - QString name() const { return "ImageMagick library (libmagick++)"; } - QString shortname() const { return "libmagick++"; } - QString checkString() const { - if(!conf->getenv("QC_DISABLE_libmagick").isEmpty()) - return ""; - return ConfObj::checkString(); - } - bool exec(){ - if(!conf->getenv("QC_DISABLE_libmagick").isEmpty()) - return false; - QString s; - s = conf->getenv("QC_WITH_LIBMAGICK_INC"); - if(!s.isEmpty()) { - if(!conf->checkHeader(s, "Magick++.h")) { - return false; - } - }else{ - QStringList sl; - sl << "/usr/include"; - sl << "/usr/local/include"; - bool found = false; - foreach(s, sl){ - if(conf->checkHeader(s, "Magick++.h")){ - found = true; - break; - } - } - if(!found) - return false; - } - conf->addIncludePath(s); - - s = conf->getenv("QC_WITH_LIBMAGICK_LIB"); - if(!s.isEmpty()) { - if(!conf->checkLibrary(s, "Magick++")) { - return false; - } - }else{ - QStringList sl; - sl << "/usr/lib/"; - sl << "/usr/lib64/"; - sl << "/usr/local/lib/"; - sl << "/usr/local/lib64/"; - bool found = false; - foreach(s, sl){ - if(conf->checkLibrary(s, "Magick++")) { - found = true; - break; - } - } - if(!found) - return false; - } - conf->addLib(QString("-L") + s); - QProcess magickConfig; - QStringList params; - params << "--libs"; - magickConfig.start("Magick++-config", params, QIODevice::ReadOnly); - magickConfig.waitForStarted(); - magickConfig.waitForFinished(); - QByteArray result = magickConfig.readAll(); - result = result.replace("\n", ""); - conf->addLib(result.data()); - conf->addDefine("HAVE_MAGICK"); - return true; - } -}; #line 1 "libzzip.qcm" /* -----BEGIN QCMOD----- @@ -720,9 +619,6 @@ cat >$1/modules_new.cpp <required = true; o->disabled = false; - o = new qc_libmagick(conf); - o->required = false; - o->disabled = false; o = new qc_libzzip(conf); o->required = false; o->disabled = false; @@ -1677,9 +1573,6 @@ export QC_WITH_LIBTORRENT_STATIC_LIB export QC_WITH_LIBBOOST_INC export QC_WITH_LIBCURL_INC export QC_WITH_LIBCURL_LIB -export QC_DISABLE_libmagick -export QC_WITH_LIBMAGICK_INC -export QC_WITH_LIBMAGICK_LIB export QC_DISABLE_libzzip export QC_WITH_LIBZZIP_INC export QC_WITH_LIBZZIP_LIB diff --git a/qbittorrent.qc b/qbittorrent.qc index 44e7c0f4f..ffb74fe12 100644 --- a/qbittorrent.qc +++ b/qbittorrent.qc @@ -15,6 +15,5 @@ - diff --git a/src/engineSelectDlg.cpp b/src/engineSelectDlg.cpp index 53a76228f..bc6d54186 100644 --- a/src/engineSelectDlg.cpp +++ b/src/engineSelectDlg.cpp @@ -32,11 +32,6 @@ #include #include -#ifdef HAVE_MAGICK - #include - using namespace Magick; -#endif - #ifdef HAVE_ZZIP #include #endif @@ -611,20 +606,6 @@ void engineSelectDlg::processDownloadedFile(QString url, QString filePath) { if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){ // Icon downloaded QImage fileIcon; -#ifdef HAVE_MAGICK - try{ - QFile::copy(filePath, filePath+".ico"); - Image image(QDir::cleanPath(filePath+".ico").toUtf8().data()); - // Convert to PNG since we can't read ICO format - image.magick("PNG"); - // Resize to 16x16px - image.sample(Geometry(16, 16)); - image.write(filePath.toUtf8().data()); - QFile::remove(filePath+".ico"); - }catch(Magick::Exception &error_){ - qDebug("favicon conversion to PNG failure: %s", error_.what()); - } -#endif if(fileIcon.load(filePath)) { QList items = findItemsWithUrl(url); QTreeWidgetItem *item; diff --git a/src/ico.cpp b/src/ico.cpp new file mode 100644 index 000000000..ad87ba264 --- /dev/null +++ b/src/ico.cpp @@ -0,0 +1,470 @@ +/* + * kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +// remove when QImage::jumpTable is ported +#define QT3_SUPPORT +#define QT3_SUPPORT_WARNINGS +#ifdef __GNUC__ +#warning TODO: remove QT3_SUPPORT +#endif + +#include "ico.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ + // Global header (see http://www.daubnet.com/formats/ICO.html) + struct IcoHeader + { + enum Type { Icon = 1, Cursor }; + quint16 reserved; + quint16 type; + quint16 count; + }; + + inline QDataStream& operator >>( QDataStream& s, IcoHeader& h ) + { + return s >> h.reserved >> h.type >> h.count; + } + + // Based on qt_read_dib et al. from qimage.cpp + // (c) 1992-2002 Trolltech AS. + struct BMP_INFOHDR + { + static const quint32 Size = 40; + quint32 biSize; // size of this struct + quint32 biWidth; // pixmap width + quint32 biHeight; // pixmap height + quint16 biPlanes; // should be 1 + quint16 biBitCount; // number of bits per pixel + enum Compression { RGB = 0 }; + quint32 biCompression; // compression method + quint32 biSizeImage; // size of image + quint32 biXPelsPerMeter; // horizontal resolution + quint32 biYPelsPerMeter; // vertical resolution + quint32 biClrUsed; // number of colors used + quint32 biClrImportant; // number of important colors + }; + const quint32 BMP_INFOHDR::Size; + + QDataStream& operator >>( QDataStream &s, BMP_INFOHDR &bi ) + { + s >> bi.biSize; + if ( bi.biSize == BMP_INFOHDR::Size ) + { + s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount; + s >> bi.biCompression >> bi.biSizeImage; + s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter; + s >> bi.biClrUsed >> bi.biClrImportant; + } + return s; + } + +#if 0 + QDataStream &operator<<( QDataStream &s, const BMP_INFOHDR &bi ) + { + s << bi.biSize; + s << bi.biWidth << bi.biHeight; + s << bi.biPlanes; + s << bi.biBitCount; + s << bi.biCompression; + s << bi.biSizeImage; + s << bi.biXPelsPerMeter << bi.biYPelsPerMeter; + s << bi.biClrUsed << bi.biClrImportant; + return s; + } +#endif + + // Header for every icon in the file + struct IconRec + { + unsigned char width; + unsigned char height; + quint16 colors; + quint16 hotspotX; + quint16 hotspotY; + quint32 size; + quint32 offset; + }; + + inline QDataStream& operator >>( QDataStream& s, IconRec& r ) + { + return s >> r.width >> r.height >> r.colors + >> r.hotspotX >> r.hotspotY >> r.size >> r.offset; + } + + struct LessDifference + { + LessDifference( unsigned s, unsigned c ) + : size( s ), colors( c ) {} + + bool operator ()( const IconRec& lhs, const IconRec& rhs ) const + { + // closest size match precedes everything else + if ( std::abs( int( lhs.width - size ) ) < + std::abs( int( rhs.width - size ) ) ) return true; + else if ( std::abs( int( lhs.width - size ) ) > + std::abs( int( rhs.width - size ) ) ) return false; + else if ( colors == 0 ) + { + // high/true color requested + if ( lhs.colors == 0 ) return true; + else if ( rhs.colors == 0 ) return false; + else return lhs.colors > rhs.colors; + } + else + { + // indexed icon requested + if ( lhs.colors == 0 && rhs.colors == 0 ) return false; + else if ( lhs.colors == 0 ) return false; + else return std::abs( int( lhs.colors - colors ) ) < + std::abs( int( rhs.colors - colors ) ); + } + } + unsigned size; + unsigned colors; + }; + + bool loadFromDIB( QDataStream& stream, const IconRec& rec, QImage& icon ) + { + BMP_INFOHDR header; + stream >> header; + if ( stream.atEnd() || header.biSize != BMP_INFOHDR::Size || + header.biSize > rec.size || + header.biCompression != BMP_INFOHDR::RGB || + ( header.biBitCount != 1 && header.biBitCount != 4 && + header.biBitCount != 8 && header.biBitCount != 24 && + header.biBitCount != 32 ) ) return false; + + unsigned paletteSize, paletteEntries; + + if (header.biBitCount > 8) + { + paletteEntries = 0; + paletteSize = 0; + } + else + { + paletteSize = (1 << header.biBitCount); + paletteEntries = paletteSize; + if (header.biClrUsed && header.biClrUsed < paletteSize) + paletteEntries = header.biClrUsed; + } + + // Always create a 32-bit image to get the mask right + // Note: this is safe as rec.width, rec.height are bytes + icon = QImage( rec.width, rec.height, QImage::Format_ARGB32 ); + if ( icon.isNull() ) return false; + + QVector< QRgb > colorTable( paletteSize ); + + colorTable.fill( QRgb( 0 ) ); + for ( unsigned i = 0; i < paletteEntries; ++i ) + { + unsigned char rgb[ 4 ]; + stream.readRawData( reinterpret_cast< char* >( &rgb ), + sizeof( rgb ) ); + colorTable[ i ] = qRgb( rgb[ 2 ], rgb[ 1 ], rgb[ 0 ] ); + } + + unsigned bpl = ( rec.width * header.biBitCount + 31 ) / 32 * 4; + + unsigned char* buf = new unsigned char[ bpl ]; + unsigned char** lines = icon.jumpTable(); + for ( unsigned y = rec.height; !stream.atEnd() && y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + unsigned char* pixel = buf; + QRgb* p = reinterpret_cast< QRgb* >( lines[ y ] ); + switch ( header.biBitCount ) + { + case 1: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ + ( pixel[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ]; + break; + case 4: + for ( unsigned x = 0; x < rec.width; ++x ) + if ( x & 1 ) *p++ = colorTable[ pixel[ x / 2 ] & 0x0f ]; + else *p++ = colorTable[ pixel[ x / 2 ] >> 4 ]; + break; + case 8: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ pixel[ x ] ]; + break; + case 24: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgb( pixel[ 3 * x + 2 ], + pixel[ 3 * x + 1 ], + pixel[ 3 * x ] ); + break; + case 32: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgba( pixel[ 4 * x + 2 ], + pixel[ 4 * x + 1 ], + pixel[ 4 * x ], + pixel[ 4 * x + 3] ); + break; + } + } + delete[] buf; + + if ( header.biBitCount < 32 ) + { + // Traditional 1-bit mask + bpl = ( rec.width + 31 ) / 32 * 4; + buf = new unsigned char[ bpl ]; + for ( unsigned y = rec.height; y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + QRgb* p = reinterpret_cast< QRgb* >( lines[ y ] ); + for ( unsigned x = 0; x < rec.width; ++x, ++p ) + if ( ( ( buf[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ) ) + *p &= RGB_MASK; + } + delete[] buf; + } + return true; + } +} + +ICOHandler::ICOHandler() +{ +} + +bool ICOHandler::canRead() const +{ + if (canRead(device())) { + setFormat("ico"); + return true; + } + return false; +} + +bool ICOHandler::read(QImage *outImage) +{ + + qint64 offset = device()->pos(); + + QDataStream stream( device() ); + stream.setByteOrder( QDataStream::LittleEndian ); + IcoHeader header; + stream >> header; + if ( stream.atEnd() || !header.count || + ( header.type != IcoHeader::Icon && header.type != IcoHeader::Cursor) ) + return false; + + unsigned requestedSize = 32; + unsigned requestedColors = QApplication::desktop()->depth() > 8 ? 0 : QApplication::desktop()->depth(); + int requestedIndex = -1; +#if 0 + if ( io->parameters() ) + { + QStringList params = QString(io->parameters()).split( ';', QString::SkipEmptyParts ); + QMap< QString, QString > options; + for ( QStringList::ConstIterator it = params.begin(); + it != params.end(); ++it ) + { + QStringList tmp = (*it).split( '=', QString::SkipEmptyParts ); + if ( tmp.count() == 2 ) options[ tmp[ 0 ] ] = tmp[ 1 ]; + } + if ( options[ "index" ].toUInt() ) + requestedIndex = options[ "index" ].toUInt(); + if ( options[ "size" ].toUInt() ) + requestedSize = options[ "size" ].toUInt(); + if ( options[ "colors" ].toUInt() ) + requestedColors = options[ "colors" ].toUInt(); + } +#endif + + typedef std::vector< IconRec > IconList; + IconList icons; + for ( unsigned i = 0; i < header.count; ++i ) + { + if ( stream.atEnd() ) + return false; + IconRec rec; + stream >> rec; + icons.push_back( rec ); + } + IconList::const_iterator selected; + if (requestedIndex >= 0) { + selected = std::min( icons.begin() + requestedIndex, icons.end() ); + } else { + selected = std::min_element( icons.begin(), icons.end(), + LessDifference( requestedSize, requestedColors ) ); + } + if ( stream.atEnd() || selected == icons.end() || + offset + selected->offset > device()->size() ) + return false; + + device()->seek( offset + selected->offset ); + QImage icon; + if ( loadFromDIB( stream, *selected, icon ) ) + { + icon.setText( "X-Index", 0, QString::number( selected - icons.begin() ) ); + if ( header.type == IcoHeader::Cursor ) + { + icon.setText( "X-HotspotX", 0, QString::number( selected->hotspotX ) ); + icon.setText( "X-HotspotY", 0, QString::number( selected->hotspotY ) ); + } + + *outImage = icon; + return true; + } + return false; +} + +bool ICOHandler::write(const QImage &/*image*/) +{ +#if 0 + if (image.isNull()) + return; + + QByteArray dibData; + QDataStream dib(dibData, QIODevice::ReadWrite); + dib.setByteOrder(QDataStream::LittleEndian); + + QImage pixels = image; + QImage mask; + if (io->image().hasAlphaBuffer()) + mask = image.createAlphaMask(); + else + mask = image.createHeuristicMask(); + mask.invertPixels(); + for ( int y = 0; y < pixels.height(); ++y ) + for ( int x = 0; x < pixels.width(); ++x ) + if ( mask.pixel( x, y ) == 0 ) pixels.setPixel( x, y, 0 ); + + if (!qt_write_dib(dib, pixels)) + return; + + uint hdrPos = dib.device()->at(); + if (!qt_write_dib(dib, mask)) + return; + memmove(dibData.data() + hdrPos, dibData.data() + hdrPos + BMP_WIN + 8, dibData.size() - hdrPos - BMP_WIN - 8); + dibData.resize(dibData.size() - BMP_WIN - 8); + + QDataStream ico(device()); + ico.setByteOrder(QDataStream::LittleEndian); + IcoHeader hdr; + hdr.reserved = 0; + hdr.type = Icon; + hdr.count = 1; + ico << hdr.reserved << hdr.type << hdr.count; + IconRec rec; + rec.width = image.width(); + rec.height = image.height(); + if (image.numColors() <= 16) + rec.colors = 16; + else if (image.depth() <= 8) + rec.colors = 256; + else + rec.colors = 0; + rec.hotspotX = 0; + rec.hotspotY = 0; + rec.dibSize = dibData.size(); + ico << rec.width << rec.height << rec.colors + << rec.hotspotX << rec.hotspotY << rec.dibSize; + rec.dibOffset = ico.device()->at() + sizeof(rec.dibOffset); + ico << rec.dibOffset; + + BMP_INFOHDR dibHeader; + dib.device()->at(0); + dib >> dibHeader; + dibHeader.biHeight = image.height() << 1; + dib.device()->at(0); + dib << dibHeader; + + ico.writeRawBytes(dibData.data(), dibData.size()); + return true; +#endif + return false; +} + +QByteArray ICOHandler::name() const +{ + return "ico"; +} + +bool ICOHandler::canRead(QIODevice *device) +{ + if (!device) { + qWarning("ICOHandler::canRead() called with no device"); + return false; + } + + const qint64 oldPos = device->pos(); + + char head[8]; + qint64 readBytes = device->read(head, sizeof(head)); + const bool readOk = readBytes == sizeof(head); + + if (device->isSequential()) { + while (readBytes > 0) + device->ungetChar(head[readBytes-- - 1]); + } else { + device->seek(oldPos); + } + + if ( !readOk ) + return false; + + return head[2] == '\001' && head[3] == '\000' && // type should be 1 + ( head[6] == 16 || head[6] == 32 || head[6] == 64 ) && // width can only be one of those + ( head[7] == 16 || head[7] == 32 || head[7] == 64 ); // same for height +} + +class ICOPlugin : public QImageIOPlugin +{ +public: + QStringList keys() const; + Capabilities capabilities(QIODevice *device, const QByteArray &format) const; + QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const; +}; + +QStringList ICOPlugin::keys() const +{ + return QStringList() << "ico" << "ICO"; +} + +QImageIOPlugin::Capabilities ICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const +{ + if (format == "ico" || format == "ICO") + return Capabilities(CanRead); + if (!format.isEmpty()) + return 0; + if (!device->isOpen()) + return 0; + + Capabilities cap; + if (device->isReadable() && ICOHandler::canRead(device)) + cap |= CanRead; + return cap; +} + +QImageIOHandler *ICOPlugin::create(QIODevice *device, const QByteArray &format) const +{ + QImageIOHandler *handler = new ICOHandler; + handler->setDevice(device); + handler->setFormat(format); + return handler; +} + +Q_EXPORT_STATIC_PLUGIN(ICOPlugin) +Q_EXPORT_PLUGIN2(ico, ICOPlugin) diff --git a/src/ico.h b/src/ico.h new file mode 100644 index 000000000..a9cf548b8 --- /dev/null +++ b/src/ico.h @@ -0,0 +1,52 @@ +/* + * ico.h - kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +// You can use QImageIO::setParameters() to request a specific +// Icon out of an .ico file: +// +// Options consist of a name=value pair and are separated by a semicolon. +// Available options are: +// size= select the icon that most closely matches (pixels) +// default: 32 +// colors= select the icon that has colors (or comes closest) +// default: 1 << display depth or 0 (RGB) if display depth > 8 +// index= select the indexth icon from the file. If this option +// is present, the size and colors options will be ignored. +// default: none +// If both size and colors are given, size takes precedence. +// +// The old format is still supported: +// the parameters consist of a single string in the form +// "[:]" which correspond to the options above +// +// If an icon was returned (i.e. the file is valid and the index option +// if present was not out of range), the icon's index within the .ico +// file is returned in the text tag "X-Index" of the image. +// If the icon is in fact a cursor, its hotspot coordinates are returned +// in the text tags "X-HotspotX" and "X-HotspotY". + +#ifndef _ICO_H_ +#define _ICO_H_ + +#include + +class ICOHandler : public QImageIOHandler +{ +public: + ICOHandler(); + + bool canRead() const; + bool read(QImage *image); + bool write(const QImage &image); + + QByteArray name() const; + + static bool canRead(QIODevice *device); +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp index a36810fe0..02515c3f7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,6 +48,8 @@ #include "GUI.h" #include "misc.h" +#include "ico.h" + void useStyle(QApplication *app, int style){ switch(style) { diff --git a/src/rss.h b/src/rss.h index 665b34948..276b0f942 100644 --- a/src/rss.h +++ b/src/rss.h @@ -38,11 +38,6 @@ #include "misc.h" #include "downloadThread.h" -#ifdef HAVE_MAGICK - #include - using namespace Magick; -#endif - class RssManager; class RssStream; class RssItem; @@ -588,20 +583,6 @@ class RssManager : public QObject{ if(url.endsWith("favicon.ico")){ // Icon downloaded QImage fileIcon; -#ifdef HAVE_MAGICK - try{ - QFile::copy(path, path+".ico"); - Image image(QDir::cleanPath(path+".ico").toUtf8().data()); - // Convert to PNG since we can't read ICO format - image.magick("PNG"); - // Resize to 16x16px - image.sample(Geometry(16, 16)); - image.write(path.toUtf8().data()); - QFile::remove(path+".ico"); - }catch(Magick::Exception &error_){ - qDebug("favicon conversion to PNG failure: %s", error_.what()); - } -#endif if(fileIcon.load(path)) { QList res = findFeedsWithIcon(url); RssStream* stream; diff --git a/src/src.pro b/src/src.pro index ac478cbd5..b52033934 100644 --- a/src/src.pro +++ b/src/src.pro @@ -2,30 +2,29 @@ LANG_PATH = lang ICONS_PATH = Icons -#Set the following variable to 1 to enable debug +# Set the following variable to 1 to enable debug DEBUG_MODE = 1 # Global TEMPLATE = app TARGET = qbittorrent -CONFIG += qt thread x11 network +CONFIG += qt \ + thread \ + x11 \ + network # Update this VERSION for each release DEFINES += VERSION=\\\"v1.3.0alpha\\\" DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MINOR=3 DEFINES += VERSION_BUGFIX=0 - -!mac { - QMAKE_LFLAGS += -Wl,--as-needed -} - -contains(DEBUG_MODE, 1){ +!mac:QMAKE_LFLAGS += -Wl,--as-needed +contains(DEBUG_MODE, 1) { CONFIG += debug CONFIG -= release message(Debug build!) } -contains(DEBUG_MODE, 0){ +contains(DEBUG_MODE, 0) { CONFIG -= debug CONFIG += release DEFINES += QT_NO_DEBUG_OUTPUT @@ -37,11 +36,11 @@ contains(DEBUG_MODE, 0){ DEFINES += NDEBUG # Install - -!win32 { +!win32 { # Binary - exists(../conf.pri){ + exists(../conf.pri) { include(../conf.pri) + # Target target.path = $$BINDIR INSTALLS += target @@ -49,12 +48,12 @@ DEFINES += NDEBUG # DBUS QT += dbus - + # Man page man.files = ../doc/qbittorrent.1 man.path = $$PREFIX/share/man/man1/ INSTALLS += man - + # Menu Icon menuicon.files = Icons/qBittorrent.desktop menuicon.path = $$PREFIX/share/applications/ @@ -81,112 +80,154 @@ DEFINES += NDEBUG icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps/ icon192.files = menuicons/192x192/apps/qbittorrent.png icon192.path = $$PREFIX/share/icons/hicolor/192x192/apps/ - INSTALLS += icon16 icon22 icon24 icon32 icon36 icon48 icon64 icon72 icon96 icon128 icon192 + INSTALLS += icon16 \ + icon22 \ + icon24 \ + icon32 \ + icon36 \ + icon48 \ + icon64 \ + icon72 \ + icon96 \ + icon128 \ + icon192 } - -QMAKE_CXXFLAGS_RELEASE += -fwrapv -O2 -QMAKE_CXXFLAGS_DEBUG += -fwrapv -O1 - +QMAKE_CXXFLAGS_RELEASE += -fwrapv \ + -O2 +QMAKE_CXXFLAGS_DEBUG += -fwrapv \ + -O1 CONFIG += link_pkgconfig PKGCONFIG += "libtorrent-rasterbar libcurl" -!contains(DEFINES, HAVE_MAGICK){ - message(ImageMagick disabled) -} - -QT += network xml - +QT += network \ + xml DEFINES += QT_NO_CAST_TO_ASCII -#QT_NO_CAST_FROM_ASCII +# QT_NO_CAST_FROM_ASCII # Windows -win32 { - LIBS += -ltorrent -lccext2 -lccgnu2 - #-lMagick++ -lWand -lMagick -} +win32:LIBS += -ltorrent \ + -lccext2 \ + -lccgnu2 +# -lMagick++ -lWand -lMagick RESOURCES = icons.qrc \ - lang.qrc \ - search.qrc \ - webui.qrc + lang.qrc \ + search.qrc \ + webui.qrc # Translations TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \ - $$LANG_PATH/qbittorrent_zh.ts \ - $$LANG_PATH/qbittorrent_zh_TW.ts \ - $$LANG_PATH/qbittorrent_en.ts \ - $$LANG_PATH/qbittorrent_ca.ts \ - $$LANG_PATH/qbittorrent_es.ts \ - $$LANG_PATH/qbittorrent_pl.ts \ - $$LANG_PATH/qbittorrent_ko.ts \ - $$LANG_PATH/qbittorrent_de.ts \ - $$LANG_PATH/qbittorrent_nl.ts \ - $$LANG_PATH/qbittorrent_tr.ts \ - $$LANG_PATH/qbittorrent_sv.ts \ - $$LANG_PATH/qbittorrent_el.ts \ - $$LANG_PATH/qbittorrent_ru.ts \ - $$LANG_PATH/qbittorrent_uk.ts \ - $$LANG_PATH/qbittorrent_bg.ts \ - $$LANG_PATH/qbittorrent_it.ts \ - $$LANG_PATH/qbittorrent_sk.ts \ - $$LANG_PATH/qbittorrent_ro.ts \ - $$LANG_PATH/qbittorrent_pt.ts \ - $$LANG_PATH/qbittorrent_nb.ts \ - $$LANG_PATH/qbittorrent_fi.ts \ - $$LANG_PATH/qbittorrent_da.ts \ - $$LANG_PATH/qbittorrent_ja.ts \ - $$LANG_PATH/qbittorrent_hu.ts \ - $$LANG_PATH/qbittorrent_pt_BR.ts \ - $$LANG_PATH/qbittorrent_cs.ts + $$LANG_PATH/qbittorrent_zh.ts \ + $$LANG_PATH/qbittorrent_zh_TW.ts \ + $$LANG_PATH/qbittorrent_en.ts \ + $$LANG_PATH/qbittorrent_ca.ts \ + $$LANG_PATH/qbittorrent_es.ts \ + $$LANG_PATH/qbittorrent_pl.ts \ + $$LANG_PATH/qbittorrent_ko.ts \ + $$LANG_PATH/qbittorrent_de.ts \ + $$LANG_PATH/qbittorrent_nl.ts \ + $$LANG_PATH/qbittorrent_tr.ts \ + $$LANG_PATH/qbittorrent_sv.ts \ + $$LANG_PATH/qbittorrent_el.ts \ + $$LANG_PATH/qbittorrent_ru.ts \ + $$LANG_PATH/qbittorrent_uk.ts \ + $$LANG_PATH/qbittorrent_bg.ts \ + $$LANG_PATH/qbittorrent_it.ts \ + $$LANG_PATH/qbittorrent_sk.ts \ + $$LANG_PATH/qbittorrent_ro.ts \ + $$LANG_PATH/qbittorrent_pt.ts \ + $$LANG_PATH/qbittorrent_nb.ts \ + $$LANG_PATH/qbittorrent_fi.ts \ + $$LANG_PATH/qbittorrent_da.ts \ + $$LANG_PATH/qbittorrent_ja.ts \ + $$LANG_PATH/qbittorrent_hu.ts \ + $$LANG_PATH/qbittorrent_pt_BR.ts \ + $$LANG_PATH/qbittorrent_cs.ts # Source code -HEADERS += GUI.h misc.h options_imp.h about_imp.h \ - properties_imp.h createtorrent_imp.h \ - DLListDelegate.h SearchListDelegate.h \ - PropListDelegate.h previewSelect.h \ - PreviewListDelegate.h trackerLogin.h \ - downloadThread.h downloadFromURLImp.h \ - torrentAddition.h \ - bittorrent.h searchEngine.h \ - rss.h rss_imp.h FinishedTorrents.h \ - allocationDlg.h FinishedListDelegate.h \ - qtorrenthandle.h downloadingTorrents.h \ - engineSelectDlg.h pluginSource.h \ - arborescence.h qgnomelook.h realprogressbar.h \ - realprogressbarthread.h qrealarray.h \ - httpserver.h httpconnection.h \ - httprequestparser.h httpresponsegenerator.h \ - json.h eventmanager.h filterParserThread.h \ - TrackersAdditionDlg.h searchTab.h console_imp.h -FORMS += MainWindow.ui options.ui about.ui \ - properties.ui createtorrent.ui preview.ui \ - login.ui downloadFromURL.ui addTorrentDialog.ui \ - search.ui rss.ui seeding.ui bandwidth_limit.ui \ - download.ui engineSelect.ui pluginSource.ui \ - trackersAdd.ui console.ui +HEADERS += GUI.h \ + misc.h \ + options_imp.h \ + about_imp.h \ + properties_imp.h \ + createtorrent_imp.h \ + DLListDelegate.h \ + SearchListDelegate.h \ + PropListDelegate.h \ + previewSelect.h \ + PreviewListDelegate.h \ + trackerLogin.h \ + downloadThread.h \ + downloadFromURLImp.h \ + torrentAddition.h \ + bittorrent.h \ + searchEngine.h \ + rss.h \ + rss_imp.h \ + FinishedTorrents.h \ + allocationDlg.h \ + FinishedListDelegate.h \ + qtorrenthandle.h \ + downloadingTorrents.h \ + engineSelectDlg.h \ + pluginSource.h \ + arborescence.h \ + qgnomelook.h \ + realprogressbar.h \ + realprogressbarthread.h \ + qrealarray.h \ + httpserver.h \ + httpconnection.h \ + httprequestparser.h \ + httpresponsegenerator.h \ + json.h \ + eventmanager.h \ + filterParserThread.h \ + TrackersAdditionDlg.h \ + searchTab.h \ + console_imp.h \ + ico.h +FORMS += MainWindow.ui \ + options.ui \ + about.ui \ + properties.ui \ + createtorrent.ui \ + preview.ui \ + login.ui \ + downloadFromURL.ui \ + addTorrentDialog.ui \ + search.ui \ + rss.ui \ + seeding.ui \ + bandwidth_limit.ui \ + download.ui \ + engineSelect.ui \ + pluginSource.ui \ + trackersAdd.ui \ + console.ui SOURCES += GUI.cpp \ - main.cpp \ - options_imp.cpp \ - properties_imp.cpp \ - createtorrent_imp.cpp \ - bittorrent.cpp \ - searchEngine.cpp \ - rss_imp.cpp \ - FinishedTorrents.cpp \ - qtorrenthandle.cpp \ - downloadingTorrents.cpp \ - engineSelectDlg.cpp \ - downloadThread.cpp \ - realprogressbar.cpp \ - realprogressbarthread.cpp \ - qrealarray.cpp \ - httpserver.cpp \ - httpconnection.cpp \ - httprequestparser.cpp \ - httpresponsegenerator.cpp \ - json.cpp \ - eventmanager.cpp \ - SearchTab.cpp + main.cpp \ + options_imp.cpp \ + properties_imp.cpp \ + createtorrent_imp.cpp \ + bittorrent.cpp \ + searchEngine.cpp \ + rss_imp.cpp \ + FinishedTorrents.cpp \ + qtorrenthandle.cpp \ + downloadingTorrents.cpp \ + engineSelectDlg.cpp \ + downloadThread.cpp \ + realprogressbar.cpp \ + realprogressbarthread.cpp \ + qrealarray.cpp \ + httpserver.cpp \ + httpconnection.cpp \ + httprequestparser.cpp \ + httpresponsegenerator.cpp \ + json.cpp \ + eventmanager.cpp \ + SearchTab.cpp \ + ico.cpp DESTDIR = . -