mobilemessaging/smilui/mediasrc/SmilSVGRenderer.cpp
branchRCL_3
changeset 27 7fdbb852d323
parent 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smilui/mediasrc/SmilSVGRenderer.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,606 @@
+/*
+* Copyright (c) 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:   Implementation of CSmilSVGRenderer class.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <AknUtils.h>
+#include <AknsUtils.h>
+#include <data_caging_path_literals.hrh>
+#include <gulicon.h>
+
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include <AknDialog.h>
+#include <SVGTUIDialog.h>
+#include <SVGEngineInterfaceImpl.h>
+#include <SVGTAppObserverUtil.h>
+
+#include <smilmedia.h>
+#include <uniutils.mbg>
+
+#include "SmilSVGRenderer.h"
+#include "MMediaFactoryFileInfo.h"
+
+//#define SVG_DEBUG
+#ifdef SVG_DEBUG
+#include "SmilMediaLogging.h"
+#endif
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KSVGDefaultDuration = 5000;
+
+_LIT( KUniUtilsBitmapFile, "uniutils.mbm" );
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::CSmilSVGRenderer
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CSmilSVGRenderer::CSmilSVGRenderer( MSmilMedia* aMedia, 
+                                    MMediaFactoryFileInfo* aFileInfo,
+                                    DRMCommon& aDrmCommon,
+                                    CDRMHelper& aDrmHelper ) :
+    CSmilMediaRendererBase( EMsgMediaSvg, aMedia, aDrmCommon, aDrmHelper ),
+    iFileInfo( aFileInfo )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::ConstructL( RFile& aFileHandle )
+    {
+#ifdef SVG_DEBUG
+    SMILUILOGGER_WRITE_TIMESTAMP( " --------------------------------" )
+    SMILUILOGGER_ENTERFN( "[SMILUI] SVG: ConstructL" )
+#endif
+
+    if ( iFileInfo == NULL )
+        {
+        User::Leave( KErrArgument );
+        }
+    
+    User::LeaveIfError( iFileHandle.Duplicate( aFileHandle ) );
+    
+    
+    BaseConstructL( iFileHandle );   
+    User::LeaveIfError( CheckDRMRights() );
+    
+    TRect mediaRect = iMedia->GetRegion()->GetRectangle();
+    
+    iThumbnailBitmap = new ( ELeave ) CFbsBitmap;
+    User::LeaveIfError( iThumbnailBitmap->Create( mediaRect.Size(), 
+                                                  iCoeEnv->ScreenDevice()->DisplayMode() ) );
+                                                  
+    iThumbnailMask = new ( ELeave ) CFbsBitmap;
+    User::LeaveIfError( iThumbnailMask->Create( mediaRect.Size(), 
+                                                EGray256 ) );
+	                                            
+    GenerateThumbnailL();
+    
+    TParse fileParse;
+    fileParse.Set( KUniUtilsBitmapFile, &KDC_APP_BITMAP_DIR, NULL );
+    
+    iIndicatorIcon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(), 
+                                                KAknsIIDQgnGrafMmsPres,
+                                                fileParse.FullName(), 
+                                                EMbmUniutilsQgn_graf_mms_pres, 
+                                                EMbmUniutilsQgn_graf_mms_pres_mask );
+    
+    iIndicatorSize = RetrieveIconSize();
+    User::LeaveIfError( AknIconUtils::SetSize( iIndicatorIcon->Bitmap(), iIndicatorSize ) );    
+
+    static_cast<CSmilMedia*>( iMedia )->SetFocusable( ETrue );
+    
+#ifdef SVG_DEBUG  
+    SMILUILOGGER_LEAVEFN( "[SMILUI] SVG: ConstructL" )
+#endif
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSmilSVGRenderer* CSmilSVGRenderer::NewL( RFile& aFileHandle, 
+                                          MSmilMedia* aMedia,
+                                          MMediaFactoryFileInfo* aFileInfo,
+                                          DRMCommon& aDrmCommon,
+                                          CDRMHelper& aDrmHelper )
+    {
+    CSmilSVGRenderer* self = new( ELeave ) CSmilSVGRenderer( aMedia, 
+                                                             aFileInfo, 
+                                                             aDrmCommon, 
+                                                             aDrmHelper );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aFileHandle );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::~CSmilSVGRenderer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSmilSVGRenderer::~CSmilSVGRenderer()
+    {
+    iFileHandle.Close();
+    
+    delete iThumbnailBitmap;
+    delete iThumbnailMask;
+    delete iIndicatorIcon;
+    
+    delete iObserverUtil;
+    
+    iMedia = NULL; // For LINT
+    iFileInfo = NULL; // For LINT
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::IsVisual
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSmilSVGRenderer::IsVisual() const
+    {
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::IntrinsicWidth
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSmilSVGRenderer::IntrinsicWidth() const
+    {
+    return iThumbnailBitmap->SizeInPixels().iWidth;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::IntrinsicHeight
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSmilSVGRenderer::IntrinsicHeight() const
+    {
+    return iThumbnailBitmap->SizeInPixels().iHeight;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::IntrinsicDuration
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TSmilTime CSmilSVGRenderer::IntrinsicDuration() const
+    {
+    return KSVGDefaultDuration;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::PrepareMediaL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::PrepareMediaL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::SeekMediaL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::SeekMediaL( const TSmilTime& /*aTime*/ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ShowMediaL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::ShowMediaL()
+    {
+    iVisible = ETrue;
+    iMedia->Redraw();
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::HideMedia
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::HideMedia()
+    {
+    iVisible = EFalse;
+    iMedia->Redraw();
+    }
+    
+    // -----------------------------------------------------------------------------
+// CSmilSVGRenderer::FreezeMedia
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::FreezeMedia()
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ResumeMedia
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::ResumeMedia()
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::Draw
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::Draw( CGraphicsContext& aGc,
+                             const TRect& /*aRect*/,
+                             CSmilTransitionFilter* /*aTransitionFilter*/,
+                             const MSmilFocus* aFocus )
+    {
+    if ( iVisible )
+        {
+        CBitmapContext* tmpBitmapContext = static_cast<CBitmapContext*>( &aGc );
+        
+        tmpBitmapContext->SetBrushStyle( CGraphicsContext::ENullBrush );
+        
+        tmpBitmapContext->BitBltMasked( iFocusRect.iTl, 
+                                        iThumbnailBitmap,
+                                        iThumbnailSize,
+                                        iThumbnailMask,
+                                        ETrue );
+        
+
+        TPoint indicatorPosition( iFocusRect.iTl.iX,
+                                  iFocusRect.iBr.iY );
+        
+        indicatorPosition.iY -= iIndicatorSize.iHeight;
+        
+        tmpBitmapContext->BitBltMasked( indicatorPosition, 
+                                        iIndicatorIcon->Bitmap(),
+                                        iIndicatorSize,
+                                        iIndicatorIcon->Mask(),
+                                        ETrue );
+            
+        DrawFocus( aGc, aFocus );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ActivateRendererL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSmilSVGRenderer::ActivateRendererL()
+    {                   
+    CSVGTUIDialog* svgtDialog = CSVGTUIDialog::NewL();
+    
+    delete iObserverUtil;
+    iObserverUtil = NULL;
+    
+    iObserverUtil = CSVGTAppObserverUtil::NewL( svgtDialog, &iFileHandle );
+    
+    svgtDialog->ExecuteLD( iFileHandle, this );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::FetchImage
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSmilSVGRenderer::FetchImage( const TDesC& aUri, RFs& aSession, RFile& aFileHandle )
+    {
+    TRAPD( error, iFileInfo->GetFileHandleL( aUri, aFileHandle ) );
+    
+    if ( error != KErrNone )
+        {
+        error = iObserverUtil->FetchImage( aUri, aSession, aFileHandle );
+        }
+    
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::LinkActivated
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSmilSVGRenderer::LinkActivated( const TDesC& aUri )
+    {
+    return iObserverUtil->LinkActivated( aUri );
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::LinkActivatedWithShow
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//      
+TBool CSmilSVGRenderer::LinkActivatedWithShow( const TDesC& aUri, const TDesC& aShow )
+    {
+    return iObserverUtil->LinkActivatedWithShow( aUri, aShow );
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::DisplayDowloadMenuL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//                                                    
+void CSmilSVGRenderer::DisplayDownloadMenuL()
+    {
+    iObserverUtil->DisplayDownloadMenuL();
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::GetSmilFitValue
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//                                              
+void CSmilSVGRenderer::GetSmilFitValue( TDes& aSmilValue )
+    {
+    iObserverUtil->GetSmilFitValue( aSmilValue );
+    }
+                                                     
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::CanShowSave
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+TBool CSmilSVGRenderer::CanShowSave()
+    {
+    return iObserverUtil->CanShowSave();
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::IsSavingDone
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TBool CSmilSVGRenderer::IsSavingDone()
+    {
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::CanShowDownload
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TBool CSmilSVGRenderer::CanShowDownload() const
+    {
+    return iObserverUtil->CanShowDownload();
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::DoSaveL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CSmilSVGRenderer::DoSaveL( TInt aButtonid )
+    {
+    iObserverUtil->DoSaveL( aButtonid );
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::NewFetchImageData
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//                                       
+TInt CSmilSVGRenderer::NewFetchImageData( const TDesC& aUri )
+    {
+    return iObserverUtil->NewFetchImageData( aUri );
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::AssignEmbededDataL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::AssignEmbededDataL( const TDesC& aUri )
+    {
+    iObserverUtil->AssignEmbededDataL( aUri );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::UpdateScreen
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::UpdateScreen()
+    {    
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ScriptCall
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSmilSVGRenderer::ScriptCall( const TDesC& /*aScript*/, CSvgElementImpl* /*aCallerElement*/ )
+    {
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::FetchFont
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSmilSVGRenderer::FetchFont( const TDesC& aUri, RFs& /*aSession*/, RFile& aFileHandle )
+    {
+    TRAPD( error, iFileInfo->GetFileHandleL( aUri, aFileHandle ) );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::UpdatePresentation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::UpdatePresentation( const TInt32&  /*aNoOfAnimation*/ )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::UpdatePresentation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::GenerateThumbnailL()
+    {
+#ifdef SVG_DEBUG
+    SMILUILOGGER_ENTERFN( "SVG, GenerateThumbnailL" );
+#endif
+
+    TFontSpec spec;
+    CSvgEngineInterfaceImpl* svgEngine = CSvgEngineInterfaceImpl::NewL( iThumbnailBitmap, this, spec );
+    CleanupStack::PushL( svgEngine );
+    
+    svgEngine->SetBackgroundColor( KRgbWhite.Value() );
+    
+    TInt domHandle( KNullHandle );
+    MSvgError* result = svgEngine->PrepareDom( iFileHandle, domHandle );
+    
+    HandleSVGEngineErrorL( result );
+        
+    result = svgEngine->UseDom( domHandle, iThumbnailBitmap, iThumbnailMask );
+    
+    HandleSVGEngineErrorL( result );
+        
+    iThumbnailSize = svgEngine->Size();
+    
+    if ( iThumbnailSize.iHeight <= 0 &&
+         iThumbnailSize.iWidth <= 0 )
+        {
+        // SVG engine might fail to set proper size so in that case
+        // we use the original size.
+        iThumbnailSize = svgEngine->GetUnscaledContentSize( domHandle );
+        }
+    
+    if ( iThumbnailSize.iHeight > 0 &&
+         iThumbnailSize.iWidth > 0 )
+        {
+        TRect mediaRect = iMedia->GetRegion()->GetRectangle();
+          
+        TReal widthRatio = static_cast<TReal>( mediaRect.Width() ) / 
+                           static_cast<TReal>( iThumbnailSize.iWidth );
+        TReal heightRatio = static_cast<TReal>( mediaRect.Height() ) / 
+                            static_cast<TReal>( iThumbnailSize.iHeight );
+        
+        // Calculate "meet" ratio                    
+        TReal scaleFactor = ( widthRatio < heightRatio ) ? widthRatio : heightRatio;
+        
+        iThumbnailSize.iHeight *= scaleFactor;
+        iThumbnailSize.iWidth *= scaleFactor;
+        
+        svgEngine->SetSvgDimensionToFrameBuffer( iThumbnailSize.iWidth, iThumbnailSize.iHeight );
+        
+        // Chooses view box for SVG files where it has not bee set.
+        svgEngine->ChooseViewBoxIfNotSet( domHandle );    
+        svgEngine->InitializeEngine();
+        
+        // Render the content on consumer provided bitmap
+        svgEngine->RenderFrame( NULL, 0 );
+        
+        iFocusRect = mediaRect;
+        
+        // Center the focus rect.
+        iFocusRect.Shrink( ( mediaRect.Width() - iThumbnailSize.iWidth ) / 2, 
+                           ( mediaRect.Height() - iThumbnailSize.iHeight ) / 2 );        
+        }
+    
+    CleanupStack::PopAndDestroy( svgEngine );
+    
+#ifdef SVG_DEBUG
+    SMILUILOGGER_LEAVEFN( "SVG: GenerateThumbnailL" );
+    SMILUILOGGER_WRITEF( _L("") );
+#endif
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::HandleSVGEngineErrorL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSmilSVGRenderer::HandleSVGEngineErrorL( MSvgError* aError ) const
+    {
+    if ( !aError )
+        {
+#ifdef SVG_DEBUG
+        SMILUILOGGER_WRITEF( _L("[SMILUI] SVG: Engine error: no memory") );
+#endif  
+        User::Leave( KErrNoMemory ); 
+        }
+    else if ( aError->HasError() && !aError->IsWarning() )
+        {
+#ifdef SVG_DEBUG
+        SMILUILOGGER_WRITEF( _L("[SMILUI] SVG: Engine error: %d"), aError->SystemErrorCode() );
+#endif  
+        User::Leave( aError->SystemErrorCode() ); 
+        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSmilSVGRenderer::ExitWhenOrientationChange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSmilSVGRenderer::ExitWhenOrientationChange()
+    {
+        return ETrue;
+    }
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File