diff -r 41a7f70b3818 -r 5266b1f337bd phoneuis/BubbleManager/bmcustomization/src/telbubblecallimage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/BubbleManager/bmcustomization/src/telbubblecallimage.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,272 @@ +/* +* Copyright (c) 2008 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: Call image control. +* +*/ + + +#include +#include + +// ======== LOCAL FUNCTIONS ======== + +/** + * Draws rounded rect. Used for drawing frame to caller image bitmap. + */ +void DrawRoundRect(CWindowGc& aGC, TPoint aTopLeft, TSize aSize ) + { + const TRgb white( 255, 255, 255); + aGC.SetPenColor( white ); + aGC.SetPenSize( TSize( 5, 5 ) ); + + TPoint bottomRight = aTopLeft + aSize; + TRect decoratorRect( aTopLeft, bottomRight ); + // Make rect litle larger so that it will be outside of the caller image, + // so that bitmap's corners are hidden. + decoratorRect.Grow( 2, 2 ); + const TSize ellipsesSize( 10, 10 ); + aGC.DrawRoundRect( decoratorRect, ellipsesSize ); + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CTelBubbleCallImage::CTelBubbleCallImage() + { + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CTelBubbleCallImage* CTelBubbleCallImage::NewL() + { + CTelBubbleCallImage* self = new( ELeave )CTelBubbleCallImage(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CTelBubbleCallImage::~CTelBubbleCallImage() + { + if ( iImageOwnership ) + { + delete iImage; + } + if ( iMaskOwnership ) + { + delete iMask; + } + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ConstructL +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::SetImage +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::SetImage( + CFbsBitmap* aImage, + TBool aImageOwnership, + CFbsBitmap* aMask, + TBool aMaskOwnership ) + { + if ( iImageOwnership ) + { + delete iImage; + } + if ( iMaskOwnership ) + { + delete iMask; + } + + iImage = aImage; + iMask = aMask; + iImageOwnership = aImageOwnership; + iMaskOwnership = aMaskOwnership; + + SizeChanged(); + ImageChanged(); + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ReleaseImage +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::ImageChanged() + { + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ReleaseImage +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::SetImagePlacingArea( TRect& aRect ) + { + iImagePlacingArea = aRect; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ReleaseImage +// --------------------------------------------------------------------------- +// +EXPORT_C const CFbsBitmap* CTelBubbleCallImage::Image() const + { + return iImage; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ReleaseImage +// --------------------------------------------------------------------------- +// +EXPORT_C const CFbsBitmap* CTelBubbleCallImage::Mask() const + { + return iMask; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::IsFullScreenImage +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CTelBubbleCallImage::IsFullScreenImage() const + { + TBool isFullScreen = ETrue; + + if ( iImage ) + { + TSize imageSize = iImage->SizeInPixels(); + TSize thisSize( Rect().Size() ); + isFullScreen = ( imageSize.iWidth >= thisSize.iWidth ) || + ( imageSize.iHeight >= thisSize.iHeight ); + } + + return isFullScreen; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::Offset +// --------------------------------------------------------------------------- +// +EXPORT_C const TPoint& CTelBubbleCallImage::Offset() const + { + return iOffset; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::SourceRect +// --------------------------------------------------------------------------- +// +EXPORT_C const TRect& CTelBubbleCallImage::SourceRect() const + { + return iSourceRect; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::ImagePlacingArea +// --------------------------------------------------------------------------- +// +EXPORT_C const TRect& CTelBubbleCallImage::ImagePlacingArea() const + { + return iImagePlacingArea; + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::SizeChanged +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::SizeChanged() + { + if ( !iImage ) + { + return; + } + + // If bitmap is bigger than drawing area then clip from center of the image. + TRect rect = Rect(); + iSourceRect = iImage->SizeInPixels(); + + TInt offsetX = ( iSourceRect.Width() > rect.Width() ) ? + ((iSourceRect.Width() - rect.Width()) / 2) : 0; + TInt offsetY = ( iSourceRect.Height() > rect.Height() ) ? + ((iSourceRect.Height() - rect.Height()) / 2) : 0; + + iSourceRect.Shrink( offsetX, offsetY ); + + // If bitmap is smaller than the drawing area then center the image on it. + iOffset.iX = ( iSourceRect.Width() < rect.Width() ) ? + ((rect.Width() - iSourceRect.Width()) / 2) : 0; + + iOffset.iY = 0; + + // lift the image higher if needed. + if ( iSourceRect.Height() < rect.Height() ) + { + // check if it fits totally above the bubble + TInt height = iImagePlacingArea.iBr.iY - iImagePlacingArea.iTl.iY; + + if ( iSourceRect.Height() < height ) + { + // if it fits then center it above the bubble + iOffset.iY = ( height - iSourceRect.Height() ) / 2; + } + } + } + +// --------------------------------------------------------------------------- +// CTelBubbleCallImage::Draw +// --------------------------------------------------------------------------- +// +EXPORT_C void CTelBubbleCallImage::Draw( const TRect& /*aRect*/ ) const + { + if ( iImage ) + { + CWindowGc& gc = SystemGc(); + + const TPoint topLeft = Rect().iTl; + const TPoint bitmapTopLeft = topLeft + iOffset; + + // if we have y offset then the image wont go under the bubble in any case and so + // no need for masking + if ( iMask && iOffset.iY == 0 ) + { + gc.BitBltMasked( bitmapTopLeft, + iImage, + iSourceRect, + iMask, + EFalse ); + } + else + { + gc.BitBlt( bitmapTopLeft, + iImage, + iSourceRect ); + } + + DrawRoundRect( gc, bitmapTopLeft, iSourceRect.Size() ); + } + } + +// end of file