diff -r 792dfc98fb3b -r 8c55c525d5d7 camerauis/cameraapp/generic/src/cameracontroller/camimagedecoder.cpp --- a/camerauis/cameraapp/generic/src/cameracontroller/camimagedecoder.cpp Fri Mar 12 15:41:04 2010 +0200 +++ b/camerauis/cameraapp/generic/src/cameracontroller/camimagedecoder.cpp Mon Mar 15 12:39:00 2010 +0200 @@ -16,13 +16,12 @@ */ - - #include #include #include // MCameraBuffer #include +#include #include "camlogging.h" #include "camfilesaveutility.h" @@ -79,11 +78,17 @@ delete iDecoder; SetImageData( NULL ); - if(iDecodedBitmap) + if(iDecodedBitmap) { delete iDecodedBitmap; iDecodedBitmap = NULL; } + if ( iDecodedMask ) + { + delete iDecodedMask; + iDecodedMask = NULL; + } + iFs.Close(); PRINT( _L("Camera <= ~CCamImageDecoder") ); } @@ -150,6 +155,67 @@ } +void CCamImageDecoder::StartIconConversionL( TDesC* aFilePath ) + { + PRINT( _L("Camera => CCamImageDecoder::StartConversionL 2") ); + + // Data for CImageDecoder must be available throughout the conversion. + // Need to stop any outstanding operation before deleting the descriptor. + Cancel(); + + PRINT( _L("Camera <> CCamImageDecoder: Creating decoder..") ); + + delete iDecoder; + iDecoder = NULL; + + CImageDecoder::TOptions options = (CImageDecoder::TOptions) (CImageDecoder::EOptionNoDither ); + iDecoder = CImageDecoder::FileNewL( iFs, *aFilePath , options, KImageTypeSVGUid ); + + if( iDecoder->FrameCount() > 0 ) + { + const TFrameInfo& info( iDecoder->FrameInfo() ); + +#ifdef _DEBUG + TSize size = info.iOverallSizeInPixels; + PRINT2( _L("Camera <> CCamImageDecoder: Bmp size(%d,%d)"), size.iWidth, size.iHeight ); + PRINT1( _L("Camera <> CCamImageDecoder: Bmp dispmode(%d)"), info.iFrameDisplayMode ); +#endif + + PRINT( _L("Camera <> CCamImageDecoder: Create bitmap for snapshot..") ); + if( !iDecodedBitmap ) iDecodedBitmap = new (ELeave) CFbsBitmap; + else iDecodedBitmap->Reset(); + + if( !iDecodedMask ) iDecodedMask = new (ELeave) CFbsBitmap; + else iDecodedMask->Reset(); + + TRAPD ( createError, + { + iDecodedBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode ); + iDecodedMask->Create( info.iOverallSizeInPixels, EGray256 ); + } ); + if( KErrNone != createError ) + { + delete iDecodedBitmap; + iDecodedBitmap = NULL; + delete iDecodedMask; + iDecodedMask = NULL; + User::Leave( createError ); + } + + PRINT( _L("Camera <> CCamImageDecoder: start conversion..") ); + iRetryCounter = 0; + iDecoder->Convert( &iStatus, *iDecodedBitmap, *iDecodedMask, 0 ); + SetActive(); + } + else + { + PRINT( _L("Camera <> CCamImageDecoder: No frame provided, leave..") ); + User::Leave( KErrNotFound ); + } + + PRINT( _L("Camera <= CCamImageDecoder::StartConversionL 2") ); + } + // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // @@ -253,7 +319,7 @@ // CImageDecoder has finished using the data, // so we are able to free it. SetImageData( NULL ); - iObserver.ImageDecoded( iStatus.Int(), iDecodedBitmap ); + iObserver.ImageDecoded( iStatus.Int(), iDecodedBitmap, iDecodedMask ); break; } case KErrUnderflow : @@ -298,7 +364,7 @@ SetImageData( NULL ); // Leave has occurred in RunL. // Notify observer with error. - iObserver.ImageDecoded( aError, NULL ); + iObserver.ImageDecoded( aError, NULL, NULL ); PRINT( _L("Camera <= CCamImageDecoder::RunError") ); return KErrNone;