diff -r e52958d06c29 -r 20b99a6d6175 svgtviewer/SvgtViewerPlugin/ScreenSaverPluginSrc/SvgRenderFrameControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtviewer/SvgtViewerPlugin/ScreenSaverPluginSrc/SvgRenderFrameControl.cpp Wed Sep 01 12:29:59 2010 +0100 @@ -0,0 +1,510 @@ +/* +* Copyright (c) 2005 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: This file implements a control which displays svg files using +* renderframes engine api, used by Screen Saver application +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SvgRenderFrameControl.h" +#include "SvgRenderFrameTimer.h" + +const TUint KConvertToMicroSecond = 1000; +const TInt KMilliSecondsBetweenFrame = 50; + +// Font Ids for use with Engine-Init +const TInt KApacFontId = EApacPlain16; +const TInt KLatintFontId = ELatinBold12; + +// Duration const returned by engine when indefinite animations are present +const TUint KIndefiniteDur = 0xffffffff; + +#ifdef _DEBUG +_LIT( KFileLoggingDir, "ScreenSaver" ); +_LIT( KFileLog, "FromSvgPlugin.txt" ); +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::NewL +// ----------------------------------------------------------------------------- +// +CSvgRenderFrameControl* CSvgRenderFrameControl::NewL( + const CCoeControl* aParent, + RFile& aFileHandle , + MSvgtAppObserver* aObserver ) + { + CSvgRenderFrameControl* self = CSvgRenderFrameControl::NewLC( aParent, + aFileHandle, + aObserver ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::NewL +// ----------------------------------------------------------------------------- +// +CSvgRenderFrameControl* CSvgRenderFrameControl::NewLC( + const CCoeControl* aParent, + RFile& aFileHandle , + MSvgtAppObserver* aObserver ) + { + CSvgRenderFrameControl* self = new (ELeave) CSvgRenderFrameControl( + aFileHandle, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aParent ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::~CSvgRenderFrameControl +// ----------------------------------------------------------------------------- +// +CSvgRenderFrameControl::~CSvgRenderFrameControl() + { + DeleteEngine(); + delete iBmap; + delete iRenderFrameTimer; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::SizeChanged +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::SizeChanged() + { + iRect = iParent->Rect(); + + } +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::UpdateScreen +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::UpdateScreen() + { + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::ScriptCall +// ----------------------------------------------------------------------------- +// +TBool CSvgRenderFrameControl::ScriptCall( const TDesC& /*aScript*/, + CSvgElementImpl* /*aCallerElement*/ ) + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::FetchImage +// ----------------------------------------------------------------------------- +// +TInt CSvgRenderFrameControl::FetchImage( const TDesC& aUri, RFs& aSession, + RFile& aFileHandle ) + { + if ( iAppObserver ) + { + return iAppObserver->FetchImage( aUri, aSession, aFileHandle ); + } + else + { + return KErrNotFound; + } + + } + +TInt CSvgRenderFrameControl::FetchFont( const TDesC& /* aUri */, + RFs& /* aSession */, RFile& /* aFileHandle */ ) + { + return KErrNotSupported; + } +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::GetSmilFitValue +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::GetSmilFitValue(TDes& /*aSmilValue*/) + { + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::UpdatePresentation +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::UpdatePresentation( const TInt32& + /*aNoOfAnimation*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::Draw +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::Draw(const TRect& /*aRect*/) const + { + + // Calculate rectangle for the whole bitmap + TRect bmpPieceRect(TPoint(0,0), iRect.Size() ); + + // Get the standard graphics context + CWindowGc& gc = SystemGc(); + + gc.SetBrushColor(CGraphicsContext::ENullBrush ); + gc.SetPenColor( CGraphicsContext::ENullPen ); + + gc.BitBlt( TPoint(0,0),iBitmapFrames[iCurrentFrame], + bmpPieceRect ); + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::SetTimer +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::SetTimer() + { + if ( !iRenderFrameTimer ) + { + TRAP_IGNORE( iRenderFrameTimer = + CSvgRenderFrameTimer::NewL( this ) ); + } + if ( iCanPlay ) + { + // Since the number of delay intervals is one less than + // the number of bitmaps need to have a bound check + iRenderFrameTimer->SetTimeOut( iDelayIntervals[ + iCurrentFrame >= iDelayIntervals.Count() ? 0 : iCurrentFrame] + * KConvertToMicroSecond ); + } + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::CancelTimer +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::CancelTimer() + { + if (iRenderFrameTimer) + { + iRenderFrameTimer->Cancel(); + delete iRenderFrameTimer; + iRenderFrameTimer = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::ProcessViewerCommandL +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::ProcessViewerCommandL( TInt aCommandId ) + { + if ( aCommandId == ESvgtDlgPlayCommand ) + { + _LIT(msg1, "start event " ); + PrintDebugMsg( msg1 ); + iCanPlay = ETrue; + SetTimer(); + } + if ( aCommandId == ESvgtDlgPauseCommand ) + { + _LIT(msg1, "end event " ); + PrintDebugMsg( msg1 ); + iCanPlay = EFalse; + CancelTimer(); + } + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::GetCurrentIndex +// ----------------------------------------------------------------------------- +// +TInt CSvgRenderFrameControl::GetCurrentIndex() const + { + return iCurrentFrame; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::SetCurrentIndex +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::SetCurrentIndex( TInt aIndex ) + { + iCurrentFrame = aIndex; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::AnimationTimeOut +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::AnimationTimeOut() + { + DrawNow(); + SetTimer(); + MoveIndex(); + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::InitializeEngineL +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::InitializeEngineL( TBool aCheckFile, + MSvgRequestObserver* aObserver ) + { + + iBmap = new ( ELeave ) CFbsBitmap(); + TSize dummyScreenSize( 10,10 ); + iBmap->Create( dummyScreenSize, EColor16MU ); + + if ( !iSvgEngine ) + { + TInt fontId = KLatintFontId; + + switch ( AknLayoutUtils::Variant() ) + { + case EApacVariant: + { + fontId = KApacFontId; + } + break; + case EEuropeanVariant: + default: + break; + } + const CFont* font = AknLayoutUtils::FontFromId( fontId ); + TFontSpec spec = font->FontSpecInTwips(); + + iSvgEngine = CSvgEngineInterfaceImpl::NewL( iBmap, + aObserver, + spec ); + + if ( iSvgEngine && !iSvgDom ) + { + if ( aCheckFile ) + { + /* Set Thumbnail Mode if check file mode + * so that the rights wont be consumed + */ + iSvgEngine->SetThumbNailMode( ETrue ); + } + + MSvgError* parseResult = iSvgEngine->PrepareDom( *iFileHandle, + iSvgDom ); + + if ( aCheckFile ) + { + /* Reset Thumbnail Mode */ + iSvgEngine->SetThumbNailMode( EFalse ); + } + + if ( parseResult && + parseResult->HasError() && + !parseResult->IsWarning() ) + { + if ( parseResult->HasError() == ESvgNoMemory ) + { + User::Leave( KErrNoMemory ); + } + else + { + User::Leave( KErrGeneral ); + } + } + if ( !aCheckFile ) + { + MSvgError* pResult = iSvgEngine->UseDom( iSvgDom, iBmap ); + if ( pResult->HasError() && !pResult->IsWarning() ) + { + User::Leave( KErrGeneral ); + } + } + } + else + { + User::Leave( KErrGeneral ); + } + } + else + { + User::Leave( KErrGeneral ); + } + return; + + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::DeleteEngine +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::DeleteEngine() + { + for ( TInt i = 0; i < iBitmapFrames.Count(); i++ ) + { + delete iBitmapFrames[i]; + } + + for ( TInt i = 0; i < iMaskFrames.Count(); i++ ) + { + delete iMaskFrames[i]; + } + + iBitmapFrames.Reset(); + iMaskFrames.Reset(); + iDelayIntervals.Reset(); + + iBitmapFrames.Close(); + iMaskFrames.Close(); + iDelayIntervals.Close(); + + iCurrentFrame = 0; + iDuration = 0; + + if ( iSvgDom ) + { + iSvgEngine->DeleteDom( iSvgDom ); + iSvgDom = 0; + } + delete iSvgEngine; + iSvgEngine = NULL; + + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::RenderMyFrames +// ----------------------------------------------------------------------------- +// +TInt CSvgRenderFrameControl::RenderMyFrames() + { + + TUint interval = iSvgEngine->Duration(); + + if ( interval == KIndefiniteDur || interval > KMaxTimeDuration ) + { + // Infinite content + // Dont try to handle using Render Frames + // return Error + return KErrGeneral; + } + + + + MSvgError* result = iSvgEngine->RenderFrames( + iSvgDom, + iRect.Size(), + 0, + interval, + KMilliSecondsBetweenFrame, + EColor64K, EGray2, + iBitmapFrames, + iMaskFrames, + iDelayIntervals, + ETrue /*Remove redundant frames*/ ); + + + if ( result->HasError() && !result->IsWarning() ) + { + return KErrGeneral; + } + else + { + return KErrNone; + } + } + + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::MoveIndex +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::MoveIndex() + { + + TBuf<64> buffer1; + _LIT(msg1, "Index is : %d" ); + buffer1.Format( msg1, iCurrentFrame ); + PrintDebugMsg( buffer1 ); + + iCurrentFrame++; + if ( iCurrentFrame == iBitmapFrames.Count() ) + { + iCurrentFrame = 0; + } + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::CSvgRenderFrameControl +// ----------------------------------------------------------------------------- +// +CSvgRenderFrameControl::CSvgRenderFrameControl( RFile& aFileHandle, + MSvgtAppObserver* aObserver ) + { + iCurrentFrame = 0; + iDuration = 0; + iSvgEngine = NULL; + iSvgDom = 0; + iFileHandle = &aFileHandle; + iCanPlay = EFalse; + iParent = NULL; + iAppObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::ConstructL +// ----------------------------------------------------------------------------- +// +void CSvgRenderFrameControl::ConstructL( const CCoeControl* aParent ) + { + + if ( aParent ) + { + CreateWindowL(aParent); + iParent = aParent; + iRect = aParent->Rect(); + } + + InitializeEngineL( EFalse /*Not checkFile mode*/ , this ); + + User::LeaveIfError(RenderMyFrames()); + + SetRect( iRect ); + + ActivateL(); + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::PrintDebugMsg +// ----------------------------------------------------------------------------- +// +#ifndef _DEBUG +void CSvgRenderFrameControl::PrintDebugMsg( const TDesC& /* aMsg */ ) const +#else +void CSvgRenderFrameControl::PrintDebugMsg( const TDesC& aMsg ) const +#endif + { +#ifdef _DEBUG + RFileLogger::Write( KFileLoggingDir, KFileLog, + EFileLoggingModeAppend, aMsg ); +#endif + } + +// End Of file. +