phoneuis/BubbleManager/Src/BMMainPaneControl.cpp
branchRCL_3
changeset 22 94dc1107e8b2
parent 0 5f000ab63145
--- a/phoneuis/BubbleManager/Src/BMMainPaneControl.cpp	Mon Jun 21 15:39:45 2010 +0300
+++ b/phoneuis/BubbleManager/Src/BMMainPaneControl.cpp	Thu Jul 15 18:38:16 2010 +0300
@@ -28,6 +28,8 @@
 #include <AknIconUtils.h>
 #include <layoutmetadata.cdl.h>
 
+#define SCALE_FACTOR 1.5
+
 // ---------------------------------------------------------------------------
 // C++ constructor
 // ---------------------------------------------------------------------------
@@ -36,7 +38,9 @@
     CBubbleManager& aBubbleManager,  
     CBubbleCallObjectManager& aCallObjectManager ) : 
     iBubbleManager( aBubbleManager ), 
-    iCallObjectManager ( aCallObjectManager )
+    iCallObjectManager ( aCallObjectManager ),
+    iScaler( NULL ),
+    iScaledImage( NULL )
     {
     }
 
@@ -46,6 +50,7 @@
 //
 void CBubbleMainPaneControl::ConstructL()
     {
+    iScaler = CTelBubbleImageScaler::NewL( *this );
     }
 
 // ---------------------------------------------------------------------------
@@ -72,6 +77,11 @@
 //
 CBubbleMainPaneControl::~CBubbleMainPaneControl()
     {
+    delete iScaler;
+    iScaler = NULL;
+    
+    delete iScaledImage;
+    iScaledImage = NULL;	
     }
 
 // ---------------------------------------------------------------------------
@@ -82,23 +92,49 @@
     const CBubbleHeader& aHeader )
     {
     iBubble = aHeader.BubbleId();
-    iBitmap = aHeader.CallObjectImage();
-    iMask = aHeader.CallObjectImageMask();
+    TBool thumbnail( EFalse );
+    TBool noScaling( EFalse );
+    
+    if ( aHeader.CallObjectImage() )
+        {
+        iBitmap = aHeader.CallObjectImage();
+        iMask = aHeader.CallObjectImageMask();
+        }
+    else if ( aHeader.TnBitmap() )
+        {
+        iBitmap = aHeader.TnBitmap();
+        iMask = aHeader.TnBitmapMask();
+        thumbnail = ETrue;
+        }
+    else
+        {
+        iBitmap = NULL;
+        }
+    
     iThreeLinedBubble = ( aHeader.CNAP().Length() > 0 );
     
+    // PrepareBitmapsL() needs to know if a brand new thumbnail is about to get prepared.
+    if ( thumbnail && (iOldBitmap != NULL) && (iOldBitmap == iBitmap) && (iScaler->GetState() != CTelBubbleImageScaler::EScalingStarted) )
+        {
+        noScaling = ETrue;
+        }
+    
     if ( iBitmap )
         {
-        CFbsBitmap* bitmap;
-        CFbsBitmap* mask;
-        TBool bitmapOwnership;
-        TBool maskOwnership;
+        iOldBitmap = iBitmap;
+        
+        CFbsBitmap* bitmap( NULL );
+        CFbsBitmap* mask( NULL );
+        TBool bitmapOwnership( EFalse );
+        TBool maskOwnership( EFalse );
         
         TRAPD(err, PrepareBitmapsL( bitmap, 
                                     bitmapOwnership, 
                                     mask, 
                                     maskOwnership,
                                     aHeader.CallObjectImageType() == 
-                                    CBubbleHeader::EThemeImage ) );
+                                    CBubbleHeader::EThemeImage,
+                                    noScaling ));
         
         if ( err )
             {
@@ -119,6 +155,12 @@
         
         iIsUsed = ETrue;
         MakeVisible( ETrue );
+        
+        // upscale thumbnails if loading it for the first time.
+        if ( thumbnail && !noScaling && ( iScaler->GetState() != CTelBubbleImageScaler::EScalingStarted ) )
+            {
+            StartScaling( iBitmap );
+            }
         }
     }
 
