--- 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 <imageconversion.h>
#include <ExifRead.h>
#include <ecam.h> // MCameraBuffer
#include <eikenv.h>
+#include <SvgCodecImageConstants.hrh>
#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;