diff -r 32469d7d46ff -r 4bc7b118b3df activityfw/activitydatabase/hsactivitydbserver/src/activitygraphicfilescaling.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/activityfw/activitydatabase/hsactivitydbserver/src/activitygraphicfilescaling.cpp Fri May 14 16:10:06 2010 +0300 @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2009 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 : + * + */ +#include "activitygraphicfilescaling.h" +#include + + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGraphicsSalingHandler::CGraphicsSalingHandler(MImageReadyCallBack &aNotify, + const TSize &aNewSize, + TKindOfScaling aKindOfScaling): + CActive(EPriorityNormal), + mNotify(aNotify), + mNewSize(aNewSize), + mKindOfScaling(aKindOfScaling), + mCurrentOperation(ENone) +{ +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGraphicsSalingHandler::~CGraphicsSalingHandler() +{ + Cancel(); + delete mBitmapFromFile; + delete mBitmapOutput; + delete mImageDecoder; + delete mBitmapScaler; +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGraphicsSalingHandler* CGraphicsSalingHandler::NewL(MImageReadyCallBack &aNotify, + RFs &aFs, + const TDesC &aFileName, + const TDesC8& aMimeType, + const TSize &aNewSize, + TKindOfScaling aKindOfScaling) +{ + CGraphicsSalingHandler *self = CGraphicsSalingHandler::NewLC(aNotify, + aFs, + aFileName, + aMimeType, + aNewSize, + aKindOfScaling); + CleanupStack::Pop(); + return self; +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +CGraphicsSalingHandler* CGraphicsSalingHandler::NewLC(MImageReadyCallBack &aNotify, + RFs &aFs, + const TDesC &aFileName, + const TDesC8& aMimeType, + const TSize &aNewSize, + TKindOfScaling aKindOfScaling) +{ + CGraphicsSalingHandler *self = new (ELeave) CGraphicsSalingHandler(aNotify, + aNewSize, + aKindOfScaling); + CleanupStack::PushL(self); + self->ConstructL(aFs, aFileName, aMimeType); + return self; +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CGraphicsSalingHandler::ConstructL(RFs &aFs, const TDesC &aFileName, const TDesC8& aMimeType) +{ + CActiveScheduler::Add(this); + + if (aFileName.Length() == 0 + || aFs.IsValidName(aFileName) == EFalse) { + User::Leave(KErrPathNotFound); + } + + mBitmapScaler = CBitmapScaler::NewL(); + mBitmapScaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality); + + // convert *.png to bitmap + mImageDecoder = CImageDecoder::FileNewL(aFs, aFileName, aMimeType); + mBitmapFromFile = new(ELeave)CFbsBitmap(); + const TFrameInfo frameInfo(mImageDecoder->FrameInfo(0)); + User::LeaveIfError(mBitmapFromFile->Create(frameInfo.iOverallSizeInPixels, + frameInfo.iFrameDisplayMode)); + + mImageDecoder->Convert(&iStatus, *mBitmapFromFile, 0); + mCurrentOperation = EConvertBitmapFromFile; + SetActive(); +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CGraphicsSalingHandler::DoCancel() +{ + switch (mCurrentOperation) { + case EConvertBitmapFromFile: + mImageDecoder->Cancel(); + break; + case EScale: + mBitmapScaler->Cancel(); + break; + } + mNotify.ImageReadyCallBack(KErrCancel, 0); +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CGraphicsSalingHandler::RunL() +{ + if(iStatus.Int()){ + mNotify.ImageReadyCallBack(iStatus.Int(), 0); + return; + } + + switch (mCurrentOperation) { + case EConvertBitmapFromFile: { + delete mImageDecoder; + mImageDecoder = 0; + + mBitmapOutput = new (ELeave)CFbsBitmap(); + User::LeaveIfError(mBitmapOutput->Create(Scaling(), mBitmapFromFile->DisplayMode())); + mBitmapScaler->Scale(&iStatus, *mBitmapFromFile, *mBitmapOutput, EFalse); + mCurrentOperation = EScale; + SetActive(); + break; + } + case EScale: { + mCurrentOperation = ENone; + + delete mBitmapScaler; + mBitmapScaler = 0; + + delete mBitmapFromFile; + mBitmapFromFile = 0; + + mNotify.ImageReadyCallBack(iStatus.Int(), mBitmapOutput); + break; + } + } +} + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TSize CGraphicsSalingHandler::Scaling() +{ + TSize originalSize = mBitmapFromFile->SizeInPixels(); + float widthFactor = mNewSize.iWidth / (float)originalSize.iWidth; + float heightFactor = mNewSize.iHeight / (float)originalSize.iHeight; + TSize retSize(mNewSize); + if (mKindOfScaling == CGraphicsSalingHandler::EKeepAspectRatio) { + retSize = (widthFactor < heightFactor) ? + TSize(mNewSize.iWidth, widthFactor * originalSize.iHeight) : + TSize(heightFactor * originalSize.iWidth, mNewSize.iHeight); + } else if (mKindOfScaling == CGraphicsSalingHandler::EKeepAspectRatioByExpanding) { + retSize = (widthFactor < heightFactor) ? + TSize(heightFactor * originalSize.iWidth, mNewSize.iHeight) : + TSize(mNewSize.iWidth, widthFactor * originalSize.iHeight); + } + return retSize; +} +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +TInt CGraphicsSalingHandler::RunError(TInt aError) +{ + mNotify.ImageReadyCallBack(aError, 0); + return KErrNone; +}