📄 imageconverterengine.cpp
字号:
/*
* ============================================================================
* Name : CImageConverterEngine from ImageConverterEngine.cpp
* Part of : ImageConverter
* Created : 25.11.2003 by Forum Nokia
* Implementation notes:
* Handles all ICL interaction. Implemented as a separate class/engine
* for the sake of clarity of the example.
* Version :
* Copyright: Nokia Corporation
* ============================================================================
*/
#include "ImageConverterEngine.h"
#include <fbs.h>
#include <ImageConversion.h>
#include <BitmapTransforms.h>
CImageConverterEngine* CImageConverterEngine::NewL(
MConverterController* aController )
{
CImageConverterEngine* self =
new(ELeave) CImageConverterEngine( aController );
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop(); // self
return self;
}
CImageConverterEngine::CImageConverterEngine(
MConverterController* aController ) :
CActive( EPriorityStandard ), iController( aController )
{
}
void CImageConverterEngine::ConstructL()
{
User::LeaveIfError( iFs.Connect() );
iRotator = CBitmapRotator::NewL();
iScaler = CBitmapScaler::NewL();
CActiveScheduler::Add( this );
}
CImageConverterEngine::~CImageConverterEngine()
{
delete iImageEncoder;
delete iImageDecoder; // CImageDecoder must be deleted before the
iFs.Close(); // related RFs is closed,
delete iBitmap; // otherwise a related thread might panic
delete iRotator;
delete iScaler;
}
void CImageConverterEngine::StartToDecodeL( TFileName& aFileName )
{
delete iImageDecoder; iImageDecoder = NULL;
delete iBitmap; iBitmap = NULL;
// create the decoder
iImageDecoder = CImageDecoder::FileNewL( iFs, aFileName );
// create the destination bitmap
iBitmap = new (ELeave) CFbsBitmap();
iBitmap->Create( iImageDecoder->FrameInfo().iOverallSizeInPixels,
iImageDecoder->FrameInfo().iFrameDisplayMode );
// start conversion to bitmap
iState = EDecoding;
iImageDecoder->Convert( &iStatus, *iBitmap );
SetActive();
}
void CImageConverterEngine::StartToEncodeL(
TFileName& aFileName, TUid aImageType, TUid aImageSubType )
{
delete iImageEncoder; iImageEncoder = NULL;
// create the encoder
iImageEncoder = CImageEncoder::FileNewL( iFs, aFileName,
CImageEncoder::EOptionNone, aImageType, aImageSubType );
iState = EEncoding;
iImageEncoder->Convert( &iStatus, *iBitmap );
SetActive();
}
void CImageConverterEngine::DoCancel()
{
if( iState == EDecoding )
iImageDecoder->Cancel();
else if( iState == EEncoding )
iImageEncoder->Cancel();
}
void CImageConverterEngine::RunL()
{
switch( iState )
{
case EDecoding:
{
if( iStatus == KErrNone )
{
iState = EIdle;
iController->NotifyCompletion( KErrNone );
break;
}
else if( iStatus == KErrUnderflow )
{
iImageDecoder->ContinueConvert( &iStatus );
SetActive();
break;
}
}
case EEncoding:
{
iState = EIdle;
iController->NotifyCompletion( iStatus.Int() );
break;
}
case ERotating:
{
iState = EIdle;
iController->NotifyCompletion( iStatus.Int() );
break;
}
case EScaling:
{
iState = EIdle;
iController->NotifyCompletion( iStatus.Int() );
break;
}
default: // some error
{
iState = EIdle;
iController->NotifyCompletion( iStatus.Int() );
}
}
}
void CImageConverterEngine::GetEncoderImageTypesL(
RImageTypeDescriptionArray& aImageTypeArray )
{
CImageEncoder::GetImageTypesL( aImageTypeArray );
}
CFrameInfoStrings* CImageConverterEngine::GetImageInfoL()
{
// notice that the information is returned from the original image
// hence the scaling of the bitmap does not affect the info until
// the bitmap is encoded back to image file and opened again
if( iImageDecoder )
{
return( iImageDecoder->FrameInfoStringsL() );
}
else
{
return( NULL );
}
}
void CImageConverterEngine::RotateL( TDirection aDirection )
{
if( aDirection == EClockwise90 )
{
iRotator->Rotate( &iStatus, *iBitmap,
CBitmapRotator::ERotation90DegreesClockwise );
}
else
{
// 270 clockwise == 90 anticlockwise
iRotator->Rotate( &iStatus, *iBitmap,
CBitmapRotator::ERotation270DegreesClockwise );
}
iState = ERotating;
SetActive();
}
void CImageConverterEngine::ScaleL( TInt aPercent )
{
TReal32 multiplier;
multiplier = aPercent/(TReal32)100.0;
TInt newWidth = (TInt)(iBitmap->SizeInPixels().iWidth * multiplier);
TInt newHeight = (TInt)(iBitmap->SizeInPixels().iHeight * multiplier);
// the maintain aspect ratio is by default set to true
iScaler->Scale( &iStatus, *iBitmap, TSize(newWidth,newHeight) );
iState = EScaling;
SetActive();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -