src/hbcore/image/hbiconloader.cpp
changeset 5 627c4a0fd0e7
parent 2 06ff229162e9
child 6 c3690ec91ef8
--- a/src/hbcore/image/hbiconloader.cpp	Thu May 27 13:10:59 2010 +0300
+++ b/src/hbcore/image/hbiconloader.cpp	Fri Jun 11 13:58:22 2010 +0300
@@ -23,25 +23,9 @@
 **
 ****************************************************************************/
 
-#include <hbiconloader_p.h>
-#include "hbthemecommon_p.h"
-
-#include <QDir>
-#include <QCoreApplication>
-#include <QDebug>
-#include <QPicture>
-#include <QPainter>
-#include <QStyleOption>
-#include <QApplication> //krazy:exclude=qclasses
-#include <QtAlgorithms>
-#include <QTime>
-#include <QSvgRenderer>
-#include <QImageReader>
-#include <QHash>
-
+#include "hbiconloader_p.h"
 #include "hbframedrawer_p.h"
 #include "hbicontheme_p.h"
-#include "hbstandarddirs_p.h"
 #include "hblayoutdirectionnotifier_p.h"
 #include "hbinstance.h"
 #include "hbiconanimation_p.h"
@@ -60,6 +44,19 @@
 #include "hbthemeindex_p.h"
 #include "hbthemecommon_p.h"
 #include "hbiconimplcreator_p.h"
+#include "hbstandarddirs_p.h"
+#include <QDir>
+#include <QCoreApplication>
+#include <QDebug>
+#include <QPicture>
+#include <QPainter>
+#include <QStyleOption>
+#include <QApplication> //krazy:exclude=qclasses
+#include <QtAlgorithms>
+#include <QTime>
+#include <QSvgRenderer>
+#include <QImageReader>
+#include <QHash>
 
 #ifdef HB_NVG_CS_ICON
 #include "hbeglstate_p.h"
@@ -133,10 +130,10 @@
                                    QIcon::Mode mode, 
                                    bool mirrored, 
                                    const QColor &color,
-                                   HbRenderingMode renderMode);
+                                   HbRenderingMode renderMode );
 #endif
 
-public: // data
+public: 
     QString storedTheme;
 
     int sourceResolution;
@@ -151,7 +148,7 @@
 
     HbIconSource *lastIconSource;
 
