photosgallery/viewframework/texturemanager/src/glxtexturemanagerimpl.cpp
branchRCL_3
changeset 23 b023a8d2866a
parent 21 f9e827349359
child 24 ea65f74e6de4
--- a/photosgallery/viewframework/texturemanager/src/glxtexturemanagerimpl.cpp	Mon Jun 21 15:40:32 2010 +0300
+++ b/photosgallery/viewframework/texturemanager/src/glxtexturemanagerimpl.cpp	Thu Jul 15 18:39:01 2010 +0300
@@ -83,6 +83,19 @@
     iThumbnailList.Close();
     
     iAnimatedTnmList.Close();
+
+    // delete DRM GIF textures
+    count = iDRMGifAnimatedTnmList.Count();
+    GLX_LOG_INFO1("CGlxTextureManagerImpl iDRMGifAnimatedTnmList.Count=%d",count);
+    for(TInt i = count - 1; i >= 0; i--)
+        {
+        GLX_LOG_INFO1("CGlxTextureManagerImpl DRM Gif Texture deleted i=%d",i);
+        for(TInt texCnt = KGlxMaxFrameCount - 1; texCnt >= 0; texCnt--)
+            {
+            delete iDRMGifAnimatedTnmList[i].iTexture[texCnt];
+            }
+        }
+    iDRMGifAnimatedTnmList.Close();
     
     // delete zoom textures
     count = iZoomedList.Count();
@@ -563,6 +576,23 @@
             iAlfTextureManager.UnloadTexture(aTexture );        
             }
         }
+    
+    i = iDRMGifAnimatedTnmList.Count();
+    
+    while(i > 0)
+        {
+        --i;
+        if (iDRMGifAnimatedTnmList[i].iMediaId == aMediaId)
+            {
+            GLX_LOG_INFO("RemoveTexture 2 iDRMGifAnimatedTnmList MediaId found");
+            for(TInt textureCnt=0;textureCnt<KGlxMaxFrameCount;textureCnt++)
+                {
+                TInt textureId = iDRMGifAnimatedTnmList[i].iTextureId[textureCnt];
+                iAlfTextureManager.UnloadTexture(textureId);
+                }            
+            iDRMGifAnimatedTnmList.Remove(i);
+            }
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -615,6 +645,19 @@
         iAlfTextureManager.UnloadTexture(textureID);
         iAnimatedTnmList[i].iTexture = NULL;
         }
+    
+    i = iDRMGifAnimatedTnmList.Count();    
+    while(i > 0)
+        {
+        --i;
+        GLX_LOG_INFO("RemoveTexture 2 iDRMGifAnimatedTnmList MediaId found");
+        for (TInt textureCnt = 0; textureCnt < KGlxMaxFrameCount; textureCnt++)
+            {
+            TInt aTexture = iDRMGifAnimatedTnmList[i].iTextureId[textureCnt];
+            iAlfTextureManager.UnloadTexture(aTexture);
+            iDRMGifAnimatedTnmList[i].iTexture[textureCnt] = NULL;
+            }
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -946,6 +989,29 @@
             return;
             }
         }
+    
+    // add loop to search the iDRMGifAnimatedTnmList for the aTextureId
+    i = iDRMGifAnimatedTnmList.Count();
+    while (i > 0)
+        {
+        --i;
+        for(TInt textureCnt=0;textureCnt<KGlxMaxFrameCount;textureCnt++)
+            {
+            if (iDRMGifAnimatedTnmList[i].iBitmap[textureCnt] && 
+                    (iDRMGifAnimatedTnmList[i].iTextureId[textureCnt] == aTextureId))
+                {
+                // We have found the texture, create a duplicate as alf destroys
+                // the bitmap once the texture's been created.
+                aBitmap = CreateDuplicateBitmapL(*iDRMGifAnimatedTnmList[i].iBitmap[textureCnt]);
+                if(iDRMGifAnimatedTnmList[i].iBitmapMask[textureCnt])
+                    {
+                    aMaskBitmap = CreateDuplicateBitmapL(*iDRMGifAnimatedTnmList[i].iBitmapMask[textureCnt]);
+                    }
+                return;
+                }
+            }
+        }
+    
     // find in iIconList
     i = iIconList.Count();
     TBool found = EFalse;
@@ -1366,3 +1432,92 @@
         }
     }
 
