From 7921a326f793147c313d2e92935536974a4fcb72 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Tue, 24 Jun 2014 22:44:47 +0300 Subject: [PATCH] Add loading of artwork in other formats as well as .png --- src/gui/embed.cpp | 86 +++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/src/gui/embed.cpp b/src/gui/embed.cpp index d95be2fef..0de9c20f0 100644 --- a/src/gui/embed.cpp +++ b/src/gui/embed.cpp @@ -24,12 +24,12 @@ #include - +#include +#include +#include #include "embed.h" #include "config_mgr.h" - - #ifndef PLUGIN_NAME namespace embed #else @@ -37,6 +37,10 @@ namespace PLUGIN_NAME #endif { +namespace +{ + static QHash s_pixmapCache; +} #include "embedded_resources.h" @@ -45,49 +49,73 @@ QPixmap getIconPixmap( const char * _name, int _w, int _h ) { if( _w == -1 || _h == -1 ) { - QString name = QString( _name ) + ".png"; + // Return cached pixmap + QPixmap cached = s_pixmapCache.value( _name ); + if( !cached.isNull() ) + { + return cached; + } + + // Or try to load it + QList formats = + QImageReader::supportedImageFormats(); + QList candidates; + QPixmap p; + QString name; + int i; + + for ( i = 0; i < formats.size() && p.isNull(); ++i ) + { + candidates << QString( _name ) + "." + formats.at( i ).data(); + } #ifdef PLUGIN_NAME - QPixmap p( configManager::inst()->artworkDir() + "plugins/" + - STRINGIFY( PLUGIN_NAME ) + "_" + name ); - if( p.isNull() ) - { - p = QPixmap( configManager::inst()->artworkDir() + - name ); + for ( i = 0; i < candidates.size() && p.isNull(); ++i ) { + name = candidates.at( i ); + p = QPixmap( configManager::inst()->artworkDir() + "plugins/" + + STRINGIFY( PLUGIN_NAME ) + "_" + name ); } -#else - // look whether icon is in artwork-dir - QPixmap p( configManager::inst()->artworkDir() + name ); #endif - if( p.isNull() ) - { - // nothing found, so look in default-artwork-dir - p = - QPixmap( configManager::inst()->defaultArtworkDir() + name ); + for ( i = 0; i < candidates.size() && p.isNull(); ++i ) { + name = candidates.at( i ); + p = QPixmap( configManager::inst()->artworkDir() + name ); } - if( p.isNull() ) - { - const embed::descriptor & e = findEmbeddedData( - name.toUtf8().constData() ); + + // nothing found, so look in default-artwork-dir + for ( i = 0; i < candidates.size() && p.isNull(); ++i ) { + name = candidates.at( i ); + p = QPixmap( configManager::inst()->defaultArtworkDir() + + name ); + } + + for ( i = 0; i < candidates.size() && p.isNull(); ++i ) { + name = candidates.at( i ); + const embed::descriptor & e = + findEmbeddedData( name.toUtf8().constData() ); // found? if( QString( e.name ) == name ) { p.loadFromData( e.data, e.size ); } - else - { - p = QPixmap( 1, 1 ); - } } + + // Fallback + if(p.isNull()) + { + p = QPixmap( 1, 1 ); + } + // Save to cache and return + s_pixmapCache.insert( _name, p ); return p; + } + return getIconPixmap( _name ). - scaled( _w, _h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + scaled( _w, _h, Qt::IgnoreAspectRatio, + Qt::SmoothTransformation ); } - - QString getText( const char * _name ) { const embed::descriptor & e = findEmbeddedData( _name );