--- /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