-private: // data
+private: 
     enum {
         Unknown = 0,
         NotMirrored = 1,
@@ -190,18 +187,18 @@
 QString HbIconLoaderPrivate::removeIconNameSuffix(const QString &iconName)
 {
     QString loweredIconName = iconName.toLower();
-    if (loweredIconName.endsWith(".svg")
-        || loweredIconName.endsWith(".png")
-        || loweredIconName.endsWith(".mng")
-        || loweredIconName.endsWith(".gif")
-        || loweredIconName.endsWith(".xpm")
-        || loweredIconName.endsWith(".jpg")
-        || loweredIconName.endsWith(".nvg")) {
+    if (loweredIconName.endsWith(QLatin1String(".svg"))
+        || loweredIconName.endsWith(QLatin1String(".png"))
+        || loweredIconName.endsWith(QLatin1String(".mng"))
+        || loweredIconName.endsWith(QLatin1String(".gif"))
+        || loweredIconName.endsWith(QLatin1String(".xpm"))
+        || loweredIconName.endsWith(QLatin1String(".jpg"))
+        || loweredIconName.endsWith(QLatin1String(".nvg"))) {
         return iconName.left(iconName.length() - 4);
     }
 
-    if (loweredIconName.endsWith(".svgz")
-        || loweredIconName.endsWith(".qpic")) {
+    if (loweredIconName.endsWith(QLatin1String(".svgz"))
+        || loweredIconName.endsWith(QLatin1String(".qpic"))) {
         return iconName.left(iconName.length() - 5);
     }
 
@@ -233,9 +230,7 @@
     mirroredIconFound = false;
     QString iconPath;
 
-    if (QDir::isRelativePath(resourceName)) {
-
-#ifdef Q_OS_SYMBIAN
+    if (HbThemeUtils::isLogicalName(resourceName)) {
         // Try to get themed icon information from theme index
         HbThemeIndexResource resource(resourceName);
         if (resource.isValid()) {
@@ -244,30 +239,12 @@
             } else {
                 return resource.fullFileName();
             }
-        }
-#endif // Q_OS_SYMBIAN
-
-        // If there was no theme index, search the icon in theme icon dirs (slow)
-        foreach (const QString &dir, HbThemePrivate::instance()->iconDirectories()) {
-            if (mirrored) {
-                // If icon is mirrored, try to find the icon in a separate "mirrored" folder used for mirrored icons
-                iconPath =  HbStandardDirs::findResource( dir + "mirrored" + '/' + resourceName, Hb::IconResource );
-                if( !iconPath.isEmpty() ) {
-                    mirroredIconFound = true;
-                    break;
-                }
-            }
-
-        iconPath =  HbStandardDirs::findResource( dir + resourceName, Hb::IconResource );
-
-            // If the file was found in this dir, return the filename.
-        if ( !iconPath.isEmpty() ) {
-                break;
-            }
+        } else {
+            // Logical name not found in theme index - return empty string
+            return QString();
         }
     } else {
-        // Absolute path. Do not scan through different theme directories.
-        QString iconNameCopy(resourceName);
+        // Not a logical name. Check from file system.
         if (mirrored) {
             // If icon is mirrored, try to find the icon in a separate "mirrored" folder used for mirrored icons
 
@@ -294,6 +271,8 @@
     }
 
     return iconPath;
+}
+
 /*
 From Freedesktop.org:
 
@@ -427,19 +406,15 @@
 
     }
 */
-}
 
 bool HbIconLoaderPrivate::isAutomaticallyMirrored(const QString &iconName)
 {
-    Q_UNUSED(iconName);
     // only place to get mirroring information is from themeindex
-#ifdef Q_OS_SYMBIAN
-        // Try to get themed icon information from theme index
-        HbThemeIndexResource resource(iconName);
-        if (resource.isValid()) {
-            return resource.isAutomaticallyMirrored();
-        }
-#endif
+    // Try to get themed icon information from theme index
+    HbThemeIndexResource resource(iconName);
+    if (resource.isValid()) {
+        return resource.isAutomaticallyMirrored();
+    }
 
     return false;
 }
@@ -466,9 +441,13 @@
 }
 
 #ifdef HB_ICONIMPL_CACHE
-QByteArray HbIconLoaderPrivate::createCacheKeyFrom(const QString &iconName, const QSizeF &size,
-    Qt::AspectRatioMode aspectRatioMode, QIcon::Mode mode, bool mirrored, const QColor &color,
-    HbRenderingMode renderMode)
+QByteArray HbIconLoaderPrivate::createCacheKeyFrom( const QString &iconName,
+                                                    const QSizeF &size,
+                                                    Qt::AspectRatioMode aspectRatioMode, 
+                                                    QIcon::Mode mode, 
+                                                    bool mirrored, 
+                                                    const QColor &color,
+                                                    HbRenderingMode renderMode )
 {
     static const int paramArraySize = 8;
 
@@ -576,11 +555,10 @@
         }
     }
 
-    // Step 2: There was no animation definition, try to get default size from theme index if it is a themed icon
+    // Step 2: There was no animation definition,
+    // try to get default size from theme index if it is a themed icon (logical name).
     
-    // TODO: change this to simpler function call in Symbian OS env
-    if (QDir::isRelativePath(iconName)) {
-#ifdef Q_OS_SYMBIAN
+    if (HbThemeUtils::isLogicalName(iconName)) {
         // Try to get themed icon information from theme index
         HbThemeIndexResource resource(iconName);
         if (resource.isValid()) {
@@ -590,15 +568,9 @@
             } else {
                 size = resource.defaultItemSize();
             }
-            // Returns invalid size if there is a valid theme index, but the item was not found there.
-            return size;
-        } else {
-            // Step 3: Theme index was not used, try to get icon's default size from theme server's default size cache.
-            params.iconFileName = resolveIconFileName(params);
         }
-#else
-        params.iconFileName = resolveIconFileName(params);
-#endif
+        // Returns invalid size if the index did not provide the size
+        return size;
     } else { // Absolute path, use it directly without resolving anything.
         params.iconFileName = iconName;
     }
@@ -610,27 +582,7 @@
 
     QString format = formatFromPath(params.iconFileName);
 
-// Theme server on desktop was found very slow (probably due to IPC with QLocalServer/QLocalSocket).
-// disabling icon sharing via theme server until theme server performance on desktop is improved
-#ifdef Q_OS_SYMBIAN
-    GET_MEMORY_MANAGER(HbMemoryManager::SharedMemory)
-    // Try to take data from server if parameters don't prevent it
-    if (manager && format != "MNG" && format != "GIF" &&
-        !iconName.startsWith(':')) { // not using server for app's own resources (iconName is a logical name for theme elements)
-#ifdef HB_ICON_TRACES
-        qDebug() << "HbIconLoader::DefaultSize req to server " << params.iconFileName;
-#endif
-        QSizeF sizeFromServer = HbThemeClient::global()->getSharedIconDefaultSize(params.iconFileName);
-#ifdef HB_ICON_TRACES
-        qDebug() << "HbIconLoader::DefaultSize result from server" << sizeFromServer;
-#endif
-        if (sizeFromServer.isValid()) {
-            return sizeFromServer;
-        }
-    }
-#endif // Q_OS_SYMBIAN
-
-    // Step 4: Get the default size from the icon file in the client side
+    // Step 3: Get the default size from the icon file in the client side
     HbIconSource *source = getIconSource(params.iconFileName, format);
     size = source->defaultSize();
 
@@ -770,16 +722,16 @@
 void HbIconLoader::freeGpuIconData()
 {
 #if defined(HB_SGIMAGE_ICON) || defined(HB_NVG_CS_ICON)
-	for( int i = 0; i < iconEngineList.count(); i++ ) {	    
+    for( int i = 0; i < iconEngineList.count(); i++ ) {     
         HbIconEngine *engine = iconEngineList.at(i);
-	    engine->resetIconImpl();
-	}	
-	for(int i = 0; i< frameDrawerInstanceList.count(); i++) {
-	    HbFrameDrawerPrivate * fd = frameDrawerInstanceList.at(i);
-	    if ( (fd->iconFormatType() == SGIMAGE) || (fd->iconFormatType() == NVG) ) {
-	        fd->resetMaskableIcon();            
-	    }    
-	}    
+        engine->resetIconImpl();
+    }   
+    for(int i = 0; i< frameDrawerInstanceList.count(); i++) {
+        HbFrameDrawerPrivate * fd = frameDrawerInstanceList.at(i);
+        if ( (fd->iconFormatType() == SGIMAGE) || (fd->iconFormatType() == NVG) ) {
+            fd->resetMaskableIcon();            
+        }    
+    }    
 #endif
 }
 
@@ -848,23 +800,7 @@
     QList<HbIconAnimationFrameSet::FrameData> frameList;
 
     // Get the default size from the first animation frame
-    params.cleanIconName = frameDefs.at(0).iconName;
-    params.iconFileName = resolveIconFileName(params);
-    QString format = formatFromPath(params.iconFileName);
-
-    // Try to get the default size from server if the icon is not such that is loaded in client side.
-    if (format != "MNG"
-        && format != "GIF"
-        && !params.iconFileName.startsWith(':'))
-    {
-        QSizeF defSize = HbThemeClient::global()->getSharedIconDefaultSize(params.iconFileName);
-        if (defSize.isValid()) {
-            return defSize;
-        }
-    }
-
-    // Otherwise get if by calling HbIconLoader::defaultSize for the first animation frame
-    return HbIconLoader::defaultSize(params.iconFileName, QString(), params.options);
+    return HbIconLoader::defaultSize(frameDefs.at(0).iconName, QString(), params.options);
 }
 
 void HbIconLoader::loadAnimation(HbIconAnimationDefinition &def, HbIconLoadingParams &params)
