src/hbservers/hbthemeserver/hbiconcacheitemcreator_p.cpp
changeset 34 ed14f46c0e55
parent 3 11d3954df52a
--- a/src/hbservers/hbthemeserver/hbiconcacheitemcreator_p.cpp	Mon Oct 04 17:49:30 2010 +0300
+++ b/src/hbservers/hbthemeserver/hbiconcacheitemcreator_p.cpp	Mon Oct 18 18:23:13 2010 +0300
@@ -28,12 +28,12 @@
 #include "hbpiciconprocessor_p.h"
 #include "hbthemeserverutils_p.h"
 #include "hbmemorymanager_p.h"
+#include "hbiconsource_p.h"
 #include "hbmemoryutils_p.h"
 #ifdef Q_OS_SYMBIAN
 #include "hbthemeserver_symbian_p_p.h"
 #endif
 #include <QFile>
-#include <QDebug>
 
 #ifdef HB_NVG_CS_ICON
 #include "hbnvgiconprocessor_p.h"
@@ -84,35 +84,23 @@
     \a key denotes the unique identifier for the cache item
     \a options indicate different ways of loading icons
     \a format indicates the icon format e.g. svg/nvg etc.\
-    \a currentRenderingMode ThemeServer's current rendering mode state.
+    \a renderingMode rendering mode to be used for creating CacheItem.
  */
 HbIconCacheItem *HbIconCacheItemCreator::createCacheItem(const HbIconKey &key,
         HbIconLoader::IconLoaderOptions options,
         const QString &format,
-        HbRenderingMode currentRenderingMode,
+        HbRenderingMode renderMode,
         bool isMultiPiece)
 {
 #ifndef Q_OS_SYMBIAN
     Q_UNUSED(isMultiPiece)
-    Q_UNUSED(currentRenderingMode)
+    Q_UNUSED(renderMode)
 #endif
     QScopedPointer <HbIconCacheItem> tempIconCacheItem(new HbIconCacheItem);
     HbIconCacheItem *item = tempIconCacheItem.data();
     QScopedPointer <HbIconProcessor> rasterIcon;
     QScopedPointer <HbIconProcessor> vectorIcon;
     
-    // Set the render mode to EHWRendering, only if the client is requesting a HW rendered icon
-    // and ThemeServer is in HW rendering mode
-    HbRenderingMode renderMode = ESWRendering;
-#ifndef Q_OS_SYMBIAN
-    Q_UNUSED(renderMode)
-#endif   
-
-#if defined(HB_SGIMAGE_ICON) || defined(HB_NVG_CS_ICON)    
-    if((key.renderMode == EHWRendering) && (currentRenderingMode == EHWRendering)) {
-        renderMode = EHWRendering;
-    }
-#endif    
     bool isIconCreated = false;
 
     if ((format == KSvg) || (format == KPic)) {
@@ -131,7 +119,12 @@
                 if (HbThemeServerPrivate::gpuMemoryState()) {
                     rasterIcon.reset(new HbSgimageIconProcessor(key, options, format));
                 }
-                vectorIcon.reset(new HbNvgIconProcessor(key, options, format));
+
+                if(!rasterIcon.data()) {
+                    rasterIcon.reset(new HbPixmapIconProcessor(key, options, format));
+                } else {
+                    vectorIcon.reset(new HbNvgIconProcessor(key, options, format));
+                }
             }
 #endif
             
@@ -157,24 +150,27 @@
 #endif
     } else if (format == KBlob) {
         item->blobIconData.type = BLOB;
-        QFile f(key.filename);
         bool fail = true;
-        if (f.open(QIODevice::ReadOnly)) {
-            QByteArray content = f.readAll();
-            f.close();
-            GET_MEMORY_MANAGER(HbMemoryManager::SharedMemory);
-            item->blobIconData.blobData.offset = manager->alloc(content.length());
-            if (item->blobIconData.blobData.offset != -1) {
-                fail = false;
-                // Store vector cost because blobs go into the "cpu" cache.
-                item->blobIconData.blobData.dataSize
-                = item->vectorIconDataCost
-                  = content.length();
-                memcpy(HbMemoryUtils::getAddress<char>(
-                           HbMemoryManager::SharedMemory,
-                           item->blobIconData.blobData.offset),
-                       content.data(),
-                       content.length());
+        HbIconSource *source = HbThemeServerUtils::getIconSource(key.filename);
+        if (source) {
+            QByteArray *content = source->byteArray();
+            if (content) {
+                GET_MEMORY_MANAGER(HbMemoryManager::SharedMemory);
+                item->blobIconData.blobData.offset = manager->alloc(content->length());
+                if (item->blobIconData.blobData.offset != -1) {
+                    fail = false;
+                    // Store vector cost because blobs go into the "cpu" cache.
+                    item->blobIconData.blobData.dataSize
+                    = item->vectorIconDataCost
+                    = content->length();
+                    item->blobIconData.renderingMode = ESWRendering;
+                    memcpy(HbMemoryUtils::getAddress<char>(
+                              HbMemoryManager::SharedMemory,
+                              item->blobIconData.blobData.offset),
+                              content->data(),
+                              content->length());
+                }   
+                
             }
         }
         if (fail) {
@@ -189,6 +185,17 @@
         if (isIconCreated) {
             item->rasterIconData = rasterIcon.data()->sharedIconData();
             item->rasterIconDataCost = rasterIcon.data()->sharedIconDataCost();
+        } else if(format == KNvg && renderMode == EHWRendering){
+#ifdef HB_SGIMAGE_ICON
+            rasterIcon.reset(new HbPixmapIconProcessor(key, options, format));
+            if (rasterIcon.data()) {
+                isIconCreated = rasterIcon.data()->createIconData(key.filename);
+                if (isIconCreated) {
+                    item->rasterIconData = rasterIcon.data()->sharedIconData();
+                    item->rasterIconDataCost = rasterIcon.data()->sharedIconDataCost();
+                }
+            }
+#endif
         }
     }
 
@@ -257,7 +264,10 @@
                     rasterIcon.reset(new HbSgimageIconProcessor(key, iconCacheItem.iconOptions,
                                                                  format));
                 }
-            }else {
+                if(!rasterIcon.data()) {
+                    rasterIcon.reset(new HbPixmapIconProcessor(key, iconCacheItem.iconOptions, format));
+                } 
+            } else {
                 rasterIcon.reset(new HbPixmapIconProcessor(key, iconCacheItem.iconOptions,
                                                            format));
             }
@@ -271,12 +281,23 @@
             if (isIconCreated) {
                 iconCacheItem.rasterIconData = rasterIcon.data()->sharedIconData();
                 iconCacheItem.rasterIconDataCost = rasterIcon.data()->sharedIconDataCost();
+            } else if(format == KNvg && renderMode == EHWRendering){
+#ifdef HB_SGIMAGE_ICON
+                rasterIcon.reset(new HbPixmapIconProcessor(key, iconCacheItem.iconOptions, format));
+                if (rasterIcon.data()) {
+                    isIconCreated = rasterIcon.data()->createIconData(key.filename);
+                    if (isIconCreated) {
+                    iconCacheItem.rasterIconData = rasterIcon.data()->sharedIconData();
+                    iconCacheItem.rasterIconDataCost = rasterIcon.data()->sharedIconDataCost();
+                    }
+                }
+#endif
             }
         }
     }
 
     // If the item is already created on the GPU side but not on the CPU side
