camerauis/cameraapp/generic/src/cameracontroller/camimagedecoder.cpp
branchRCL_3
changeset 31 8f559c47d7fd
parent 20 38fb6f7eacd5
equal deleted inserted replaced
27:53c8aa5d97a3 31:8f559c47d7fd
    20 #include <ExifRead.h>
    20 #include <ExifRead.h>
    21 #include <ecam.h> // MCameraBuffer
    21 #include <ecam.h> // MCameraBuffer
    22 
    22 
    23 #include <eikenv.h>
    23 #include <eikenv.h>
    24 #include <SvgCodecImageConstants.hrh>
    24 #include <SvgCodecImageConstants.hrh>
       
    25 #include <SVGEngineInterfaceImpl.h>
    25 
    26 
    26 #include "camlogging.h"
    27 #include "camlogging.h"
    27 #include "camfilesaveutility.h"
    28 #include "camfilesaveutility.h"
    28 #include "cambuffershare.h"
    29 #include "cambuffershare.h"
    29 
    30 
    86   if ( iDecodedMask )
    87   if ( iDecodedMask )
    87      {
    88      {
    88      delete iDecodedMask;
    89      delete iDecodedMask;
    89      iDecodedMask = NULL;
    90      iDecodedMask = NULL;
    90      }
    91      }
    91  
    92 
       
    93   delete iSvgEngine;
    92   iFs.Close();
    94   iFs.Close();
    93   PRINT( _L("Camera <= ~CCamImageDecoder") );
    95   PRINT( _L("Camera <= ~CCamImageDecoder") );
    94   }
    96   }
    95 
    97 
    96 // ===========================================================================
    98 // ===========================================================================
   152     }
   154     }
   153 
   155 
   154   PRINT( _L("Camera <= CCamImageDecoder::StartConversionL") );
   156   PRINT( _L("Camera <= CCamImageDecoder::StartConversionL") );
   155   }
   157   }
   156 
   158 
   157 
   159 // ---------------------------------------------------------------------------
   158 void CCamImageDecoder::StartIconConversionL( TDesC* aFilePath )
   160 // CCamImageDecoder::StartIconConversionL
   159   {
   161 // ---------------------------------------------------------------------------
   160   PRINT( _L("Camera => CCamImageDecoder::StartConversionL 2") );
   162 //
   161 
   163 void CCamImageDecoder::StartIconConversionL( TDesC* aFilePath, TSize& aSize )
   162   // Data for CImageDecoder must be available throughout the conversion.
   164     {
   163   // Need to stop any outstanding operation before deleting the descriptor.
   165     PRINT3( _L("Camera => CCamImageDecoder::StartIconConversionL, file:[%S], size:(%d,%d)"),
   164   Cancel();
   166               &(*aFilePath), aSize.iWidth, aSize.iHeight );
   165 
   167 
   166   PRINT( _L("Camera <> CCamImageDecoder: Creating decoder..") );
   168     // Delete any previous bitmaps, if any
   167 
   169     delete iDecodedBitmap,
   168   delete iDecoder;
   170     iDecodedBitmap = NULL;
   169   iDecoder = NULL;
   171     delete iDecodedMask;
   170   
   172     iDecodedMask = NULL;
   171   CImageDecoder::TOptions options = (CImageDecoder::TOptions) (CImageDecoder::EOptionNoDither );
   173     
   172   iDecoder = CImageDecoder::FileNewL( iFs, *aFilePath , options, KImageTypeSVGUid );
   174     // Create bitmap for use while decoding 
   173 
   175     CFbsBitmap* frameBuffer = new (ELeave) CFbsBitmap;
   174   if( iDecoder->FrameCount() > 0 )
   176     CleanupStack::PushL( frameBuffer );
   175     {
   177 
   176     const TFrameInfo& info( iDecoder->FrameInfo() );
   178     TFontSpec spec;
   177 
   179     if ( !iSvgEngine )
   178 #ifdef _DEBUG   
   180         {
   179     TSize size = info.iOverallSizeInPixels;
   181         iSvgEngine = CSvgEngineInterfaceImpl::NewL( frameBuffer, NULL, spec );
   180     PRINT2( _L("Camera <> CCamImageDecoder: Bmp size(%d,%d)"), size.iWidth, size.iHeight );
   182         }
   181     PRINT1( _L("Camera <> CCamImageDecoder: Bmp dispmode(%d)"), info.iFrameDisplayMode );
   183     
   182 #endif
   184     TInt domHandle = KErrNotFound;
   183 
   185     MSvgError* serr = iSvgEngine->PrepareDom( *aFilePath, domHandle );
       
   186     PRINT3( _L("Camera <> prepare svg dom reader, warning:%d, err code:%d, description:[%S]"), 
       
   187                 serr->IsWarning(), serr->ErrorCode(), &(serr->Description()) );
       
   188     if ( serr->HasError() && !serr->IsWarning() )
       
   189         {
       
   190         PRINT1( _L("Camera <> leaving with error:%d"), serr->SystemErrorCode() );
       
   191         User::Leave( serr->SystemErrorCode() );
       
   192         }
       
   193 
       
   194     // create image bitmap
   184     PRINT( _L("Camera <> CCamImageDecoder: Create bitmap for snapshot..") );
   195     PRINT( _L("Camera <> CCamImageDecoder: Create bitmap for snapshot..") );
   185     if( !iDecodedBitmap ) iDecodedBitmap = new (ELeave) CFbsBitmap;
   196     if( !iDecodedBitmap ) iDecodedBitmap = new (ELeave) CFbsBitmap;
   186     else                  iDecodedBitmap->Reset();
   197     else                  iDecodedBitmap->Reset();
   187     
   198 
   188     if( !iDecodedMask ) iDecodedMask = new (ELeave) CFbsBitmap;
   199     if( !iDecodedMask ) iDecodedMask = new (ELeave) CFbsBitmap;
   189     else                iDecodedMask->Reset();
   200     else                iDecodedMask->Reset();
   190 
   201 
   191     TRAPD ( createError, 
   202     TRAPD ( createError, 
   192             {
   203         {
   193             iDecodedBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode );
   204         iDecodedBitmap->Create( aSize, EColor64K );
   194             iDecodedMask->Create( info.iOverallSizeInPixels, EGray256 );
   205         iDecodedMask->Create( aSize, EGray256 );
   195             } );
   206         } );
   196     if( KErrNone != createError )
   207     if( createError )
   197       {
   208       {
       
   209       PRINT1( _L("Camera <> Error while creating bitmaps:%d"), createError );
   198       delete iDecodedBitmap;
   210       delete iDecodedBitmap;
   199       iDecodedBitmap = NULL;
   211       iDecodedBitmap = NULL;
   200       delete iDecodedMask;
   212       delete iDecodedMask;
   201       iDecodedMask = NULL;
   213       iDecodedMask = NULL;
   202       User::Leave( createError );
   214       User::Leave( createError );
   203       }
   215       }
   204 
   216 
   205     PRINT( _L("Camera <> CCamImageDecoder: start conversion..") );
   217     // create soft mask
   206     iRetryCounter = 0;
   218     iSvgEngine->SetViewportHeight((CSvgDocumentImpl *)domHandle, aSize.iHeight);
   207     iDecoder->Convert( &iStatus, *iDecodedBitmap, *iDecodedMask, 0 );
   219     iSvgEngine->SetViewportWidth((CSvgDocumentImpl *)domHandle, aSize.iWidth);
   208     SetActive();
   220 
   209     }
   221     // render svg image
   210   else
   222     serr = iSvgEngine->RenderDom( domHandle, iDecodedBitmap, iDecodedMask );
   211     {
   223     PRINT3( _L("Camera <> render svg, warning:%d, err code:%d, description:[%S]"), 
   212     PRINT( _L("Camera <> CCamImageDecoder: No frame provided, leave..") );
   224                 serr->IsWarning(), serr->ErrorCode(), &(serr->Description()) );
   213     User::Leave( KErrNotFound );    
   225     if ( serr->HasError() && !serr->IsWarning() )
   214     }
   226         {
   215 
   227         PRINT1( _L("Camera <> leaving with error:%d"), serr->SystemErrorCode() );
   216   PRINT( _L("Camera <= CCamImageDecoder::StartConversionL 2") );
   228         User::Leave( serr->SystemErrorCode() );
   217   }
   229         }
       
   230 
       
   231     CleanupStack::PopAndDestroy( frameBuffer );
       
   232     if ( !IsActive() )
       
   233         {
       
   234         SetActive();
       
   235         }
       
   236 
       
   237     PRINT( _L("Camera <= CCamImageDecoder::StartIconConversionL") );
       
   238     }
       
   239 
   218 
   240 
   219 // ---------------------------------------------------------------------------
   241 // ---------------------------------------------------------------------------
   220 // ---------------------------------------------------------------------------
   242 // ---------------------------------------------------------------------------
   221 //
   243 //
   222 TDesC8*
   244 TDesC8*
   316     {
   338     {
   317     case KErrNone :
   339     case KErrNone :
   318       {
   340       {
   319       // CImageDecoder has finished using the data,
   341       // CImageDecoder has finished using the data,
   320       // so we are able to free it.
   342       // so we are able to free it.
       
   343       if ( iSvgEngine )
       
   344           {
       
   345           iSvgEngine->Destroy();
       
   346           delete iSvgEngine;
       
   347           iSvgEngine = NULL;
       
   348           }
   321       SetImageData( NULL );
   349       SetImageData( NULL );
   322       iObserver.ImageDecodedL( iStatus.Int(), iDecodedBitmap, iDecodedMask );
   350       iObserver.ImageDecodedL( iStatus.Int(), iDecodedBitmap, iDecodedMask );
   323       break;
   351       break;
   324       }
   352       }
   325     case KErrUnderflow :
   353     case KErrUnderflow :