@@ -975,7 +911,7 @@
 #endif
     // If not found then it can still be a normal file specified with a relative path.
     if (!iconFound) {
-        iconFound = QFile(params.iconName).exists();
+        iconFound = QFile::exists(params.iconName);
         if (iconFound) {
             iconPath = params.iconName;
         }
@@ -1271,12 +1207,12 @@
 #endif
 
 #if defined(HB_SGIMAGE_ICON) || defined(HB_NVG_CS_ICON)
-    if (newRenderMode != renderMode) {     
+    if (newRenderMode != renderMode) {
         if (newRenderMode == ESWRendering) {
-            // switching from HW to SW mode  
-            freeGpuIconData();            
+            // switching from HW to SW mode
+            freeGpuIconData();
         }        
-        if (HbThemeClient::global()->switchRenderingMode(newRenderMode)) {         
+        if (HbThemeClient::global()->switchRenderingMode(newRenderMode)) {
             renderMode = newRenderMode;
         }
     }
@@ -1383,8 +1319,13 @@
     if (!params.animationCreated) {
     
 #ifdef HB_ICONIMPL_CACHE
-        QByteArray cacheKey = d->createCacheKeyFrom( params.iconName, params.size, params.aspectRatioMode,
-                        params.mode, params.mirrored, params.color, params.renderMode );
+        QByteArray cacheKey = d->createCacheKeyFrom( params.iconName, 
+                                                     params.size,
+                                                     params.aspectRatioMode,
+                                                     params.mode, 
+                                                     params.mirrored, 
+                                                     params.color, 
+                                                     params.renderMode );
         //look up in the local iconImplCache. 
         //If found return the ptr directly
         if (iconImplCache.contains(cacheKey)) {
@@ -1397,7 +1338,7 @@
             return ptr;
         }
 #endif
-        if (QDir::isRelativePath(iconName)) {
+        if (HbThemeUtils::isLogicalName(iconName)) {
             params.iconFileName = resolveIconFileName(params);
         } else {
             params.iconFileName = iconName;
@@ -1528,8 +1469,13 @@
     // and when NVG is not available.
 #if defined(HB_ICONIMPL_CACHE)
 
-    QByteArray cacheKey = d->createCacheKeyFrom(multiPartIconData.multiPartIconId, size,
-                          aspectRatioMode, mode, mirrored, color, renderMode);
+    QByteArray cacheKey = d->createCacheKeyFrom(multiPartIconData.multiPartIconId,
+                                                size,
+                                                aspectRatioMode,
+                                                mode,
+                                                mirrored, 
+                                                color, 
+                                                renderMode);
     //If consolidated icon found in the client's cache, increment ref-count and return
     if (iconImplCache.contains(cacheKey)) {
         HbIconImpl * ptr = iconImplCache.value(cacheKey);
@@ -1700,7 +1646,7 @@
  * individual pieces.
  * 
  */
-void HbIconLoader::getMultiIconImplFromServer(QStringList &multiPartIconList,                                                             
+void HbIconLoader::getMultiIconImplFromServer(QStringList &multiPartIconList,
                                 QVector<QSizeF> &sizeList,
                                 Qt::AspectRatioMode aspectRatioMode,
                                 QIcon::Mode mode,
@@ -1718,8 +1664,13 @@
 #ifdef HB_ICONIMPL_CACHE
     // search the client cache first before asking the server
     for(int i = 0; i < multiPartIconList.count(); i++) {
-        QByteArray cacheKey = d->createCacheKeyFrom( multiPartIconList[i], sizeList[i], aspectRatioMode,
-                        mode, mirrored, color, currRenderMode );
+        QByteArray cacheKey = d->createCacheKeyFrom( multiPartIconList[i], 
+                                                     sizeList[i], 
+                                                     aspectRatioMode,
+                                                     mode, 
+                                                     mirrored, 
+                                                     color, 
+                                                     currRenderMode );
         //look up in the local iconImplCache. 
         //If found return the ptr directly
         HbIconImpl * ptr = 0;
@@ -1771,8 +1722,13 @@
                 impl = HbIconImplCreator::createIconImpl(iconInfoList.icon[i], params);
 
 #ifdef HB_ICONIMPL_CACHE
-                QByteArray cacheKey = d->createCacheKeyFrom(multiPartIconList[i], sizeList.at(i) , aspectRatioMode,
-                                      mode, mirrored, color, currRenderMode);
+                QByteArray cacheKey = d->createCacheKeyFrom( multiPartIconList[i], 
+                                                             sizeList.at(i) , 
+                                                             aspectRatioMode,
+                                                             mode, 
+                                                             mirrored, 
+                                                             color, 
+                                                             currRenderMode );
                 iconImplCache.insert(cacheKey, impl);
 #ifdef HB_ICON_CACHE_DEBUG
                 qDebug() << "HbIconLoader::getMultiIconImplFromServer(): " << params.iconName << " inserted into impl-cache, ref-count now = " << impl->refCount();