diff -r 5e5d6b214f4f -r f5911524345e uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp --- a/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp Tue Feb 02 10:12:18 2010 +0200 +++ b/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp Fri Feb 19 22:41:11 2010 +0200 @@ -22,6 +22,7 @@ #include #include +#include // --------------------------------------------------------------------------- // CVIMPSTDetailsImageDecoder::NewL @@ -56,11 +57,7 @@ void CVIMPSTDetailsImageDecoder::ConstructL(const TDesC8& aBitmapData) { iBitmapData = aBitmapData.AllocL(); - User::LeaveIfError( iFs.Connect() ); - iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData ); - TFrameInfo info = iImgDecoder->FrameInfo(); - iBitmap = new ( ELeave ) CFbsBitmap; - User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode )); + User::LeaveIfError( iFs.Connect() ); } // --------------------------------------------------------------------------- @@ -85,6 +82,12 @@ delete iBitmapData; iBitmapData = NULL; } + if (iBitmapScaler) + { + delete iBitmapScaler; + iBitmapScaler = NULL; + } + iFs.Close(); } @@ -93,11 +96,11 @@ // Starts the decoding process // --------------------------------------------------------------------------- // -void CVIMPSTDetailsImageDecoder::Start() +void CVIMPSTDetailsImageDecoder::StartL(TSize aBitmapSize) { - iStatus = KRequestPending; - iImgDecoder->Convert( &iStatus, *iBitmap ); - SetActive(); + iDecoderState = ECcaConvertThumbnailImage; + iBitmapSize = aBitmapSize; + CreateBitmapL(); } // --------------------------------------------------------------------------- @@ -109,9 +112,25 @@ void CVIMPSTDetailsImageDecoder::RunL() { User::LeaveIfError( iStatus.Int() ); - // Ownership of the bitmap is transferred - iHeader.SetBitmap(iBitmap, NULL ); - iBitmap = NULL; + switch ( iDecoderState ) + { + case ECcaConvertThumbnailImage: + { + iDecoderState = ECcaScaleThumbnail; + ScaleBitmapL(); + break; + } + case ECcaScaleThumbnail: + { + // don't delete + // Ownership of the bitmap is transferred + iHeader.SetBitmap(iBitmap, NULL ); + iBitmap = NULL; + } + default: + break; + } + } // --------------------------------------------------------------------------- @@ -124,4 +143,38 @@ iImgDecoder->Cancel(); } +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::ScaleBitmapL +// scaling it to fit to the screen +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::ScaleBitmapL() + { + iBitmapScaler = CBitmapScaler::NewL(); + iBitmapScaler->Scale( &iStatus, *iBitmap, iBitmapSize ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::CreateBitmapL +// creates the bitmap +// --------------------------------------------------------------------------- +// + +void CVIMPSTDetailsImageDecoder::CreateBitmapL() + { + if ( iDecoderState == ECcaConvertThumbnailImage ) + { + iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData, CImageDecoder::EOptionAlwaysThread ); + } + if ( !iBitmap ) + { + TFrameInfo info = iImgDecoder->FrameInfo(); + iBitmap = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode )); + } + iStatus = KRequestPending; + iImgDecoder->Convert( &iStatus, *iBitmap ); + SetActive(); + } // end of file