+// -----------------------------------------------------------------------------
+// CreateDRMAnimatedGifTextureL
+// -----------------------------------------------------------------------------
+//  
+CAlfTexture& CGlxTextureManagerImpl::CreateDRMAnimatedGifTextureL(const TGlxMedia& aMedia,
+        TGlxIdSpaceId aIdSpaceId,TInt aFrameNumber, CFbsBitmap* aBitmap, CFbsBitmap* aBitmapMask)
+    { 
+    TRACER("CGlxTextureManagerImpl::CreateDRMAnimatedGifTextureL");
+    TInt thumbnailIndex = KErrNotFound;    
+    
+    // If the current thumbnail matches what is required then return the current texture otherwise
+    // create a new one.
+    if (!GetDRMAnimatedGifThumbnailIndex( aMedia, aIdSpaceId,thumbnailIndex))
+        {
+        GLX_LOG_INFO("CreateDRMAnimatedGifTextureL Texture already present");
+        // only texture is missing. 
+        if ((NULL == iDRMGifAnimatedTnmList[thumbnailIndex].iTexture[aFrameNumber])) 
+            {
+            if(NULL == iDRMGifAnimatedTnmList[thumbnailIndex].iBitmap[aFrameNumber])
+                {
+                iDRMGifAnimatedTnmList[thumbnailIndex].iTextureId[aFrameNumber] = NextTextureId();
+                iDRMGifAnimatedTnmList[thumbnailIndex].iBitmap[aFrameNumber] = aBitmap;
+                iDRMGifAnimatedTnmList[thumbnailIndex].iBitmapMask[aFrameNumber] = aBitmapMask;
+                }
+            CAlfTexture* newTexture = &iAlfTextureManager.CreateTextureL(
+                    iDRMGifAnimatedTnmList[thumbnailIndex].iTextureId[aFrameNumber],
+                    this,
+                    EAlfTextureFlagDefault);
+            iDRMGifAnimatedTnmList[thumbnailIndex].iTexture[aFrameNumber] = newTexture;
+            }
+        return *iDRMGifAnimatedTnmList[thumbnailIndex].iTexture[aFrameNumber];
+        }
+    
+    TGlxDRMGifThumbnailIcon thumbData;    
+    thumbData.iTextureId[aFrameNumber] = NextTextureId();   
+    thumbData.iMediaId = aMedia.Id();
+    thumbData.iIdSpaceId = aIdSpaceId;    
+    for(TInt i=0;i<KGlxMaxFrameCount;i++)
+        {
+        thumbData.iTexture[i] = NULL;
+        thumbData.iBitmap[i] = NULL;
+        thumbData.iBitmapMask[i] = NULL;
+        }
+    thumbData.iBitmap[aFrameNumber] = aBitmap;
+    thumbData.iBitmapMask[aFrameNumber] = aBitmapMask;
+    
+    iDRMGifAnimatedTnmList.ReserveL( iDRMGifAnimatedTnmList.Count() + 1 );
+
+    iDRMGifAnimatedTnmList.AppendL(thumbData);
+    
+    CAlfTexture* newTexture = &iAlfTextureManager.CreateTextureL(
+                                                           thumbData.iTextureId[aFrameNumber], 
+                                                           this, 
+                                                           EAlfTextureFlagDefault);   
+    
+    TInt index = iDRMGifAnimatedTnmList.Count()-1;
+    iDRMGifAnimatedTnmList[index].iTexture[aFrameNumber] = newTexture;
+    
+    return *newTexture;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// GetAnimatedGifThumbnailIndex
+// -----------------------------------------------------------------------------
+//
+TBool CGlxTextureManagerImpl::GetDRMAnimatedGifThumbnailIndex(const TGlxMedia& aMedia, const TGlxIdSpaceId& aIdSpaceId,
+        TInt& aThumbnailIndex)
+    {
+    TRACER("CGlxTextureManagerImpl::GetDRMAnimatedGifThumbnailIndex");
+    aThumbnailIndex = KErrNotFound;
+
+    TInt i = iDRMGifAnimatedTnmList.Count();
+
+    while (i > 0 && aThumbnailIndex == KErrNotFound)
+        {
+        --i;
+        if ((iDRMGifAnimatedTnmList[i].iMediaId == aMedia.Id())
+                && (iDRMGifAnimatedTnmList[i].iIdSpaceId == aIdSpaceId))
+            {
+            aThumbnailIndex = i;
+            GLX_LOG_INFO( "GetDRMAnimatedGifThumbnailIndex textureid present" );
+            // We have found that the best match already exists
+            // No need to do anything
+            return EFalse;
+            }
+        }
+    return ETrue;
+    }