-    if (iconCacheItem.rasterIconData.type != INVALID_FORMAT &&
+    if (iconCacheItem.rasterIconData.type == SGIMAGE &&
             iconCacheItem.vectorIconData.type == INVALID_FORMAT) {
         if ((format == KSvg) || (format == KPic)) {
 #ifdef SVG_INTERMEDIATE_PIC
@@ -305,11 +326,11 @@
     const QVector<HbSharedIconInfo> &multiPieceIconInfo,
     HbMultiIconParams &multiPieceIconParams,
     bool allNvg,
-    HbRenderingMode currentRenderingMode)
+    HbRenderingMode renderMode)
 {
 
 #ifndef Q_OS_SYMBIAN
-    Q_UNUSED(currentRenderingMode)
+    Q_UNUSED(renderMode)
 #endif   
     
     HbIconCacheItem *item = 0;
@@ -317,18 +338,6 @@
     bool isIconCreated = false;
     QScopedPointer<HbIconProcessor> rasterIcon;
     
-    // Set the render mode to EHWRendering, only if the client is requesting a HW rendered icon
-    // and ThemeServer is in HW rendering mode
-    HbRenderingMode renderMode = ESWRendering;
-#ifndef Q_OS_SYMBIAN
-    Q_UNUSED(renderMode)
-#endif
-
-#if defined(HB_SGIMAGE_ICON) || defined(HB_NVG_CS_ICON)
-    if((finalIconKey.renderMode == EHWRendering) && (currentRenderingMode == EHWRendering)) {
-        renderMode = EHWRendering;
-    }
-#endif
     if (allNvg) {
 #ifdef HB_SGIMAGE_ICON
         if(renderMode == EHWRendering){ 
@@ -337,6 +346,13 @@
                                              finalIconKey,
                                              (HbIconLoader::IconLoaderOptions)multiPieceIconParams.options,
                                              KSgimage));
+                
+                if(!rasterIcon.data()) {
+                    rasterIcon.reset(new HbPixmapIconProcessor( 
+                                               finalIconKey, 
+                                               (HbIconLoader::IconLoaderOptions)multiPieceIconParams.options, 
+                                               KNvg));
+                }
             }
             
         } else {
@@ -361,7 +377,28 @@
             item->rasterIconData = rasterIcon->sharedIconData();
             item->rasterIconDataCost = rasterIcon->sharedIconDataCost();
             item->iconOptions = options;
-        }
+        } else {
+#ifdef HB_SGIMAGE_ICON
+            if(renderMode == EHWRendering && allNvg ) { 
+               rasterIcon.reset(new HbPixmapIconProcessor( 
+                                                          finalIconKey, 
+                                                          (HbIconLoader::IconLoaderOptions)multiPieceIconParams.options, 
+                                                          KNvg));
+                
+                if (rasterIcon.data()) {
+                    isIconCreated = rasterIcon->createMultiPieceIconData(multiPieceIconInfo, multiPieceIconParams);
+                    if (isIconCreated) {
+                        tempIconCacheItem.reset(new HbIconCacheItem());
+                        item = tempIconCacheItem.data();
+                        item->rasterIconData = rasterIcon->sharedIconData();
+                        item->rasterIconDataCost = rasterIcon->sharedIconDataCost();
+                        item->iconOptions = options;
+                    }
+                }
+            }
+#endif         
+        } 
+        
     }
     tempIconCacheItem.take();
     return item;