uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp
branchRCL_3
changeset 4 f5911524345e
parent 0 5e5d6b214f4f
--- a/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp	Tue Feb 02 10:12:18 2010 +0200
+++ b/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp	Fri Feb 19 22:41:11 2010 +0200
@@ -22,6 +22,7 @@
 
 #include <cbsbitmap.h>
 #include <imageconversion.h> 
+#include <bitmaptransforms.h>
 
 // ---------------------------------------------------------------------------
 // CVIMPSTDetailsImageDecoder::NewL
@@ -56,11 +57,7 @@
 void CVIMPSTDetailsImageDecoder::ConstructL(const TDesC8& aBitmapData)
     {
     iBitmapData = aBitmapData.AllocL();
-    User::LeaveIfError( iFs.Connect() );
-    iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData );
-    TFrameInfo info = iImgDecoder->FrameInfo();
-    iBitmap = new ( ELeave ) CFbsBitmap;
-    User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode ));
+    User::LeaveIfError( iFs.Connect() );   
     }
 
 // ---------------------------------------------------------------------------
@@ -85,6 +82,12 @@
         delete iBitmapData;
         iBitmapData = NULL;
         }
+    if (iBitmapScaler)
+        {
+        delete iBitmapScaler;
+        iBitmapScaler = NULL;
+        }
+
     iFs.Close();
     }
 
@@ -93,11 +96,11 @@
 // Starts the decoding process
 // ---------------------------------------------------------------------------
 //
-void CVIMPSTDetailsImageDecoder::Start()
+void CVIMPSTDetailsImageDecoder::StartL(TSize aBitmapSize)
     {
-    iStatus = KRequestPending;
-    iImgDecoder->Convert( &iStatus, *iBitmap );
-    SetActive();
+    iDecoderState = ECcaConvertThumbnailImage;
+    iBitmapSize = aBitmapSize;
+    CreateBitmapL();
     }
 
 // ---------------------------------------------------------------------------
@@ -109,9 +112,25 @@
 void CVIMPSTDetailsImageDecoder::RunL() 
 	{
 	User::LeaveIfError( iStatus.Int() );
-	// Ownership of the bitmap is transferred
-	iHeader.SetBitmap(iBitmap, NULL );
-	iBitmap = NULL;
+	switch ( iDecoderState )
+	    {
+	    case ECcaConvertThumbnailImage:
+	        {
+	        iDecoderState = ECcaScaleThumbnail;
+	        ScaleBitmapL();
+	        break;
+	        }
+	    case ECcaScaleThumbnail:
+	        {
+	        // don't delete
+	        // Ownership of the bitmap is transferred   
+	        iHeader.SetBitmap(iBitmap, NULL );
+	        iBitmap = NULL;
+	        }
+	    default:
+	        break;
+	    }	
+	
    }
 
 // ---------------------------------------------------------------------------
@@ -124,4 +143,38 @@
     iImgDecoder->Cancel(); 
     }
 
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsImageDecoder::ScaleBitmapL
+// scaling it to fit to the screen
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTDetailsImageDecoder::ScaleBitmapL()
+    {   
+    iBitmapScaler = CBitmapScaler::NewL();
+    iBitmapScaler->Scale( &iStatus, *iBitmap, iBitmapSize );
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsImageDecoder::CreateBitmapL
+// creates the bitmap
+// ---------------------------------------------------------------------------
+//
+
+void CVIMPSTDetailsImageDecoder::CreateBitmapL()
+    {
+    if ( iDecoderState == ECcaConvertThumbnailImage )
+        {
+        iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData, CImageDecoder::EOptionAlwaysThread );
+        }   
+   if ( !iBitmap )
+       {
+       TFrameInfo info = iImgDecoder->FrameInfo();
+       iBitmap = new ( ELeave ) CFbsBitmap;
+       User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode ));
+       } 
+    iStatus = KRequestPending;
+    iImgDecoder->Convert( &iStatus, *iBitmap );
+    SetActive();
+    }
 // end of file