diff -r 000000000000 -r 72b543305e3a mobilemessaging/smilui/mediasrc/SmilDefaultRenderer.cpp --- /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 +#include +#include + +#include +#include + +#include "SmilDefaultRenderer.h" + +#include +_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( &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