mobilemessaging/smilui/mediasrc/SmilDefaultRenderer.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smilui/mediasrc/SmilDefaultRenderer.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,502 @@
+/*
+* Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: SmilDefaultRenderer implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <smilregioninterface.h>
+#include <data_caging_path_literals.hrh>
+#include <gulicon.h>
+
+#include <AknsUtils.h>
+#include <AknsConstants.h>
+
+#include "SmilDefaultRenderer.h"
+
+#include <uniutils.mbg>
+_LIT( KUniUtilsBitmapFile, "uniutils.mbm" );
+
+#ifdef DEFAULT_DEBUG
+    #include "SmilMediaLogging.h"
+#endif
+
+// LOCAL FUNCTION PROTOTYPES
+
+// LOCAL CONSTANTS
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::CSmilDefaultRenderer
+// C++ constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------
+CSmilDefaultRenderer::CSmilDefaultRenderer( MSmilMedia* aMedia,
+                                            DRMCommon& aDrmCommon,
+                                            CDRMHelper& aDrmHelper ) :
+    CSmilMediaRendererBase( EMsgMediaUnknown, aMedia, aDrmCommon, aDrmHelper )
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::ConstructL
+// Symbian 2nd phase constructor can leave. Retrieves the correct
+// icon for this media type depending on the situation. If correct
+// mediatype is not detected then blank default renderer is created.
+// Icon size is retrived from LAF if scalable LAF is present. 
+// Current icon size & position is defined on MMS LAF but we 
+// only use the size so we can use that value.Icon is drawn 
+// on its original size or scaled so that aspect ratio is kept 
+// and icon is shown as large as possible.
+// ---------------------------------------------------------
+void CSmilDefaultRenderer::ConstructL( RFile& aFileHandle,
+                                       TBool aDRMError, 
+                                       TMsgMediaType aMediaType )
+    {
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_WRITE_TIMESTAMP( " --------------------------------" );
+    SMILUILOGGER_ENTERFN( "[SMILUI] Default: ConstructL" );
+    SMILUILOGGER_WRITEF( _L("[SMILUI] Default: aDRMError=%d"), aDRMError );
+    SMILUILOGGER_WRITEF( _L("[SMILUI] Default: aMediaType=%d"), aMediaType );
+#endif
+
+    BaseConstructL( aFileHandle );
+
+    TParse fileParse;
+    fileParse.Set( KUniUtilsBitmapFile, &KDC_APP_BITMAP_DIR, NULL );
+    
+    TAknsItemID itemID( KAknsIIDNone );
+    TInt bitmapIndex( -1 );
+    TInt maskIndex( 0 );
+    
+    TBool sendingAllowed( ETrue );
+    if ( aDRMError )
+        {
+        sendingAllowed = SendingDrmFileAllowedL( aFileHandle );
+        }
+
+    switch ( aMediaType )
+        {
+        case EMsgMediaImage:
+            {
+            if ( aDRMError )
+                {
+                if ( sendingAllowed )
+                    {
+                    itemID = KAknsIIDQgnGrafMmsImageDrm;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_image_drm;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_image_drm_mask;    
+                    }
+                else
+                    {
+                    itemID = KAknsIIDQgnGrafMmsImageDrmInvalidSendForbid;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_image_drm_invalid_send_forbid;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_image_drm_invalid_send_forbid_mask;
+                    }
+                }
+            else
+                {
+                itemID = KAknsIIDQgnGrafMmsImageCorrupted;
+                bitmapIndex = EMbmUniutilsQgn_graf_mms_image_corrupted;
+                maskIndex = EMbmUniutilsQgn_graf_mms_image_corrupted_mask;
+                }
+            break;
+            }
+        case EMsgMediaVideo:
+            {
+            if ( aDRMError )
+                {
+                if ( sendingAllowed )
+                    {
+                    itemID = KAknsIIDQgnGrafMmsVideoDrm;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_video_drm;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_video_drm_mask;
+                    }
+                else
+                    {
+                    itemID = KAknsIIDQgnGrafMmsVideoDrmInvalidSendForbid;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_video_drm_invalid_send_forbid;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_video_drm_invalid_send_forbid_mask;
+                    }
+                }
+            else
+                {
+                itemID = KAknsIIDQgnGrafMmsVideoCorrupted;
+                bitmapIndex =  EMbmUniutilsQgn_graf_mms_video_corrupted;
+                maskIndex =  EMbmUniutilsQgn_graf_mms_video_corrupted_mask;
+                }
+            break;
+            }
+        case EMsgMediaSvg:
+            {
+            if ( aDRMError )
+                {
+                if ( sendingAllowed )
+                    {
+                    itemID = KAknsIIDQgnGrafMmsPresDrmInvalidSend;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_pres_drm_invalid_send;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_pres_drm_invalid_send_mask;
+                    }
+                else
+                    {
+                    itemID = KAknsIIDQgnGrafMmsPresDrmInvalidSendForbid;
+                    bitmapIndex = EMbmUniutilsQgn_graf_mms_pres_drm_invalid_send_forbid;
+                    maskIndex = EMbmUniutilsQgn_graf_mms_pres_drm_invalid_send_forbid_mask;
+                    }
+                }
+            else
+                {
+                itemID = KAknsIIDQgnGrafMmsPresCorrupted;
+                bitmapIndex =  EMbmUniutilsQgn_graf_mms_pres_corrupted;
+                maskIndex =  EMbmUniutilsQgn_graf_mms_pres_corrupted_mask;
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+ 
+    if ( bitmapIndex != -1 )
+        {
+        TSize regionSize( iMedia->GetRectangle().Size() );
+
+#ifdef DEFAULT_DEBUG
+        SMILUILOGGER_WRITEF( _L("[SMILUI] Default: regionSize=%d %d"), regionSize.iWidth, regionSize.iHeight );
+#endif
+    
+        iIcon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(), 
+                                           itemID, 
+                                           fileParse.FullName(), 
+                                           bitmapIndex, 
+                                           maskIndex );
+        
+        TSize originalSize( RetrieveIconSize() );
+        
+        TSize iconSize;
+            
+        if ( originalSize.iHeight > regionSize.iHeight ||
+             originalSize.iWidth > regionSize.iWidth )
+            {
+            iconSize = CalculateIconFitSize( regionSize, originalSize );
+            }
+        else
+            {
+            iconSize = originalSize;
+            }
+       
+       iIconRect.SetRect( CalculateIconCenterPosition( regionSize, iconSize ), iconSize );
+
+#ifdef DEFAULT_DEBUG
+        SMILUILOGGER_WRITEF( _L("[SMILUI] Default: iIconRect=%d %d"), 
+                            iIconRect.Size().iWidth, 
+                            iIconRect.Size().iHeight );
+#endif  
+
+        User::LeaveIfError( AknIconUtils::SetSize( iIcon->Bitmap(), iIconRect.Size() ) );        
+        }
+        
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_LEAVEFN( "[SMILUI] Default: ConstructL" );
+#endif
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::NewL
+// Static constructor.
+// ---------------------------------------------------------
+CSmilDefaultRenderer* CSmilDefaultRenderer::NewL( RFile& aFileHandle,
+                                                  MSmilMedia* aMedia,
+                                                  DRMCommon& aDrmCommon,
+                                                  CDRMHelper& aDrmHelper,
+                                                  TMsgMediaType aMediaType, 
+                                                  TBool aDRMError )
+    {
+    CSmilDefaultRenderer* self = new(ELeave) CSmilDefaultRenderer( aMedia,
+                                                                   aDrmCommon,
+                                                                   aDrmHelper );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aFileHandle, aDRMError, aMediaType );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::~CSmilDefaultRenderer
+// Destructor
+// ---------------------------------------------------------    
+CSmilDefaultRenderer::~CSmilDefaultRenderer()
+    {
+    delete iIcon;
+
+    // Not owned
+    iMedia = NULL; //For LINT
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::IsVisual
+// Default icon is visual (i.e. draws something to the screen.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CSmilDefaultRenderer::IsVisual() const
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::IntrinsicWidth
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CSmilDefaultRenderer::IntrinsicWidth() const
+    {
+    return iMedia->GetRectangle().Size().iWidth;
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::IntrinsicHeight
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CSmilDefaultRenderer::IntrinsicHeight() const
+    {
+    return iMedia->GetRectangle().Size().iHeight;
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::IntrinsicDuration
+// Returns zero as default icon is static.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TSmilTime CSmilDefaultRenderer::IntrinsicDuration() const
+    {
+    return 0;
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::Draw
+// Performs the drawing of the icon to specific place and size.
+// Transition effects are not supported with default renderer.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::Draw( CGraphicsContext& aGc, 
+                                 const TRect& /*aRect*/, 
+                                 CSmilTransitionFilter* /*aTransitionFilter*/, 
+                                 const MSmilFocus* aFocus )
+    {
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_ENTERFN( "[SMILUI] Default: Draw" );
+#endif
+
+    if ( iVisible )
+        {
+        if ( iIcon )
+            {            
+            //Top left corner of bitmap should be in this coordinate
+            TPoint tlc( iMedia->GetRectangle().iTl );
+            tlc += iIconRect.iTl;
+            
+            // Source rectangle.
+            TRect sourceRect( TPoint( 0, 0 ), iIconRect.Size() );
+            
+            // Cast graphics context to CFbsBitGc
+            CBitmapContext* tmpBitmapContext = static_cast<CBitmapContext*>( &aGc );
+
+#ifdef DEFAULT_DEBUG
+            SMILUILOGGER_WRITEF( _L("[SMILUI] Default: tlc=%d %d"), 
+                                 tlc.iX, 
+                                 tlc.iY );
+            SMILUILOGGER_WRITEF( _L("[SMILUI] Default: sourceRect=%d %d %d %d"), 
+                                 sourceRect.iTl.iX, 
+                                 sourceRect.iTl.iY,
+                                 sourceRect.iBr.iX,
+                                 sourceRect.iBr.iY );
+#endif
+            
+            if ( iIcon->Mask() )
+                {                   
+                tmpBitmapContext->BitBltMasked( tlc,
+                                                iIcon->Bitmap(), 
+                                                sourceRect,
+                                                iIcon->Mask(), 
+                                                EFalse );
+                }
+            else
+                {                    
+                tmpBitmapContext->BitBlt( tlc, 
+                                          iIcon->Bitmap(), 
+                                          sourceRect );
+                }
+            }
+            
+        DrawFocus( aGc, aFocus );
+        }
+
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_LEAVEFN( "[SMILUI] Default: Draw" );
+#endif
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::PrepareMediaL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::PrepareMediaL()
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::SeekMediaL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::SeekMediaL( const TSmilTime& /*aTime*/ )
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::ShowMediaL
+// Sets renderer visible and draws it to the screen.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::ShowMediaL()
+    {
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_ENTERFN( "[SMILUI] Default: ShowMediaL" );
+#endif
+
+    if ( !iVisible )
+        {
+        iVisible = ETrue;
+        iMedia->Redraw();
+        }
+
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_LEAVEFN( "[SMILUI] Default: ShowMediaL" );
+#endif
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::HideMedia
+// Hides the renderer and redraws the occupied area.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::HideMedia()
+    {
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_ENTERFN( "[SMILUI] Default: HideMedia" );
+#endif
+
+    if ( iVisible )
+        {
+        iVisible = EFalse;
+        iMedia->Redraw();
+        }
+    
+#ifdef DEFAULT_DEBUG
+    SMILUILOGGER_LEAVEFN( "[SMILUI] Default: HideMedia" );
+#endif
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::FreezeMedia
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::FreezeMedia()
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::ResumeMedia
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::ResumeMedia()
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmilDefaultRenderer::Close
+// Deletes the renderer.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSmilDefaultRenderer::Close()
+    {
+    delete this;
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilDefaultRenderer::CalculateIconFitSize
+// Calculates correct icon size so that icon aspect ratio is preserved 
+// and it is shown fully on region as large as possible). 
+// ----------------------------------------------------------------------------
+//
+TSize CSmilDefaultRenderer::CalculateIconFitSize( const TSize& aRegion,
+                                                  const TSize& aIcon ) const
+    {
+    TSize result;
+    
+    if ( aIcon.iWidth != 0 &&
+         aIcon.iHeight != 0 )
+        {
+        TInt targetWidth = aRegion.iWidth;
+        TInt scaledWidth = aRegion.iHeight * aIcon.iWidth / aIcon.iHeight;
+        
+        if ( targetWidth < scaledWidth )
+            {
+            result.iWidth = aRegion.iWidth;
+            result.iHeight = aIcon.iHeight * aRegion.iWidth / aIcon.iWidth;
+            }
+        else
+            {
+            result.iWidth = aIcon.iWidth * aRegion.iHeight / aIcon.iHeight; 
+            result.iHeight = aRegion.iHeight;
+            }
+        }
+    
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilDefaultRenderer::CalculateIconCenterPosition
+// Calculates correct icon position inside overall renderer region so that 
+// icon is centeralized according height and width.
+// ----------------------------------------------------------------------------
+//
+TPoint CSmilDefaultRenderer::CalculateIconCenterPosition( const TSize& aRegion,
+                                                          const TSize& aIcon ) const
+    {
+    return TPoint( ( aRegion.iWidth - aIcon.iWidth ) / 2, 
+                   ( aRegion.iHeight - aIcon.iHeight ) / 2 );
+    }
+
+
+//  End of File