@@ -131,9 +173,18 @@
     TBool& aBitmapOwnership, 
     CFbsBitmap*& aMask,
     TBool& aMaskOwnership,
-    TBool aIsScalable )
+    TBool aIsScalable,
+    TBool aThumbnail )
     {
-    aBitmap = iBitmap;
+    if ( aThumbnail )
+        {
+        aBitmap = iScaledImage;
+        }
+    else
+        {
+        aBitmap = iBitmap;
+        }
+
     aMask = iMask;
     aBitmapOwnership = EFalse;
     aMaskOwnership = EFalse;
@@ -278,5 +329,117 @@
         }
     }
 
+// ---------------------------------------------------------------------------
+// CTelBubbleCallImage::ImageScalingComplete
+//
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::ImageScalingComplete( TInt aError,
+        CFbsBitmap* aBitmap )
+    {
+    if ( aError == KErrNone )
+        {
+        // Draw the scaled image
+        iScaledImage = aBitmap;
+        iScaler->SetState( CTelBubbleImageScaler::EScalingDone );
+        
+        CFbsBitmap* bitmap( NULL );
+        CFbsBitmap* mask( NULL );
+        TBool bitmapOwnership( EFalse );
+        TBool maskOwnership( EFalse );
+      
+        TRAPD(err, PrepareBitmapsL( bitmap, 
+                                    bitmapOwnership, 
+                                    mask, 
+                                    maskOwnership,
+                                    EFalse,
+                                    ETrue ) );
+        
+        if ( err )
+            {
+            return;
+            }
+                
+        if ( iCallImage->ControlType() == 
+             CTelBubbleCustomElement::EBubbleCallImage )
+            {
+            CTelBubbleCallImage* image = 
+                static_cast<CTelBubbleCallImage*> ( iCallImage->Control() );
+            image->SetImage( bitmap, EFalse, mask, maskOwnership );
+            } 
+
+        SizeChanged();
+        
+        iIsUsed = ETrue;
+        MakeVisible( ETrue );
+        
+        Parent()->DrawNow(); // refreshing view with scaled image
+        }
+    else if ( aError == KErrCancel )
+        {
+        // error is ignored
+        // This error is returned when a previous scaling is cancelled
+        // while new scaling request is given to active object
+        }
+    else
+        {
+        // draw the unscaled image in error cases
+    
+        delete iScaledImage;
+        iScaledImage = NULL;
+        }
+    
+    iScaler->SetState( CTelBubbleImageScaler::EScalingDone );
+    }
+
+// ---------------------------------------------------------------------------
+// CTelBubbleCallImage::StartScaling
+//
+// ---------------------------------------------------------------------------
+//
+void CBubbleMainPaneControl::StartScaling( CFbsBitmap *aSourceBitmap )
+    {
+    if ( !iScaler )
+        {
+        return;
+        }
+    
+    iScaler->Cancel(); // cancels any outstanding scaling requests
+    
+    delete iScaledImage;
+    iScaledImage = NULL;
+
+    // create a bitmap for scaled size
+    TRAPD( err, iScaledImage = new (ELeave) CFbsBitmap );
+    if ( err != KErrNone )
+        {
+        // no scaling in error cases
+        iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+        return;
+        }
+
+    TSize size = aSourceBitmap->SizeInPixels();
+    TRect scaledRect( 0, 0, size.iWidth * SCALE_FACTOR, size.iHeight * SCALE_FACTOR );
+    
+    TRAP( err, iScaledImage->Create( scaledRect.Size(), aSourceBitmap->DisplayMode() ) );
+    if ( err != KErrNone )
+        {
+        delete iScaledImage;
+        iScaledImage = NULL;
+        iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+        }
+    else
+        {
+        //start scaling
+        TRAPD( err, iScaler->StartScaleL( aSourceBitmap, iScaledImage ) );
+        if (err != KErrNone)
+            {
+            iScaler->SetState( CTelBubbleImageScaler::EScalingIdle );
+            delete iScaledImage;
+            iScaledImage = NULL;
+            }
+        }
+    }
+	
 // END OF FILE