-rw-r--r-- | noncore/multimedia/opieplayer2/skin.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/noncore/multimedia/opieplayer2/skin.cpp b/noncore/multimedia/opieplayer2/skin.cpp index 5013bb4..0f49862 100644 --- a/noncore/multimedia/opieplayer2/skin.cpp +++ b/noncore/multimedia/opieplayer2/skin.cpp @@ -44,28 +44,31 @@ struct SkinData class SkinCache : public Singleton<SkinCache> { public: SkinCache(); SkinData *lookupAndTake( const QString &skinPath, const QString &fileNameInfix ); void store( const QString &skinPath, const QString &fileNameInfix, SkinData *data ); private: typedef QCache<SkinData> DataCache; - typedef QCache<QPixmap> BackgroundPixmapCache; + typedef QCache<QImage> BackgroundImageCache; + + template <class CacheType> + void store( const QCache<CacheType> &cache, const QString &key, CacheType *data ); DataCache m_cache; - BackgroundPixmapCache m_backgroundPixmapCache; + BackgroundImageCache m_backgroundImageCache; }; Skin::Skin( const QString &name, const QString &fileNameInfix ) : m_fileNameInfix( fileNameInfix ) { init( name ); } Skin::Skin( const QString &fileNameInfix ) : m_fileNameInfix( fileNameInfix ) { init( defaultSkinName() ); @@ -157,34 +160,62 @@ QString Skin::defaultSkinName() Config cfg( "OpiePlayer" ); cfg.setGroup( "Options" ); return cfg.readEntry( "Skin", "default" ); } QImage Skin::loadImage( const QString &fileName ) { return QImage( Resource::findPixmap( fileName ) ); } SkinCache::SkinCache() { + // let's say we cache two skins (audio+video) at maximum + m_cache.setMaxCost( 2 ); + // ... and one background pixmap + m_backgroundImageCache.setMaxCost( 1 ); } SkinData *SkinCache::lookupAndTake( const QString &skinPath, const QString &fileNameInfix ) { - return new SkinData; + QString key = skinPath + fileNameInfix; + + SkinData *data = m_cache.take( key ); + if ( !data ) + data = new SkinData; + + QImage *bgImage = m_backgroundImageCache.find( skinPath ); + if ( bgImage ) + data->backgroundImage = *bgImage; + else + data->backgroundImage = QImage(); + + return data; } void SkinCache::store( const QString &skinPath, const QString &fileNameInfix, SkinData *data ) { - delete data; + QImage *backgroundImage = new QImage( data->backgroundImage ); + + data->backgroundImage = QImage(); + + QString key = skinPath + fileNameInfix; + + if ( m_cache.find( key, false /*ref*/ ) != 0 || + !m_cache.insert( key, data ) ) + delete data; + + if ( m_backgroundImageCache.find( skinPath, false /*ref*/ ) != 0 || + !m_backgroundImageCache.insert( skinPath, backgroundImage ) ) + delete backgroundImage; } SkinLoader::SkinLoader() { } void SkinLoader::schedule( const QString &skinName, const QString &fileNameInfix, const MediaWidget::SkinButtonInfo *skinButtonInfo, const uint buttonCount ) { assert( isRunning() == false ); pendingSkins << Info( skinName, fileNameInfix, skinButtonInfo, buttonCount ); |